Ansible roles — следующий уровень абстракции после playbooks. Используется в инсталяциях с большим количеством серверов в корпоративной среде.
Ansible roles — создание ролей
Роли применимы когда используется очень большое количество серверов, управлять которыми написав один playbook становится сложно. Роли позволяют отдавать команды различным группам машин разделяя их по выполняемой функции.
![Ansible roles](https://server-gu.ru/wp-content/uploads/2023/05/aan-1.png)
Например, на 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 с командами, которые используются чаще всего.