Ansible roles


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



Ansible roles — создание ролей


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

Ansible roles


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

Сказать спасибо