Thank you for reading this post, don't forget to subscribe!
Роли отлично подходят для организации различных, но связанных между собой задач (task), и размещения всех связанных с этими задачами данных в одном месте.
Для примера — выполним установку NGINX, которая будет включать в себя добавление файла репозитория, установку пакетов и установку файла конфигурации виртуалхоста
Роли имеют свою структуру каталогов, которая выглядит так:
1 |
rolename |
2 |
- files |
3 |
- handlers |
4 |
- meta |
5 |
- templates |
6 |
- tasks |
7 |
- vars |
Внутри каждой (кроме files
и templates
) директории — Ansible будет искать и читать файлы main.yml
.
На сервере с Ansible cоздаём необходимые каталоги:
01 |
$ mkdir -p ~/ansible/roles/nginx |
02 |
$ cd ~/ansible/roles/nginx |
03 |
$ mkdir files handlers meta templates tasks vars |
04 |
$ tree -d -L 1 |
05 |
. |
06 |
├── files |
07 |
├── handlers |
08 |
├── meta |
09 |
├── tasks |
10 |
├── templates |
11 |
└── vars |
По факту — не обязательно использовать все директории, и не обязательно все их создавать.
Назначение директорий:
files
: содержит файлы, которые будут скопированы на настраиваемые хосты; так же — может содержать скрипты, которые позже будут запускаться на хостах;handlers
: обработчики, которые будут использоваться при выполнении задач;meta
: описание зависимостей, т.е. — ролей, которые должны быть обработаны перед запуском настраиваемой роли и мета-данных, таких как автор, описание продукта и прочее;templates
: шаблоны файлов с переменными;tasks
: все задачи, которые ранее были описаны в Playbook-е;vars
: переменные для шаблонов.
Files
Тут мы разместим файл репозитоия NGINX — files/nginx.repo
:
1 2 3 4 5 6 7 8 |
[nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/6/$basearch/ gpgcheck=0 enabled=1 priority=15 |
Handlers
Создаём файл handlers/main.yml
и вписываем в него наши обработчики:
[codesyntax lang="bash"]
1 2 3 4 5 6 |
--- - name: nginx start service: name=nginx state=started - name: nginx restart service: name=nginx state=restarted |
[/codesyntax]
Meta
В данном случае зависимостей и мета-данных нет, поэтому — либо можно оставить директорию пустой, либо создать файл meta/main.yml
с пустым описанием зависимостей:
[codesyntax lang="bash"]
1 2 |
--- dependencies: [] |
[/codesyntax]
Если же вы захотите добавить роль-зависимость, например — установку PHP-FPM, это можно сделать так:
[codesyntax lang="bash"]
1 2 3 |
--- dependencies: - { role: phpfpm } |
[/codesyntax]
Эта роль будет выполнена перед выполнение роли nginx
.
Template
Создадим шаблон файла настроек для виртуалхоста.
Как и в случае с калогом Files — тут не обязательно создавать main.yml
, а достаточно создать файлы с нужными вам именами.
Например — создадим файл templates/ans2.domain.local.conf
:
[codesyntax lang="bash"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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; } } |
[/codesyntax]
Тут мы используем три переменные:
{{ hostname }}
{{ user }}
{{ cgi_port }}
Variables
Теперь — зададим переменные для шаблона и задач.
Кроме переменных в шаблоне — мы используем ещё одну — {{ root }}
в описании задачи, добавим и её сюда.
Создаём файл vars/main.yml
с таким содержимым:
[codesyntax lang="bash"]
1 2 3 4 5 |
--- hostname: ans2.domain.local user: mid cgi_port: 9001 root: /var/www/vhosts |
[/codesyntax]
Tasks
Теперь — соберём всё в одну задачу.
В каталоге Tasks создаём файл tasks/main.yml
:
[codesyntax lang="bash"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
--- - 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 |
[/codesyntax]
Теперь — нам необходимо указать Ansible где искать описания ролей.
Редактируем файл /etc/ansible/ansible.cfg
и находим блок:
1 2 3 4 |
# additional paths to search for roles in, colon separated #roles_path = /etc/ansible/roles Раскомментируем его, и указываем директорию с ролями: |
1 2 3 |
roles_path = /home/mid/ansible/roles Теперь — создаём обычный <em>Playbook</em>, в котором описываем хосты и роли, которые необходимо к ним применить: |
1 2 3 |
cd /home/mid/ans_books/ Создадим файл <code>nginx_run_role.yml</code>: [codesyntax lang="bash"] |
1 2 3 4 5 |
--- - hosts: testbox sudo: yes roles: - nginx |
1 2 3 |
[/codesyntax] Запускаем выполнение: |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
$ 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
проверяем:
1 2 |
# 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 |
1 2 |
# 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 |
1 2 3 |
# service nginx status nginx (pid 6933) is running... [codesyntax lang="bash"] |
1 2 3 4 5 6 7 8 9 10 |
# 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/mid/ans2.domain.local; location / { index index.html index.htm index.php; } |
1 2 |
[/codesyntax] Файлы скопированы, файл настроек виртуалхоста создан со всеми необходимыми значениями из переменных. Всё работает. |