Playbook
в терминологии Ansible – то же самое, что cookbook
в 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...