Ansible: сценарии (playbook) и обработчики (handler)

Автор: | 03/17/2015
 

ansible_logo_black_squarePlaybook в терминологии Ansible — то же самое, что cookbook в Chef.

Это файл-сценарий, в котором описывается набор действий для одного или группы хостов, синтаксис Yaml.

Пример файла для установки NGINXnginx.yml:

---
- hosts: testbox
  tasks:
   - name: Install Nginx
     yum: pkg=nginx state=latest

Обратите внимание на три тире в начале — они обязательны, так как в Yaml ими обозначают начало файла, а перед каждым новым «блоком» — одно тире.

В данном случае мы создаём задачу (task) с вызовом модуля yum, которому передаём аргументы pkg=nginx state=latest.

В качестве хостов, на которые мы будем устанавливать NGINX, можно указать группу (указанные между [] в файле /etc/ansible/hosts), либо имена хостов:

# cat /etc/ansible/hosts | grep test
[testbox]

Запускаем:

$ ansible-playbook -s nginx.yml

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

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

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

PLAY RECAP ********************************************************************
cent_ans_client1           : ok=2    changed=1    unreachable=0    failed=0

В логе клиента видим, что NGINX был установлен:

# cat /var/log/yum.log | grep nginx
Mar 07 16:40:56 Installed: nginx-filesystem-1.0.15-11.el6.noarch
Mar 07 16:41:05 Installed: nginx-1.0.15-11.el6.i686

При вызове сценария мы использовали опцию -s, что бы выполнить задачу под sudo, но можно дополнить задачу, указав опцию sudo.

Удалим NGINX. Меняем state на absent, и перед описание задачи — добавляем sudo: yes:

---
- hosts: testbox
  sudo: yes
  tasks:
   - name: Install Nginx
     yum: pkg=nginx state=absent

Запускаем, но теперь без -s:

$ ansible-playbook nginx.yml

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

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

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

PLAY RECAP ********************************************************************
cent_ans_client1           : ok=2    changed=1    unreachable=0    failed=0

На клиенте проверяем лог:

# cat /var/log/yum.log | grep nginx
Mar 07 16:40:56 Installed: nginx-filesystem-1.0.15-11.el6.noarch
Mar 07 16:41:05 Installed: nginx-1.0.15-11.el6.i686
Mar 07 16:46:11 Erased: nginx

Больше о сценариях можно найти тут>>>.

Hadnler

Задачу можно дополнить обработчиками, которые будут срабатывать, если задача была выполнена успешно.

Возвращаясь к примеру с NGINX — можно добавить обработчик, который будет вызываться после установки, и который запустит NGINX.

Дополним наш сценарий:

---
- 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

Мы вернули state=latest, и добавили notify (уведомление) с именем NGINX start.

В конце — мы добавляем обработчик, которому даём имя NGINX start, ууказывая имя службы name=nginx и требуемое состояние — state=started.

Запускаем:

$ ansible-playbook nginx.yml

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

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

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

NOTIFIED: [NGINX start] *******************************************************
changed: [cent_ans_client1]

PLAY RECAP ********************************************************************
cent_ans_client1           : ok=3    changed=2    unreachable=0    failed=0

На ноде проверяем:

# cat /var/log/yum.log | grep nginx
Mar 07 16:40:56 Installed: nginx-filesystem-1.0.15-11.el6.noarch
Mar 07 16:41:05 Installed: nginx-1.0.15-11.el6.i686
Mar 07 16:46:11 Erased: nginx
Mar 07 17:07:39 Installed: nginx-1.0.15-11.el6.i686
# service nginx status
nginx (pid  3691) is running...

Можно использовать несколько обработчиков для одной задачи. Например — мы хотим установить NGINX, запустить его и добавить в rc-скрипты для запуска при рестарте системы.

Редактируем файл, и добавляем:

     notify:
       - nginx start
       - nginx startup

А в конце — новый обработчик:

    - name: nginx startup
      service: name=nginx enabled=yes

После выполнения — проверяем:

# chkconfig --list nginx
nginx           0:off   1:off   2:on    3:on    4:on    5:on    6:off

В сценариях можно указывать несколько задач. Допишем наш nginx.yml, и добавим в него несколько новых задач:

---
- 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

Тут мы используем несколько нвых директив Ansible: register — создаёт новую переменную, в которую записывает результат выполнения задачи, и when — проверяет значение заданной переменной, и выполняет задачу, если стостояние будет success.

Продробнее про условия выполнения можно почитать тут>>>.

На клиенте удаляем NGINX:

# yum erase nginx

И проверяем новый playbook:

$ ansible-playbook nginx.yml

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

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

TASK: [add nginx release repo] ************************************************
changed: [cent_ans_client1]

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

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

PLAY RECAP ********************************************************************
cent_ans_client1           : ok=4    changed=3    unreachable=0    failed=0

На ноде проверяем:

# yum repolist
...
nginx                      nginx repo                            69
...
# service nginx status
nginx (pid  4029) is running...

Ещё немного дополним наш сценарий — добавим создание корневой директории для сайтов с помощью модуля file.

Опять удаляем NGINX на клиенте:

# yum erase nginx

И редактируем файл nginx.yml на сервере с Ansible:

---
- 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

Мы добавили новую переменную root: /var/www/vhosts, новую переменную состояния nginxinstalled в задачу Install nginx, и новую задачу Create Web Root, которая создаёт каталог /var/www/vhosts, устанавливает права 755 и меняет владельца, и новый обработчик, который перезапустит NGINX после создания каталога.

Запускаем:

$ ansible-playbook nginx.yml

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

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

TASK: [add nginx release repo] ************************************************
ok: [cent_ans_client1]

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

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

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

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

PLAY RECAP ********************************************************************
cent_ans_client1           : ok=6    changed=4    unreachable=0    failed=0

Проверяем:

# ls -l /var/www/
total 4
drwxrwxr-x. 2 nginx nginx 4096 Mar  7 17:48 vhosts
# service nginx status
nginx (pid  4737) is running...