в ansible, debian, ubuntu

Знакомство с Ansible. Часть 2: разбор вывода playbook

ansible
В предыдущей статье мы успешно установили и проверили работоспособность системы управления конфигурациями Ansible, а так же написали и выполнили первый набор инструкций (playbook). Давайте разберемся с результатами его выполнения!

ansible-playbook install_nginx.yml 

PLAY [test] ****************************************************************** 

GATHERING FACTS *************************************************************** 
ok: [test-1]
ok: [test-2]

TASK: [Install package nginx] ************************************************* 
changed: [test-1]
changed: [test-2]

TASK: [Starting service nginx] ************************************************ 
ok: [test-1]
ok: [test-2]

PLAY RECAP ******************************************************************** 
test-1                 : ok=3    changed=1    unreachable=0    failed=0   
test-2                 : ok=3    changed=1    unreachable=0    failed=0   

GATHERING FACTS — это первая задача, которая по умолчанию присутствует в любом наборе инструкций. Как видим из названия задачи, ее цель — сбор метаданных об удаленных хостах в форме переменных (например ip-адреса, имени хоста, установленной ОС). Полученные данные могут быть использованы в следующих задачах, описанных в playbook.

Посмотреть переменные и их значения можно командой:

ansible -m setup test

Дальше в выводе следуют задачи, описанные в секции task: набора инструкций и результаты их выполнения:

  • TASK: [Install package nginx] — установка web-сервера nginx;
  • TASK: [Starting service nginx] — запуск web-сервера nginx.

Первая задача выполнена с изменениями, о чем свидетельствует состояние changed — все верно, раньше web-сервера nginx в системе не было, теперь он установлен.

Вторая задача выполнена без изменений, так как web-сервер nginx автоматически запускается после установки.

Для сравнения результатов вывода, запустим данный набор инструкций еще раз:

ansible-playbook install_nginx.yml 

PLAY [test] ****************************************************************** 

GATHERING FACTS *************************************************************** 
ok: [test-1]
ok: [test-2]

TASK: [Install package nginx] ************************************************* 
ok: [test-1]
ok: [test-2]

TASK: [Starting service nginx] ************************************************ 
ok: [test-1]
ok: [test-2]

PLAY RECAP ******************************************************************** 
test-1                 : ok=3    changed=0    unreachable=0    failed=0   
test-2                 : ok=3    changed=0    unreachable=0    failed=0 

Видим, что результаты выполнения задачи Install package nginx отличаются от предыдущего запуска playbook.

Последняя секция в выводе результатов выполнения набора инструкций — PLAY RECAP. Здесь присутствуют четыре параметра:

  • ok — количество выполняемых задач (включая задачу GATHERING FACTS);
  • changed — количество измененных состояний на удаленном хосте;
  • unreachable — количество хостов, которые были недоступны по время выполнения набора инструкций;
  • failed — количество невыполненных задач на удаленном хосте.
    Подробности выполнения набора инструкций (playbook) можно увидеть с помощью вывода отладочной информации одного из трех доступных уровней (-v, -vv и -vvv соответственно).

Также для отладки часто выводят переменные, полученные с удаленных хостов при выполнении задачи GATHERING FACTS, для этого достаточно в playbook добавить такую задачу:

...
- name: Debug
    debug: msg={{ ansible_distribution }}

Результатом выполнения такого набора инструкций будет:

ansible-playbook debug.yml 

PLAY [test] ****************************************************************** 

GATHERING FACTS *************************************************************** 
ok: [test-1]
ok: [test-2]

TASK: [Debug] ***************************************************************** 
ok: [test-1] => {
    "msg": "Ubuntu"
}
ok: [test-2] => {
    "msg": "Ubuntu"
}

PLAY RECAP ******************************************************************** 
test-1                 : ok=2    changed=1    unreachable=0    failed=0   
test-2                 : ok=2    changed=1    unreachable=0    failed=0   

Запустить только конкретную задачу из playbook можно командой:

