Поиск по сайту:

Анзибль-плейбуки

Что такое 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

Статьи по данной тематике