HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Одним из основных понятий в Ansible является плейбук. Это просто yaml-файл, в котором мы указываем, какие задачи и на каких серверах будут выполняться. Пример такого файла<em>playbook.yml</em>:</p>
1 <p>Одним из основных понятий в Ansible является плейбук. Это просто yaml-файл, в котором мы указываем, какие задачи и на каких серверах будут выполняться. Пример такого файла<em>playbook.yml</em>:</p>
2 <p>В этом плейбуке на группе хостов<em>webservers</em>выполняются две задачи (таски). Первая - это установка<em>redis-server</em>, и вторая - его удаление. Структура любой задачи такая:</p>
2 <p>В этом плейбуке на группе хостов<em>webservers</em>выполняются две задачи (таски). Первая - это установка<em>redis-server</em>, и вторая - его удаление. Структура любой задачи такая:</p>
3 <ul><li>имя задачи - необязательный параметр, в котором описывается задача. Нужна только для вывода во время выполнения плейбука.</li>
3 <ul><li>имя задачи - необязательный параметр, в котором описывается задача. Нужна только для вывода во время выполнения плейбука.</li>
4 <li>модуль и его параметры - определяет команду, которая будет выполнена на указанной группе серверов. В примере выше это модуль<em>apt</em>, который запускает пакетный менеджер<em>apt</em>входящий в стандартную поставку Ubuntu. С его помощью устанавливаются и удаляются программы.</li>
4 <li>модуль и его параметры - определяет команду, которая будет выполнена на указанной группе серверов. В примере выше это модуль<em>apt</em>, который запускает пакетный менеджер<em>apt</em>входящий в стандартную поставку Ubuntu. С его помощью устанавливаются и удаляются программы.</li>
5 </ul><p>Имя модуля в задачах задается с префиксом<em>ansible.builtin</em>. Ansible позволяет создавать свои модули у которых имена могут совпадать со встроенными модулями. Поэтому разработчики ввели пространства имен, позволяющие избежать неоднозначностей (какой модуль имелся ввиду?).</p>
5 </ul><p>Имя модуля в задачах задается с префиксом<em>ansible.builtin</em>. Ansible позволяет создавать свои модули у которых имена могут совпадать со встроенными модулями. Поэтому разработчики ввели пространства имен, позволяющие избежать неоднозначностей (какой модуль имелся ввиду?).</p>
6 <p>Каждый модуль принимает параметры. В первой задаче три параметра:</p>
6 <p>Каждый модуль принимает параметры. В первой задаче три параметра:</p>
7 <ul><li>name: redis-server - имя пакета.</li>
7 <ul><li>name: redis-server - имя пакета.</li>
8 <li>state: present - состояние, в которое требуется привести модуль. Ansible убедится, что этот пакет есть, либо доустановит его.</li>
8 <li>state: present - состояние, в которое требуется привести модуль. Ansible убедится, что этот пакет есть, либо доустановит его.</li>
9 <li>update_cache: yes - выполняет команду apt-get update для того, чтобы обновить информацию о пакетах в индексе. Во второй задаче обновлять индекс не требуется. Достаточно указать состояние state: absent, чтобы Ansible просто удалил redis-сервер.</li>
9 <li>update_cache: yes - выполняет команду apt-get update для того, чтобы обновить информацию о пакетах в индексе. Во второй задаче обновлять индекс не требуется. Достаточно указать состояние state: absent, чтобы Ansible просто удалил redis-сервер.</li>
10 </ul><p>В плейбуке может быть сколько угодно задач, но каждая задача работает только с одним модулем. Будьте внимательны.</p>
10 </ul><p>В плейбуке может быть сколько угодно задач, но каждая задача работает только с одним модулем. Будьте внимательны.</p>
11 <p>Для запуска плейбука используется команда ansible-playbook, которой мы передаем путь к файлу<em>playbook.yml</em>и указываем inventory-файл:</p>
11 <p>Для запуска плейбука используется команда ansible-playbook, которой мы передаем путь к файлу<em>playbook.yml</em>и указываем inventory-файл:</p>
12 <p>При запуске этой команды первая же задача упадет с ошибкой<em>Failed to lock apt for exclusive operation</em>. Из этой ошибки следует, что команда выполняется без прав администратора и не может выполнить установку программ. Чтобы это изменить, можно заходить на сервер под root, что очень часто неприемлемо, и так лучше не делать. Поэтому в Ansible существует механизм переключения пользователя уже внутри. Он называется<em>become</em>. В простейшем случае достаточно прописать become: yes в нужные задачи:</p>
12 <p>При запуске этой команды первая же задача упадет с ошибкой<em>Failed to lock apt for exclusive operation</em>. Из этой ошибки следует, что команда выполняется без прав администратора и не может выполнить установку программ. Чтобы это изменить, можно заходить на сервер под root, что очень часто неприемлемо, и так лучше не делать. Поэтому в Ansible существует механизм переключения пользователя уже внутри. Он называется<em>become</em>. В простейшем случае достаточно прописать become: yes в нужные задачи:</p>
13 <p>По умолчанию become использует sudo и переключает в root, поэтому у вашего пользователя должны быть необходимые права. Если понадобится другой пользователь, то его можно указать в параметре become_user. Естественно необходимо чтобы у вашего пользователя было sudo. Теперь задача отрабатывает. Обновление индекса и установка занимает некоторое время:</p>
13 <p>По умолчанию become использует sudo и переключает в root, поэтому у вашего пользователя должны быть необходимые права. Если понадобится другой пользователь, то его можно указать в параметре become_user. Естественно необходимо чтобы у вашего пользователя было sudo. Теперь задача отрабатывает. Обновление индекса и установка занимает некоторое время:</p>
14 <p>В терминале вывод станет желтым, это обозначает что задачи успешно выполнились.<em>redis-server</em>был установлен и удален с сервера. Если<em>redis-server</em>окажется установлен, то повторной установки не произойдет. Ansible убедится, что state: present, и перейдет к следующей задаче.</p>
14 <p>В терминале вывод станет желтым, это обозначает что задачи успешно выполнились.<em>redis-server</em>был установлен и удален с сервера. Если<em>redis-server</em>окажется установлен, то повторной установки не произойдет. Ansible убедится, что state: present, и перейдет к следующей задаче.</p>