Одним из основных понятий в Ansible является плейбук. Это просто yaml-файл, в котором мы указываем, какие задачи и на каких серверах будут выполняться. Пример такого файла playbook.yml:
# На какой группе серверов
- hosts: webservers
tasks:
- name: install redis server
# apt-get update && apt-get install redis-server
ansible.builtin.apt: # имя модуля Ansible
name: redis-server
state: present
update_cache: yes
- name: remove redis server
# apt-get remove redis-server
ansible.builtin.apt:
name: redis-server
state: absent
В этом плейбуке на группе хостов webservers выполняются две задачи (таски). Первая — это установка redis-server, и вторая — его удаление. Структура любой задачи такая:
имя задачи — необязательный параметр, в котором описывается задача. Нужна только для вывода во время выполнения плейбука.
модуль и его параметры – определяет команду, которая будет выполнена на указанной группе серверов. В примере выше это модуль apt, который запускает пакетный менеджер apt входящий в стандартную поставку Ubuntu. С его помощью устанавливаются и удаляются программы.
Имя модуля в задачах задается с префиксом ansible.builtin. Ansible позволяет создавать свои модули у которых имена могут совпадать со встроенными модулями. Поэтому разработчики ввели пространства имен, позволяющие избежать неоднозначностей (какой модуль имелся ввиду?).
Каждый модуль принимает параметры. В первой задаче три параметра:
name: redis-server
— имя пакета.
state: present
— состояние, в которое требуется привести модуль.
Ansible убедится, что этот пакет есть, либо доустановит его.
update_cache: yes — выполняет команду apt-get update для того, чтобы обновить информацию о пакетах в индексе. Во второй задаче обновлять индекс не требуется. Достаточно указать состояние state: absent, чтобы Ansible просто удалил redis-сервер.
В плейбуке может быть сколько угодно задач, но каждая задача работает только с одним модулем. Будьте внимательны.
Для запуска плейбука используется команда ansible-playbook, которой мы передаем путь к файлу playbook.yml и указываем inventory-файл:
# В отличие от ad-hoc режима, группа хостов указывается внутри плейбука
ansible-playbook playbook.yml -i inventory.ini
При запуске этой команды первая же задача упадет с ошибкой Failed to lock apt for exclusive operation. Из этой ошибки следует, что команда выполняется без прав администратора и не может выполнить установку программ. Чтобы это изменить, можно заходить на сервер под root, что очень часто неприемлемо, и так лучше не делать. Поэтому в Ansible существует механизм переключения пользователя уже внутри. Он называется become. В простейшем случае достаточно прописать become: yes в нужные задачи:
- hosts: webservers
tasks:
- name: install redis server
ansible.builtin.apt:
name: redis-server
state: present
update_cache: yes
become: yes # <---
- name: remove redis server
ansible.builtin.apt:
name: redis-server
state: absent
become: yes # <---
По умолчанию become использует sudo и переключает в root, поэтому у вашего пользователя должны быть необходимые права. Если понадобится другой пользователь, то его можно указать в параметре become_user. Естественно необходимо чтобы у вашего пользователя было sudo. Теперь задача отрабатывает. Обновление индекса и установка занимает некоторое время:
TASK [install redis server] *********************************
changed: [157.230.82.133]
TASK [remove redis server] **********************************
changed: [157.230.82.133]
В терминале вывод станет желтым, это обозначает что задачи успешно выполнились. redis-server был установлен и удален с сервера. Если redis-server окажется установлен, то повторной установки не произойдет. Ansible убедится, что state: present, и перейдет к следующей задаче.