Анзибль-плейбуки
Что такое Ansible Playbook | Как работать с Ansible Playbooks
В последней статье мы обсуждали специальные команды Ansible. Все, что мы там узнали, будет применено в этой статье, но по-другому. В этом руководстве объясняется, что такое Playbook в Ansible и как работать с Ansible Playbooks с примерами.
Что такое Ansible Playbook?
Книга воспроизведения – это файл YAML, который используется для выполнения одной или нескольких задач на управляемых хостах в среде.
Основное различие между специальными командами и сборниками сценариев заключается в том, что с помощью специальных команд вы можете создавать простые однострочные команды или использовать специальную команду в сценариях оболочки для выполнения простых задач. Если вы хотите выполнять сложные повторяющиеся операции, вам следует писать сборники сценариев, хранить их в центральном репозитории и использовать при необходимости.
Предположим, вы являетесь частью команды системных администраторов. Всякий раз, когда создается новый сервер, ваша команда несет ответственность за усиление защиты сервера в соответствии с политикой вашей компании.
В этом случае вы можете создать сборник сценариев и усилить защиту сервера. Теперь тот же сценарий можно использовать для N новых хостов, которые необходимо усилить.
Моя структура Ansible Lab
Я собираюсь использовать лабораторию ansible, созданную с двумя узлами Ubuntu 20.04LTS. При необходимости вы можете обратиться к следующей статье, чтобы воспроизвести ту же лабораторную настройку.
Автоматическая установка Ansible Lab с Vagrant и Virtualbox в Linux
Создайте свой первый сборник сценариев Ansible
Как я уже говорил ранее, Playbooks написаны в формате YAML. Книга воспроизведения должна иметь расширение .yml
или .yaml
. Если вы хотите узнать о YAML, перейдите по ссылке ниже.
Учебное пособие по YAML | Начало работы с YAML
Ниже приведен пример сборника сценариев, который я собираюсь использовать, чтобы продемонстрировать, как он работает. Это простой сценарий, который позаботится о настройке пользовательского баннерного сообщения при входе на узел.
- name: First Play - Modify banner message
hosts: ubuntu2
gather_facts: false
become: yes
tasks:
- name: Remove Execute Permission from /etc/update-motd.d/*
file:
path: /etc/update-motd.d/
mode: u=rw,g=rw,o=rw
recurse: yes
- name: ADD BANNER MESSAGE
copy:
content: "Welcome to OSTechnix"
dest: /etc/motd
Давайте рассмотрим каждый раздел этой книги. Книга игр разделена на два раздела. Первый раздел содержит определения воспроизведения, такие как имя воспроизведения, целевые хосты и повышение привилегий.
- имя. У книги воспроизведения должно быть имя воспроизведения, которое представляет собой не что иное, как логическую группировку целевого хоста, параметров и задач. В книге пьес может быть более одной пьесы. Дайте описательное название пьесе.
- хосты – целевые хосты. Ansible проверит файл инвентаризации и проверит, доступно ли значение, указанное в хостах, в файле инвентаризации.
- become — если установлено значение да, задача будет запущена с привилегиями sudo. Поскольку я изменяю разрешение в каталоге
/etc/
, задачу следует отправлять с повышенными привилегиями.
Прочтите нашу подробную статью о повышении привилегий, чтобы понять это подробно.
Аутентификация Ansible SSH и повышение привилегий
Определения игры
Во втором разделе определяются задачи. Для определения задачи следует использовать ключевое слово "задачи". Здесь я создал две задачи. Каждой задаче должно быть присвоено имя с использованием ключевого слова "имя".
- Первая задача удалит разрешение на выполнение из каталога
/etc/update-motd.d/*
. Для этого я использую модуль file. - Вторая задача запишет строку "Добро пожаловать в OSTechnix" в файл
/etc/motd
с помощью модуля copy.
Пособие — Задачи
Прежде чем запускать сборник сценариев, позвольте мне проверить состояние моего целевого узла (managed2.anslab.com), войдя в него. Вы можете видеть, что когда я вхожу в узел, я получаю баннерное сообщение по умолчанию и разрешение на выполнение установлено для всех файлов.
ssh vagrant@managed2.anslab.com
Состояние по умолчанию — узел Managed2
Чтобы выполнить книгу воспроизведения, выполните следующую команду из терминала.
ansible-playbook <playbook-name> # SYNTAX
ansible-playbook banner_mod.yml
Воспроизведение вывода
Давайте попробуем понять вывод.
1. Когда вы запускаете книгу воспроизведения, первое, что вы увидите, — это название игры.
PLAY [Modify banner message] *************************************************
2. Первая задача ansible — Сбор фактов. Мы не определили эту задачу в нашей книге, но она будет выполняться, если вы ее не отключите.
TASK [Gathering Facts] *******************************************************
ok: [managed2]
3. Теперь задача, которую вы определили в файле YAML как часть воспроизведения, начнет выполняться одна за другой. Ansible будет читать плейбук сверху вниз, поэтому задачи будут выполняться в порядке, определенном в плейбуке.
TASK [Remove Execute Permission from /etc/update-motd.d/*] *******************************************************************************************
changed: [managed2]
TASK [ADD BANNER MESSAGE] ****************************************************************************************************************************
changed: [managed2]
4. Как только все задачи будут выполнены, у вас будет отчет об игре, в котором будет указано общее количество статусов различных задач. В нашем случае всего было выполнено три задачи (ok=3), включая сбор фактов, и только две задачи (changed=2) внесли изменения в управляемый узел.
PLAY RECAP ******************************************
managed2 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Теперь я могу проверить управляемый узел и убедиться, что изменения применяются успешно.
Подтвердить результат
Отключить сбор фактов
Как было предсказано в предыдущем разделе, когда вы запускаете сборник сценариев, ansible будет собирать факты об управляемых узлах, запуская модуль настройки. Вы можете отключить сбор фактов, добавив следующую строку в playbook.
gather_facts : false
Отключить сбор фактов
Теперь, когда вы снова запустите playbook, вы увидите только две задачи, определенные в playbook. Поскольку Ansible идемпотентен, он не будет пытаться изменить состояние объекта, если оно уже изменено. Таким образом, вы увидите результат ОК.
Отключен сбор фактов — вывод
Сбор фактов замедлит игру, если вам придется запускать пьесу против большого количества хостов. Это связано с тем, что ansible должен подключаться к управляемому узлу и собирать много данных об узле, что не обязательно во всех случаях.
Вы можете проверить разницу во времени выполнения с фактами и без них ниже.
time ansible-playbook banner_mod.yml # WITHOUT FACTS
real 0m1.642s
user 0m0.731s
sys 0m0.220s
time ansible-playbook banner_mod.yml # WITH FACTS
real 0m2.547s
user 0m1.139s
sys 0m0.187s
Выполнить несколько игр
В книге пьес может быть более одной пьесы. Как вы можете видеть на изображении ниже, в моей второй игре есть одна задача: перезапустить службу sshd
с использованием модуля service на другом хосте.
Определения нескольких игр
- name: Second Play - Restart SSHD service
hosts: ubuntu1
gather_facts: false
become: yes
tasks:
- name: Restart SSHD in managed1.anslab.com
service:
name: sshd
state: restarted
Давайте снова запустим playbook, и вы увидите, что обе пьесы выполнены успешно.
ansible-playbook banner_mod.yml
Выполнить несколько игр
Теперь вы должны иметь четкое представление о том, как написать сценарий и выполнить его. Playbook поддерживает дополнительные полезные функции, которые мы увидим в следующем разделе.
Проверка синтаксиса Playbook
Вы можете использовать флаг --syntax-check
, чтобы проверить наличие синтаксических ошибок в вашей книге воспроизведения. Я намеренно допустил синтаксическую ошибку в строке "gather_facts" в своем учебнике.
ansible-playbook --syntax-check banner_mod.yml
Проверка синтаксиса Playbook
Запрос подтверждения
Когда вы используете флаг --step
, для каждой задачи в вашей игре будет запрашиваться подтверждение для продолжения выполнения задачи.
ansible-playbook --step banner_mod.yml
Запрос подтверждения
Выполнить пробный прогон
Вместо выполнения задач на управляемых узлах вы можете смоделировать запуск, используя флаг -C
или --check
.
ansible-playbook -C banner_mod.yml
Начните с конкретной задачи
У вас есть возможность запустить плейбук из определенной задачи. На изображении ниже вы можете видеть, что я начал с Play2 (задача1), поэтому обе задачи в play1 пропускаются. Используйте флаг --start-at-task
и передайте имя задачи в качестве аргумента.
ansible-playbook banner_mod.yml --start-at-task "Restart SSHD in managed1.anslab.com"
Выполнить из конкретной задачи
Запуск задачи с использованием тегов
Вы можете группировать игры и задания с помощью тегов. Используя теги, вы можете запускать только задачи с определенными тегами или пропускать задачи.
Вы можете взглянуть на изображение ниже, где я использовал ключевое слово "tags" и установил для него некоторые значения. Вы также можете добавить несколько значений в один тег.
Теги
Вы можете запустить следующую команду, чтобы получить список задач вместе с их тегами.
ansible-playbook banner_mod.yml --list-tasks
ansible-playbook banner_mod.yml --list-tags
Список задач и тегов
Используйте флаг -t
и передайте имена тегов в качестве аргумента. Вы можете запустить конкретную задачу на основе тегов или несколько тегов, как показано ниже. В приведенном ниже примере я использую два разных тега из двух разных пьес.
ansible-playbook -t "set_perm","restart service" banner_mod.yml
Запуск задач на основе тегов
Вы также можете пропустить задачу и запустить все остальные задачи, используя флаг --skip-tags
.
ansible-playbook -t "set_perm","restart service" --skip-tags "set_perm" banner_mod.yml
Пропускать задачи на основе тегов
Увеличение многословности
Иногда сборник сценариев ведет себя не так, как вы ожидаете. Это может быть что-то, что происходит в фоновом режиме, или другие ошибки.
Чтобы устранить проблему, вы можете увеличить подробность (-v) при запуске книги воспроизведения. Существует четыре уровня многословия. Вы можете установить уровень детализации либо в файле ansible.cfg
, добавив свойство «verbosity=
-v
. или переменная среды ANSIBLE_VERBOSITY.
ansible-playbook -vvvv -t "set_perm","restart service" --skip-tags "set_perm" banner_mod.yml # VERBOSE LEVEL SET TO 4(-vvvv)
ANSIBLE_VERBOSITY=4 ansible-playbook -vvvv -t "set_perm","restart service" --skip-tags "set_perm" banner_mod.yml # VERBOSE LEVEL SET TO 4(ENV VARIABLE)
Подробный вывод
Параллелизм управления
Когда вы запустите playbook, ansible будет выполнять задачу пакетно. По умолчанию ansible будет выполнять задачу на 5 узлах параллельно, и как только вся задача будет завершена на всех 5 узлах, она перейдет к следующему набору из 5 узлов.
Аналогично, задача будет выполняться партиями по 5, пока задача не будет завершена во всех узлах, а затем перейдет к следующей задаче и повторит тот же шаг.
Вы можете управлять параллелизмом и указывать, сколько узлов должно обрабатываться параллельно, задав параметр "forks" в файле ansible.cfg
.
[defaults]
inventory = inventory
host_key_checking = False
forks=20
Я установил значение forks равным 20. Теперь задача будет обрабатываться на 20 узлах параллельно. Аналогичным образом вы можете увеличить/уменьшить количество в зависимости от ваших требований.
Вы можете переопределить значение, установленное в файле ansible.cfg
, передав флаг -f
или --forks
. Когда я запускаю следующую команду, значение вилки 20 будет заменено на 15.
ansible-playbook banner_mod.yml -f 15
Заключение
В этой статье мы увидели, как писать плейбуки Ansible, а также различные параметры и опции, поддерживаемые в плейбуках. Существует множество других функций, таких как переменные, условия, циклы и т. д., которые можно использовать в сборниках сценариев, о которых мы расскажем в наших следующих статьях.
Читать далее:
- Как использовать переменные в Ansible Playbooks