ansible-playbook debug.yml --step --start-at-task="Debug"

Весьма полезной является возможность вызывать набор инструкций из другого набора инструкций. Хороший пример — обновление установленных пакетов в ОС. Для этого создадим playbook update_os.yml со следующим содержанием:

---
  tasks:

  - name: Update
    apt: update_cache=yes
  - name: Upgrade
    apt: upgrade=full

Этот playbook можно включить как задачу в набор инструкций install_nginx.yml, который мы создавали в предыдущей статье:

---
- hosts: test
  tasks:

  - include: update_os.yml

  - name: Install nginx package
    apt: name=nginx update_cache=yes
    sudo: yes

  - name: Starting nginx service
    service: name=nginx state=started
    sudo: yes

И теперь, перед установкой web-сервера nginx на удаленных хостах будут обновлены установленные пакеты.

В следующей статье рассмотрим использование условий и переменных в наборах инструкций.

Добавить комментарий

  1. {{ ansible_distribution }} — что указывается в таких скобках, и как это определить, что в них писать?

    И можно ли не указывать хост в самом плейбуке, а указать его потом, при вызове плейбука?

    • Спасибо за комментарий!
      В двойных фигурных скобках указываются переменные, подробнее о них можно почитать здесь https://letsclearitup.com.ua/ubuntu/znakomstvo-s-ansible-chast-3-peremennyie.html

      Конкретно в этом примере в переменную ansible_distribution будет внесено имя дистрибутива, установленного на хосте, с которым вы работаете.

      Да, хост можно не указывать в самом плейбуке, выглядеть это будет примерно так:

      ansible-playbook —limit «хост» плейбук.yml

  2. «задача GATHERING FACTS»
    На скільки я розумію, цю задачу перейменували чи шо в новій версії Ansible
    В будь-якому випадку зараз завжди першою стартує TASK [setup]

    • так, в новій версії Ansible першим стартує модуль setup, який і збирає всю інформацію (факти). Його можна запускати окремо:

      $ ansible localhost -m setup
      localhost | SUCCESS => {
      «ansible_facts»: {
      «ansible_all_ipv4_addresses»: [
      «127.0.0.1»
      «192.168.0.84»
      ],
      (інші факти)
      }

  3. Щодо playbook update_os.yml


    — name: Update & upgrade packages # В назві є є upgrade, але фактично йде лише оновлення кеша apt
    apt: update-cache=yes state=latest # по ідеї для upgrade треба upgrade=yes|safe|full|dist
    sudo: yes #Цей параметр вже deprecated. Треба юзати become: yes.

    • знову вірно!
      насправді update_os.yml у мене виглядає так:

      — hosts: all
      sudo: true
      tasks:

      — name: Update
      apt: update_cache=yes
      — name: Upgrade
      apt: upgrade=full

      Дякую, виправив.
      А ось щодо sudo: yes — в мене це чудово спрацьовує, бо версія ansible не найновіша:
      ansible —version
      ansible 1.9.4

    • обновив ansible до версії 2.1.1.0

      одразу помітив:
      [DEPRECATION WARNING]: Instead of sudo/sudo_user, use become/become_user and make sure become_method is ‘sudo’ (default).
      This feature will be removed in a future release.
      Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.

      Ще раз дякую!

  4. Щодо цього «Примечание. Запустить только конкретную задачу из playbook можно командой:

    ansible-playbook debug.yml —start-at-task=»Debug»»

    аргумент —start-at-task запускає плейбук з вказаного task-а, але він стартує з цієї задачі і йде далі, а не виконує лише цю конкретну задачу, як було вказано
    Просто в нашому випадку Debug знаходить в кінці, тому playbook і стопається після її виконання. Спробуйте її на початок поставити 🙂

    Для запуску лише 1 задачі нагуглив використання tags: для задачі, або запуск playbook-а з параметром —step
    ansible-playbook install_nginx.yml —step —start-at-task «Debug»