в терминологии Ansible — то же самое, что
Playbookcookbook в Chef.
Это файл-сценарий, в котором описывается набор действий для одного или группы хостов, синтаксис Yaml.
Пример файла для установки NGINX — nginx.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...




