Автоматизируем и ускоряем процесс настройки облачных серверов с Ansible. Часть 2: вывод, отладка, и повторное использование playbook

В предыдущей статье мы начали изучение Ansible, популярного инструмента для автоматизации настройки и развертывания ИТ-инфраструктуры. Ansible был успешно установлен в InfoboxCloud, описаны принципы работы, базовая настройка. В завершении статьи мы показали как быстро установить nginx на несколько серверов.Ansible InfoboxCloudВ этой статье мы продолжим изучение Ansible: разберем вывод playbook, научимся отлаживать их и разделять для удобства повторного использования.Управление конфигурациямиРазбор нашего первого playbook В прошлой статье мы получили вывод от исполнения нашего первого playbook. Давайте разберем его.00925e403af9b9d90d1d9be950336230.jpg

Gathering facts — это первая задача по умолчанию в любом playbook. Задача собирает полезные метаданные о серверах в форме переменных, которые могут использоваться в playbook в дальнейшем. Например, такими переменными может быть ip–адрес, архитектура ОС и имя хоста.Можно посмотреть эти переменные, используя команду:

ansible -m setup experiments , где experiments — название секции в вашем inventory.или записать ее в файл ansible -m setup experiments >> facts Ниже в выводе указаны задачи TASK, согласно ходу выполнения playbook: установка nginx, запуск сервиса.Давайте запустим выполнение playbook повторно.

ansible-playbook playbooks/setup_nginx.yml 4129c9e56b4d4ae537455c7509dd6046.jpgПо сравнению с предыдущим выводом задача Install nginx package выполнена без изменений. Состояние уже достигнуто: nginx установлен. Задача старта сервиса nginx в обоих случаях выполнена без изменений, так как сервис nginx стартует сам сразу после установки. Если остановить сервис nginx на одном из серверов вручную, после запуска playbook он поднимется.

8fd312d67350ffb83ba3669033208f77.jpg

Как мы видим, выполняется одно из ключевых свойств систем Ansible: Идемпотентность (операция, которая если применяется к любому значению несколько раз — всегда получается то же значение, как и при однократном применении). Большинство систем управления конфигурациями следуют этому принципу и применяют его на инфраструктуру.

Давайте посмотрим на секцию PLAY RECAP ниже в выводе. Параметр changed показывает, сколько раз в задачах менялось состояние сервера. ok — количество исполняемых задач вместе с Gathering facts.

Oтладка playbook Понимать, что случилось при исполнении playbook, бывает очень полезно для исправления ошибок.Есть 3 уровня вывода отладочной информации (Verbose).-v. Вывод базовой информации.

ansible-playbook playbooks/setup_nginx.yml -v 49ed85b29434c3dbb2e92af6cb40b5c3.jpg-vv. Более подробный вывод.

ansible-playbook playbooks/setup_nginx.yml -vv c9cb0718050aa41365da85ccb075d3aa.jpg-vvv. Самый подробный вывод.В этом выводе указаны SSH–команды, которые Ansible использует для создания временных файлов на удаленном хосте для запуска скрипта удаленно.

ansible-playbook playbooks/setup_nginx.yml -vvv 6acc8f7bd7389d92f0428dcd6b0c39c4.jpgМожно выводить любые переменные ansible для отладки. Для этого добавьте в playbook следующую секцию:

 — name: Debug debug: msg={{ ansible_distribution }} При запуске playbook вы увидите вывод этой переменной. Каждая переменная Ansible начинается с префикса ansible_.6b19c967987c1616ffc54072f42eb63e.jpg

Еще одна полезная команда — возможность посмотреть на все задачи, выполняющиеся в playbook. Она особенно полезна, когда есть несколько playbook, исполнающих другие playbook.

ansible-playbook playbooks/setup_nginx.yml --list-tasks 060f9e19dc4c86b006ed48e00c14b49c.jpgМожно исполнить только конкретную задачу из playbook:

ansible-playbook playbooks/setup_nginx.yml --start-at-task=«Debug» 3b780062849766b473bcdbb73160c627.jpgПовторное использование в Playbook Если задача или набор задач часто используется вами — есть смысл оформить ее в виде отдельного файла, который можно будет использовать в других playbook.Создайте папку для повторно используемых задач:

mkdir ~/ansible/playbooks/tasks Давайте создадим задачу обновления ОС в файле ~/ansible/playbooks/tasks/os_update.yml: --- #Update and upgrade apt-based linux  — name: Update and upgrade apt-based Linux apt: update-cache=yes state=latest sudo: yes Tеперь мы можем включить секцию обновления ОС в ~/ansible/playbooks/setup_nginx.yml: ---  — hosts: experiments remote_user: root tasks:

 — include: tasks/os_update.yml

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

 — name: Starting nginx service service: name=nginx state=started sudo: yes Теперь до установки nginx Ubuntu на обслуживаемых серверах из Inventory будет обновлена.Стоит и установку nginx (~/ansible/playbooks/tasks/pgk_nginx_install.yml) вынести в отдельную задачу, если вы часто ставите nginx. --- #Install NGINX package  — name: Install nginx package apt: name=nginx update_cache=yes sudo: yes

 — name: Starting nginx service service: name=nginx state=started sudo: yes В результате наш playbook станет совсем простым: ---  — hosts: experiments remote_user: root tasks:

 — include: tasks/os_update.yml  — include: tasks/pkg_nginx_install.yml Можно написать и задачу для удаления nginx (~/ansible/tasks/pkg_nginx_remove.yml): --- #Remove NGINX package  — name: Stopping nginx service service: name=nginx state=stopped sudo: yes

 — name: Remove nginx package apt: name=nginx state=removed sudo: yes и вызвать ее (~/ansible/playbooks/remove_nginx.yml): ---  — hosts: experiments remote_user: root tasks:  — include: tasks/pkg_nginx_remove.yml ansible-playbook ~/ansible/playbooks/remove_nginx.yml -i ~/ansible/inventory , где через -i указываем путь к файлу inventory, что позволяет нам запускать ansible-playbook не только из папки ansible.В следующей статье мы поговорим о переменных и условиях Ansible. Наконец-то наши playbook будут корректно работать на разных ОС.

Заключение В написании статьи очень помогла книга «Learning Ansible» и конечно официальная документация.Все эксперименты с Ansible удобно делать в InfoboxCloud, так как имеется возможность для каждого виртуального сервера установить именно то количество ресурсов, которое необходимо для задачи (CPU/Ram/диск независимо друг от друга) или использовать автомасштабирование.

Если вы обнаружили ошибку в статье, автор ее с удовольствием исправит. Пожалуйста напишите в ЛС или на почту о ней. Туда же можно задавать вопросы по Ansible для освещения в последующих статьях.

Успешной работы!

© Habrahabr.ru