0

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

Свежие комментарии

Подписка

Лучшие статьи


Fatal error: Uncaught Error: Call to a member function have_posts() on null in /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/blog.php:398 Stack trace: #0 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/widgets/latest-posts/widget.php(257): fox56_blog_grid(NULL, Array) #1 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/widgets/latest-posts/register.php(33): include('/home/host18670...') #2 /home/host1867038/the-devops.ru/htdocs/www/wp-includes/class-wp-widget.php(394): Wi_Widget_Latest_Posts->widget(Array, Array) #3 /home/host1867038/the-devops.ru/htdocs/www/wp-includes/widgets.php(845): WP_Widget->display_callback(Array, Array) #4 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/single.php(418): dynamic_sidebar('sidebar') #5 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/single.php(136): fox56_single_sidebar() #6 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/single.php(7): fox56_single_inner() #7 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/single.php(23): fox56_single() #8 /home/host1867038/the-devops.ru/htdocs/www/wp-includes/template-loader.php(106): include('/home/host18670...') #9 /home/host1867038/the-devops.ru/htdocs/www/wp-blog-header.php(19): require_once('/home/host18670...') #10 /home/host1867038/the-devops.ru/htdocs/www/index.php(17): require('/home/host18670...') #11 {main} thrown in /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/blog.php on line 398