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 с командами, которые используются чаще всего.