Ansible: роли (roles) — пример

Автор: | 04/05/2015
 

ansible_logo_black_squareРоли отлично подходят для организации различных, но связанных между собой задач (task), и размещения всех связанных с этими задачами данных в одном месте.

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

В данной статье используются примеры из предыдущей части — Ansible: сценарии (playbook) и обработчики (handler).

Роли имеют свою структуру каталогов, которая выглядит так:

rolename
 - files
 - handlers
 - meta
 - templates
 - tasks
 - vars

Внутри каждой (кроме files и templates) директории — Ansible будет искать и читать файлы main.yml.

На сервере с Ansible cоздаём необходимые каталоги:

$ mkdir -p ~/ansible/roles/nginx
$ cd ~/ansible/roles/nginx
$ mkdir files handlers meta templates tasks vars
$ tree -d -L 1
.
├── files
├── handlers
├── meta
├── tasks
├── templates
└── vars

По факту — не обязательно использовать все директории, и не обязательно все их создавать.

Назначение директорий:

  • files: содержит файлы, которые будут скопированы на настраиваемые хосты; так же — может содержать скрипты, которые позже будут запускаться на хостах;
  • handlers: обработчики, которые будут использоваться при выполнении задач;
  • meta: описание зависимостей, т.е. — ролей, которые должны быть обработаны перед запуском настраиваемой роли и мета-данных, таких как автор, описание продукта и прочее;
  • templates: шаблоны файлов с переменными;
  • tasks: все задачи, которые ранее были описаны в Playbook-е;
  • vars: переменные для шаблонов.

Подготовливаем данные.

Files

Тут мы разместим файл репозитоия NGINXfiles/nginx.repo:

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/6/$basearch/
gpgcheck=0
enabled=1
priority=15

Handlers

В старом Playbook у нас было несколько обработчиков — добавим их сюда.

Создаём файл handlers/main.yml и вписываем в него наши обработчики:

---
    - name: nginx start
      service: name=nginx state=started

    - name: nginx restart
      service: name=nginx state=restarted

Meta

В данном случае зависимостей и мета-данных нет, поэтому — либо можно оставить директорию пустой, либо создать файл meta/main.yml с пустым описанием зависимостей:

---
    dependencies: []

Если же вы захотите добавить роль-зависимость, например — установку PHP-FPM, это можно сделать так:

---
dependencies:
  - { role: phpfpm }

Эмта роль будет выполнена перед выполнение роли nginx.

Template

Создадим шаблон файла настроек для виртуалхоста.

Как и в случае с калогом Files — тут не обязательно создавать main.yml, а достаточно создать файлы с нужными вам именами.

Например — создадим файл templates/ans2.domain.local.conf:

server {
    server_name {{ hostname }};
    access_log /var/log/nginx/{{ hostname }}-access.log;
    error_log /var/log/nginx/{{ hostname }}-error.log;
    root /var/www/vhosts/{{ user }}/{{ hostname }};

    location / {
        index index.html index.htm index.php;
    }

    location ~ .php$ {
        include /etc/nginx/fastcgi_params;
        fastcgi_pass  127.0.0.1:{{ cgi_port }};
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /var/www/vhosts/{{ user }}/{{ hostname }}$fastcgi_script_name;
    }
}

Тут мы используем три переменные:

  • {{ hostname }}
  • {{ user }}
  • {{ cgi_port }}

Variables

Теперь — зададим переменные для шаблона и задач.

Кроме переменных в шаблоне — мы используем ещё одну — {{ root }} в описании задачи, добавим и её сюда.

Создаём файл vars/main.yml с таким содержимым:

---
    hostname: ans2.domain.local
    user: setevoy
    cgi_port: 9001
    root: /var/www/vhosts

Tasks

Теперь — соберём всё в одну задачу.

В каталоге Tasks создаём файл tasks/main.yml:

---
    - name: Add Nginx Repository
      copy: src=nginx.repo dest=/etc/yum.repos.d/ owner=root group=root
      register: nginx_repo

    - name: Install Nginx
      yum: pkg=nginx state=latest
      when: nginx_repo|success
      register: nginxinstalled
      notify:
          - nginx start

    - name: Add NGINX cofig
      when: nginxinstalled|success
      template: src={{ domain }}.conf dest=/etc/nginx/conf.d/{{ domain }}.conf owner=nginx group=nginx

    - name: Create Web Root
      when: nginxinstalled|success
      file: path={{ root }}  mode=775 state=directory owner=nginx group=nginx
      notify:
          - nginx restart

Теперь — нам необходимо указать Ansible где искать описания ролей.

Редактируем файл /etc/ansible/ansible.cfg и находим блок:

# additional paths to search for roles in, colon separated
#roles_path    = /etc/ansible/roles

Раскомментируем его, и указываем директорию с ролями:

roles_path    = /home/setevoy/ansible/roles

Теперь — создаём обычный Playbook, в котором описываем хосты и роли, которые необходимо к ним применить:

$ cd /home/setevoy/ans_books/

Создадим файл nginx_run_role.yml:

---
- hosts: testbox
  sudo: yes
  roles:
    - nginx

Запускаем выполнение:

 $ ansible-playbook -s nginx_run_role.yml

PLAY [testbox] ****************************************************************

GATHERING FACTS ***************************************************************
ok: [cent_ans_client1]

TASK: [nginx | Add Nginx Repository] ******************************************
changed: [cent_ans_client1]

TASK: [nginx | Install Nginx] *************************************************
changed: [cent_ans_client1]

TASK: [nginx | Add NGINX cofig] ***********************************************
ok: [cent_ans_client1]

TASK: [nginx | Create Web Root] ***********************************************
changed: [cent_ans_client1]

NOTIFIED: [nginx | nginx start] ***********************************************
changed: [cent_ans_client1]

NOTIFIED: [nginx | nginx restart] *********************************************
changed: [cent_ans_client1]

PLAY RECAP ********************************************************************
cent_ans_client1           : ok=7    changed=5    unreachable=0    failed=0

Готово.

На хосте cent_ans_client1 проверяем:

# ls -l /etc/yum.repos.d/nginx.repo
-rw-r--r-- 1 root root 112 Apr  3 15:55 /etc/yum.repos.d/nginx.repo
# ls -l /etc/nginx/conf.d/ans2.domain.local.conf
-rw-r--r-- 1 nginx nginx 533 Apr  3 15:38 /etc/nginx/conf.d/ans2.domain.local.conf
# service nginx status
nginx (pid  6933) is running...
# head /etc/nginx/conf.d/ans2.domain.local.conf
server {
    server_name ans2.domain.local;
    access_log /var/log/nginx/ans2.domain.local-access.log;
    error_log /var/log/nginx/ans2.domain.local-error.log;
    root /var/www/vhosts/setevoy/ans2.domain.local;

    location / {
        index index.html index.htm index.php;
    }

Файлы скопированы, файл настроек виртуалхоста создан со всеми необходимыми значениями из переменных. Всё работает.

Ссылки по теме

http://www.azavea.com

https://serversforhackers.com

https://www.digitalocean.com