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

Thank you for reading this post, don't forget to subscribe!

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

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

[codesyntax lang="bash"]

[/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"]

[/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"]

[/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"]

[/codesyntax]

Тут мы исполь­зу­ем несколь­ко нвых дирек­тив Ansibleregister — созда­ёт новую пере­мен­ную, в кото­рую запи­сы­ва­ет резуль­тат выпол­не­ния зада­чи, и 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"]

[/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...