Роли отлично подходят для организации различных, но связанных между собой задач (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
Тут мы разместим файл репозитоия NGINX – files/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; }
Файлы скопированы, файл настроек виртуалхоста создан со всеми необходимыми значениями из переменных. Всё работает.
Ссылки по теме