Одним из основных понятий в 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
, и перейдет к следующей задаче.
Самостоятельная работа
- Создайте в облаке сервер
- Создайте плейбук, в котором опишите установку git для удаленных серверов
Выполните его, зайдите по ssh на один из серверов и убедитесь в том, что git был установлен
git --version git version 2.32.0
Создайте отдельный плейбук, в котором выполняется удаление git. Зайдите по ssh на сервер и проверьте, что Git удален
git --version Command 'git' not found, but can be installed with: apt install git
Залейте изменения на Github
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.