Thank you for reading this post, don't forget to subscribe!
Для сокращения количества задач в наборах инструкций (playbook) разумно использовать циклы. Например, иногда требуется установить несколько пакетов на один и тот же удаленный хост или выполнить несколько операций над одним и тем же ресурсом.
Рассмотрим простой playbook, который поможет установить несколько пакетов на удаленный сервер:
1 2 3 4 5 6 7 8 9 10 11 12 |
--- - hosts: test tasks: - name: Install packages yum: name={{ item }} state=latest with_items: - htop - mytop - wget sudo: yes В результате выполнения данного набора инструкций на удаленном хосте будут установлены пакеты, перечисленные в <code>with_items:</code>. Playbook будет запущен один раз, но модуль <span style="color: #222222; font-family: monospace;"><span style="background-color: #e9ebec;">yum </span></span>будет вызываться для каждого указанного пакета: Создать нескольких пользователей и добавить их в определенные группы можно с помощью такого набора инструкций |
1 2 3 4 5 6 7 8 9 10 11 12 |
--- - hosts: test tasks: - name: Add test users user: name={{ item.name }} state=present groups={{ item.groups }} with_items: - { name: 'user1', groups: 'adm' } - { name: 'user2', groups: 'lpadmin' } sudo: yes <code> Ansible</code> выполняет задачи в порядке их следования в наборе инструкций, но бывают случаи, когда требуется выполнить только часть задач |
Чтобы задачи выполнялись только в определенном случае, можно (и нужно) указывать условия с помощью when:
.
В условиях в Ansible
для сравнения используются ==
(равно), !=
(не равно), >
(больше), <
(меньше), >=
(больше равно), <=
(меньше равно).
Можно также указать несколько условий с помощью операторов and
(и) и or
(или). Для проверки вхождения символа или подстроки
в строку используются операторы in
и not
.
Для проверки работы некоторых условий в Ansible
создадим playbook следующего содержания:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
--- - hosts: test tasks: - name: Check OS family debug: msg="This is my OS" when: ansible_os_family == "Debian" - name: Check if Apache2 is installed command: dpkg-query -W apache2 register: apache2_check - name: Print message if apache installed debug: msg="Apache2 is installed on remote host" when: "'apache2' in apache2_check.stdout" - name: Check if admin logged command: who register: who_check - name: Print message if user admin not logged debug: msg="User admin is not logged on remote host" when: not 'admin' in who_check.stdout |
В архитектуре проекта обычно сервера разделяются по своему предназначению и выполняют определенную роль - web-сервер,
сервер баз данных, почтовый сервер и т. д. Каждому из серверов требуется отличающийся набор пакетов и настроек для правильного
выполнения своей роли. С ростом количества серверов будет расти количество наборов инструкций (playbook), которые будут
использоваться повторно. Ansible
позволяет удобно организовать и структурировать наборы инструкций в соответствии с
ролями серверов. Пример структуры набора инструкций с ролями выглядит так:
1 2 3 4 5 6 7 8 |
--- - hosts: servers roles: - web – db - post |
Путь к каталогу с ролями можно задать с помощью параметра roles_path
в конфигурационном файле Ansible
. При указании ролей можно использовать тэги.
Также для каждой роли будут применяться следующие правила:
- если существует
roles/.../tasks/main.yml
, то задачи из этого файла будут добавлены в набор инструкций; - если существует
roles/.../handlers/main.yml
, то обработчики из этого файла будут добавлены в набор инструкций; - если существует
roles/.../vars/main.yml
, то переменные из этого файла будут добавлены в набор инструкций; - если существует
roles/.../meta/main.yml
, то любые роли-зависимости будут добавлены в список ролей; - задача копирования может ссылаться на файл в
roles/.../files
без указания абсолютного или относительного пути; - скриптовая задача может ссылаться на скрипт в
roles/.../files
без указания абсолютного или относительного пути; - задача шаблонизации может ссылаться на
roles/.../templates
без указания абсолютного или относительного пути; - импортируемые задачи могут ссылаться на файлы в
roles/.../tasks
без указания абсолютного или относительного пути.