Ansible roles — следующий уровень абстракции после playbooks. Используется в инсталяциях с большим количеством серверов в корпоративной среде.
Ansible roles — создание ролей
Роли применимы когда используется очень большое количество серверов, управлять которыми написав один playbook становится сложно. Роли позволяют отдавать команды различным группам машин разделяя их по выполняемой функции.

Например, на web сервера и сервера баз данных. Но функционал значительно шире — роли позволяют использовать совместно множество playbook.
Структура ролей Ansible:
files — файлы, которые копируются на управляемые машины
handlers — обработчики событий
meta — зависимости ролей (например, настройка веб серверов после того как настроены сервера баз данных )
templates — файлы, включающие также динамическое содержимое
tasks — задачи из playbook
vars/group_vars — файлы, в которых объявляются переменные
Создадим каталог проекта
mkdir /etc/ansible/project
В нем будет использоваться следующая структура
tee
group-vars
all
hosts
main.yml
roles
common
handlers
main.yml
tasks
main.yml
templates
ntp.conf
resolve.conf
web
files
index.html
handlers
main.yml
tasks
main.yml
Будет выполняться настройка NTP и DNS. Для этого в файле group-vars/all требуется задать переменные
cat group-vars/all
--- dnsserver: 8.8.8.8 ntpserver: 123.123.123.123
Настройка роли common
Базовая настройка хостов — DNS клиент, служба точного времени.
На клиентские машины будут копироваться два файла ntp.conf и resolve.conf. Задача на копирование задана в файле main.yml в каталоге tasks для роли.
cd roles/common
Основной playbook для данной роли — main.yml.
cat tasks/main.yml
--- - name: configure dns client template: src=resolv.conf dest=/etc/resolv.conf tags: dns - name: install ntp yum: name=ntp state=present tags: ntp - name: copy ntp file template: src=ntp.conf dest=/etc/ntp.conf tags: ntp notify: restart ntp service
Последней строкой указано notify: restart ntp service — это вызов handler из каталога handlers. Подходящий блок в скрипте main.yml каталога ищется по имени, в данном случае — restart ntp service
cat handlers/main.yml
--- - name: restart ntp service service: name=ntpd state=started
В main.yml задано копирование двух шаблонов. Просмотрим один из них.
cat templates/ntp.conf
# Ansible managed file. Dont handedit
driftfile /var/lib/ntp/drift
restrict 127.0.0.1
restrict -6 ::1
server {{ ntpserver }}
keys /etc/ntp/keys
Поскольку это шаблон (template) содержимое не статично, используется {{ ntpserver }}, переменная заменяется на значение, которое для нее задано в group_vars/all
Настройка роли web
Для второй роли шаблоны не используются, только файлы, они полностью статические. Обычно это конфигурационные файлы.
Переходим в каталог роли
cd roles/web
Файл будет содержать одну строку, его Ansible будет копировать на удаленные машины
cat files/index.html
just html
cat tasks/main.yml
---
- name: 1. Install latest version of apache
yum: name={{ item }} state=present
with items:
- httpd
- httpd-tools
- name: 2. copy standart index.html
copy: src=/tmp/index.html dest=/var/www/index.html mode=0664
tags: apache
notify: restart apache service
Таким же образом, как в предыдущем случае вызывается notify, в этот раз handler для restart apache service
cat handlers/main.yml
--- - name: restart apache service service: name=httpd state=started
Файлы конфигурации общие для обеих ролей
В hosts Ansible прописываются IP адреса, доменные имена или псевдонимы управляемых машин
cat hosts
[all] lab1 web1 [webservers] web1
В main.yml задано как выполнять команды, на каких машинах и какие роли применять. Ко всем машинам применяется роль common, для машин, входящих в группу webservers применяется роль web.
cat main.yml
--- - hosts: all tasks: - name: apply common configuration hosts: all user: ansadmin become: yes become_method: sudo tasks: roles: - common - name: install and configure webserver hosts: webservers user: ansadmin become: yes become_method: sudo tasks: roles: - web
Запустить основной playbook можно так:
ansible-playbook main.yml -i hosts
Ключ -i hosts показывает, что использовать нужно hosts для проекта, а не /etc/ansible/hosts
Тэги в Ansible
Чтобы разобраться с тэгами вернемся к одному из файлов, рассмотренных ранее
cat roles/common/tasks/ntp.yml
--- - name: configure dns client template: src=resolv.conf dest=/etc/resolv.conf tags: dns - name: install ntp yum: name=ntp state=present tags: ntp - name: copy ntp file template: src=ntp.conf dest=/etc/ntp.conf tags: ntp notify: restart ntp service
Добавив ключ --tags и значение 'dns' можно выполнить только те команды, которые отмечены в main.yml одноименным тэгом.
ansible-plabook main.yml -i hosts —tags dns
Шпаргалка по Ansible с командами, которые используются чаще всего.
