Thank you for reading this post, don't forget to subscribe!
playbook Это файл-сценарий, в котором описывается набор действий для одного или группы хостов, синтаксис Yaml.
Пример файла для установки NGINX — nginx.yml
:
[codesyntax lang="bash"]
1 2 3 4 5 |
--- - hosts: testbox tasks: - name: Install Nginx yum: pkg=nginx state=latest |
[/codesyntax]
Обратите внимание на три тире в начале — они обязательны, так как в Yaml ими обозначают начало файла, а перед каждым новым «блоком» — одно тире.
В данном случае мы создаём задачу (task) с вызовом модуля yum
, которому передаём аргументы pkg=nginx state=latest
.
В качестве хостов, на которые мы будем устанавливать NGINX, можно указать группу (указанные между []
в файле /etc/ansible/hosts
), либо имена хостов:
# cat /etc/ansible/hosts | grep test |
2 |
[testbox] |
Запускаем:
01 |
$ ansible-playbook -s nginx.yml |
02 |
03 |
PLAY [testbox] **************************************************************** |
04 |
05 |
GATHERING FACTS *************************************************************** |
06 |
ok: [cent_ans_client1] |
07 |
08 |
TASK: [Install Nginx] ********************************************************* |
09 |
changed: [cent_ans_client1] |
10 |
11 |
PLAY RECAP ******************************************************************** |
12 |
cent_ans_client1 : ok=2 changed=1 unreachable=0 failed=0 |
В логе клиента видим, что NGINX был установлен:
1 |
# cat /var/log/yum.log | grep nginx |
2 |
Mar 07 16:40:56 Installed: nginx-filesystem-1.0.15-11.el6.noarch |
3 |
Mar 07 16:41:05 Installed: nginx-1.0.15-11.el6.i686 |
При вызове сценария мы использовали опцию -s
, что бы выполнить задачу под sudo
, но можно дополнить задачу, указав опцию sudo
.
Удалим NGINX. Меняем state
на absent
, и перед описание задачи — добавляем sudo: yes
:
[codesyntax lang="bash"]
1 2 3 4 5 6 |
--- - hosts: testbox sudo: yes tasks: - name: Install Nginx yum: pkg=nginx state=absent |
[/codesyntax]
Запускаем, но теперь без -s
:
01 |
$ ansible-playbook nginx.yml |
02 |
03 |
PLAY [testbox] **************************************************************** |
04 |
05 |
GATHERING FACTS *************************************************************** |
06 |
ok: [cent_ans_client1] |
07 |
08 |
TASK: [Install Nginx] ********************************************************* |
09 |
changed: [cent_ans_client1] |
10 |
11 |
PLAY RECAP ******************************************************************** |
12 |
cent_ans_client1 : ok=2 changed=1 unreachable=0 failed=0 |
На клиенте проверяем лог:
1 |
# cat /var/log/yum.log | grep nginx |
2 |
Mar 07 16:40:56 Installed: nginx-filesystem-1.0.15-11.el6.noarch |
3 |
Mar 07 16:41:05 Installed: nginx-1.0.15-11.el6.i686 |
4 |
Mar 07 16:46:11 Erased: nginx |
Hadnler
Задачу можно дополнить обработчиками, которые будут срабатывать, если задача была выполнена успешно.
Возвращаясь к примеру с NGINX — можно добавить обработчик, который будет вызываться после установки, и который запустит NGINX.
Дополним наш сценарий:
[codesyntax lang="bash"]
1 2 3 4 5 6 7 8 9 10 11 12 |
--- - hosts: testbox sudo: yes tasks: - name: Install Nginx yum: pkg=nginx state=latest notify: - NGINX start handlers: - name: NGINX start service: name=nginx state=started |
[/codesyntax]
Мы вернули state=latest
, и добавили notify (уведомление) с именем NGINX start
.
В конце — мы добавляем обработчик, которому даём имя NGINX start
, ууказывая имя службы name=nginx
и требуемое состояние — state=started
.
Запускаем:
01 |
$ ansible-playbook nginx.yml |
02 |
03 |
PLAY [testbox] **************************************************************** |
04 |
05 |
GATHERING FACTS *************************************************************** |
06 |
ok: [cent_ans_client1] |
07 |
08 |
TASK: [Install Nginx] ********************************************************* |
09 |
changed: [cent_ans_client1] |
10 |
11 |
NOTIFIED: [NGINX start] ******************************************************* |
12 |
changed: [cent_ans_client1] |
13 |
14 |
PLAY RECAP ******************************************************************** |
15 |
cent_ans_client1 : ok=3 changed=2 unreachable=0 failed=0 |
На ноде проверяем:
1 |
# cat /var/log/yum.log | grep nginx |
2 |
Mar 07 16:40:56 Installed: nginx-filesystem-1.0.15-11.el6.noarch |
3 |
Mar 07 16:41:05 Installed: nginx-1.0.15-11.el6.i686 |
4 |
Mar 07 16:46:11 Erased: nginx |
5 |
Mar 07 17:07:39 Installed: nginx-1.0.15-11.el6.i686 |
1 |
# service nginx status |
2 |
nginx (pid 3691) is running... |
Можно использовать несколько обработчиков для одной задачи. Например — мы хотим установить NGINX, запустить его и добавить в rc-скрипты для запуска при рестарте системы.
Редактируем файл, и добавляем:
1 |
notify: |
2 |
- nginx start |
3 |
- nginx startup |
А в конце — новый обработчик:
1 |
- name: nginx startup |
2 |
service: name=nginx enabled=yes |
После выполнения — проверяем:
1 |
# chkconfig --list nginx |
2 |
nginx 0:off 1:off 2:on 3:on 4:on 5:on 6:off |
В сценариях можно указывать несколько задач. Допишем наш nginx.yml
, и добавим в него несколько новых задач:
[codesyntax lang="bash"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
--- - hosts: testbox sudo: yes tasks: - name: add nginx release repo shell: rpm -Uvh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm creates=/etc/yum.repos.d/nginx.repo register: nginx_repo - name: Install nginx yum: pkg=nginx state=latest when: nginx_repo|success notify: - nginx start handlers: - name: nginx start service: name=nginx state=started |
[/codesyntax]
Тут мы используем несколько нвых директив Ansible: register
— создаёт новую переменную, в которую записывает результат выполнения задачи, и when
— проверяет значение заданной переменной, и выполняет задачу, если стостояние будет success
.
На клиенте удаляем NGINX:
1 |
# yum erase nginx |
И проверяем новый playbook:
01 |
$ ansible-playbook nginx.yml |
02 |
03 |
PLAY [testbox] **************************************************************** |
04 |
05 |
GATHERING FACTS *************************************************************** |
06 |
ok: [cent_ans_client1] |
07 |
08 |
TASK: [add nginx release repo] ************************************************ |
09 |
changed: [cent_ans_client1] |
10 |
11 |
TASK: [Install nginx] ********************************************************* |
12 |
changed: [cent_ans_client1] |
13 |
14 |
NOTIFIED: [nginx start] ******************************************************* |
15 |
changed: [cent_ans_client1] |
16 |
17 |
PLAY RECAP ******************************************************************** |
18 |
cent_ans_client1 : ok=4 changed=3 unreachable=0 failed=0 |
На ноде проверяем:
1 |
# yum repolist |
2 |
... |
3 |
nginx nginx repo 69 |
4 |
... |
1 |
# service nginx status |
2 |
nginx (pid 4029) is running... |
Ещё немного дополним наш сценарий — добавим создание корневой директории для сайтов с помощью модуля file.
Опять удаляем NGINX на клиенте:
1 |
# yum erase nginx |
И редактируем файл nginx.yml
на сервере с Ansible:
[codesyntax lang="bash"]
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 30 31 |
--- - hosts: testbox sudo: yes vars: root: /var/www/vhosts tasks: - name: add nginx release repo shell: rpm -Uvh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm creates=/etc/yum.repos.d/nginx.repo register: nginx_repo - name: Install nginx yum: pkg=nginx state=latest when: nginx_repo|success register: nginxinstalled notify: - nginx start - name: Create Web Root when: nginxinstalled|success file: path={{root}} mode=775 state=directory owner=nginx group=nginx notify: - nginx restart handlers: - name: nginx start service: name=nginx state=started - name: nginx restart service: name=nginx state=restarted |
[/codesyntax]
Мы добавили новую переменную root: /var/www/vhosts
, новую переменную состояния nginxinstalled
в задачу Install nginx
, и новую задачу Create Web Root
, которая создаёт каталог /var/www/vhosts
, устанавливает права 755 и меняет владельца, и новый обработчик, который перезапустит NGINX после создания каталога.
Запускаем:
01 |
$ ansible-playbook nginx.yml |
02 |
03 |
PLAY [testbox] **************************************************************** |
04 |
05 |
GATHERING FACTS *************************************************************** |
06 |
ok: [cent_ans_client1] |
07 |
08 |
TASK: [add nginx release repo] ************************************************ |
09 |
ok: [cent_ans_client1] |
10 |
11 |
TASK: [Install nginx] ********************************************************* |
12 |
changed: [cent_ans_client1] |
13 |
14 |
TASK: [Create Web Root] ******************************************************* |
15 |
changed: [cent_ans_client1] |
16 |
17 |
NOTIFIED: [nginx start] ******************************************************* |
18 |
changed: [cent_ans_client1] |
19 |
20 |
NOTIFIED: [nginx restart] ***************************************************** |
21 |
changed: [cent_ans_client1] |
22 |
23 |
PLAY RECAP ******************************************************************** |
24 |
cent_ans_client1 : ok=6 changed=4 unreachable=0 failed=0 |
Проверяем:
1 |
# ls -l /var/www/ |
2 |
total 4 |
3 |
drwxrwxr-x. 2 nginx nginx 4096 Mar 7 17:48 vhosts |
1 |
# service nginx status |
2 |
nginx (pid 4737) is running... |