如何在 Ansible Playbook 中定义和使用处理程序

简而言之, handlers 是特殊任务,只有在通过通知指令启动时才能执行。

在 Ansible 中,处理器通常用于启动、重新加载、重新启动和停止服务. 如果播放簿涉及更改配置文件,则有可能需要重新启动服务,以便更改生效。

本系列的上一部分,您已经看到如何使用模板来替换默认的Nginx页面以自定义的HTML定位页面。在实践中,在设置您的Nginx网络服务器时,您最有可能将新服务器封锁文件添加到您的网站可用目录中,创建象征链接,或更改需要重新加载或重新启动服务器的设置。

考虑到这样的场景,这就是重新启动 Nginx 服务的处理器的样子:

1...
2  handlers:
3    - name: Restart Nginx
4      service:
5        name: nginx
6        state: restarted

要触发此处理器,您需要在任何需要在 Nginx 服务器上重新启动的任务中包含一个通知指令。

以下播放本使用内置的 Ansible 模块替换来替换 Nginx 配置文件中的默认文档根. 本模块基于 regexp 定义的正则表达式在文件中寻找模式,然后用 替换 定义的内容替换发现的任何匹配 。 然后,任务向`重新启动Nginx ' 处理者发出通知,以便尽快重新启动。 也就是说,你触发重启的次数并不重要, 只有当所有任务都已完成并且处理者开始运行时, 此外,当找不到匹配时,系统没有变化,因此没有触发处理器.

在您的ansible-practice目录中创建一个名为playbook-12.yml的新文件:

1nano ~/ansible-practice/playbook-12.yml

将下列行添加到新播放簿文件中:

 1[label ansible-practice/playbook-12.yml]
 2---
 3- hosts: all
 4  become: yes
 5  vars:
 6    page_title: My Second Landing Page
 7    page_description: This is my second landing page description.
 8    doc_root: /var/www/mypage
 9
10  tasks:
11    - name: Install Nginx
12      apt:
13        name: nginx
14        state: latest
15
16    - name: Make sure new doc root exists
17      file:
18        path: "{{ doc_root }}"
19        state: directory
20        mode: '0755'
21
22    - name: Apply Page Template
23      template:
24        src: files/landing-page.html.j2
25        dest: "{{ doc_root }}/index.html"
26
27    - name: Replace document root on default Nginx configuration
28      replace:
29        path: /etc/nginx/sites-available/default
30        regexp: '(\s+)root /var/www/html;(\s+.*)?$'
31        replace: \g<1>root {{ doc_root }};\g<2>
32      notify: Restart Nginx
33
34    - name: Allow all access to tcp port 80
35      ufw:
36        rule: allow
37        port: '80'
38        proto: tcp
39
40  handlers:
41    - name: Restart Nginx
42      service:
43        name: nginx
44        state: restarted

保存并关闭文件,当你完成。

使用处理器时要记住的一件重要事情是,当定义通知触发器的任务导致服务器发生变化时,它们才会触发。考虑到本图书,第一次运行更换任务时,它会改变 Nginx 配置文件,从而重新启动。

请记住,如果运行此播放簿,请提供-K选项,因为它需要sudo权限:

1ansible-playbook -i inventory playbook-12.yml -u sammy -K
 1[secondary_label Output]
 2BECOME password: 
 3
 4PLAY [all] **********************************************************************************************
 5
 6TASK [Gathering Facts] **********************************************************************************
 7ok: [203.0.113.10]
 8
 9TASK [Install Nginx] ************************************************************************************
10ok: [203.0.113.10]
11
12TASK [Make sure new doc root exists] ********************************************************************
13changed: [203.0.113.10]
14
15TASK [Apply Page Template] ******************************************************************************
16changed: [203.0.113.10]
17
18TASK [Replace document root on default Nginx configuration] *********************************************
19changed: [203.0.113.10]
20
21TASK [Allow all access to tcp port 80] ******************************************************************
22ok: [203.0.113.10]
23
24RUNNING HANDLER [Restart Nginx] *************************************************************************
25changed: [203.0.113.10]
26
27PLAY RECAP **********************************************************************************************
28203.0.113.10                : ok=7 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

如果你看看输出,你会看到重新启动 Nginx处理器在播放结束之前被执行. 如果你现在进入你的浏览器并访问服务器的IP地址,你会看到下面的页面:

Screenshot showing the new landing page after update

在本系列的下一部分和最后一部分中,我们将连接所有点,并组建一个游戏簿,自动设置远程 Nginx 服务器来托管静态 HTML 网站。

Published At
Categories with 技术
comments powered by Disqus