如何在AnsiblePlaybook中定义和使用处理程序
简而言之,handlers 是特殊任务,只有在通过 notify
指令触发时才会执行。 处理程序在播放结束时执行,一旦所有任务完成。
在 Ansible 中,处理程序通常用于启动、重新加载、重新启动和停止服务。 如果您的剧本涉及更改配置文件,则很有可能需要重新启动服务以使更改生效。 在这种情况下,您需要为该服务定义一个处理程序,并在需要该服务处理程序的任何任务中包含 notify
指令。
在 本系列的前一部分 中,您已经了解了如何使用模板将默认 Nginx 页面替换为自定义 HTML 登录页面。 实际上,在设置 Nginx Web 服务器时,您很可能会在 sites-available
目录中包含新的服务器块文件,创建符号链接,或更改需要重新加载或重新启动服务器的设置。
考虑到这种情况,重启 Nginx 服务的处理程序如下所示:
... handlers: - name: Restart Nginx service: name: nginx state: restarted
要触发此处理程序,您需要在任何需要在 Nginx 服务器上重新启动的任务中包含 notify
指令。
以下 playbook 使用内置 Ansible 模块 replace 替换 Nginx 配置文件中的默认文档根目录。 该模块根据 regexp
定义的正则表达式在文件中查找模式,然后用 replace
定义的内容替换找到的任何匹配项。 然后该任务向 Restart Nginx
处理程序发送通知,以便尽快重新启动。 这意味着,触发重启的次数无关紧要,它只会在所有任务已经完成执行并且处理程序开始运行时才会发生。 此外,当没有找到匹配项时,不会对系统进行任何更改,因此不会触发处理程序。
在 ansible-practice
目录中创建一个名为 playbook-12.yml
的新文件:
nano ~/ansible-practice/playbook-12.yml
将以下行添加到新的剧本文件中:
ansible-practice/playbook-12.yml
--- - hosts: all become: yes vars: page_title: My Second Landing Page page_description: This is my second landing page description. doc_root: /var/www/mypage tasks: - name: Install Nginx apt: name: nginx state: latest - name: Make sure new doc root exists file: path: "{{ doc_root }}" state: directory mode: '0755' - name: Apply Page Template template: src: files/landing-page.html.j2 dest: "{{ doc_root }}/index.html" - name: Replace document root on default Nginx configuration replace: path: /etc/nginx/sites-available/default regexp: '(\s+)root /var/www/html;(\s+.*)?$' replace: \g<1>root {{ doc_root }};\g<2> notify: Restart Nginx - name: Allow all access to tcp port 80 ufw: rule: allow port: '80' proto: tcp handlers: - name: Restart Nginx service: name: nginx state: restarted
完成后保存并关闭文件。
使用处理程序时要记住的一件重要事情是,它们仅在定义 notify
触发器的任务导致服务器发生更改时才被触发。 考虑到这个 playbook,它第一次运行 replace
任务时会更改 Nginx 配置文件,因此将运行重启。 但是,在随后的执行中,由于要替换的字符串不再存在于文件中,因此该任务不会导致任何更改,也不会触发处理程序执行。
如果您运行此 playbook,请记住提供 -K
选项,因为它需要 sudo
权限:
ansible-playbook -i inventory playbook-12.yml -u sammy -K
OutputBECOME password: PLAY [all] ********************************************************************************************** TASK [Gathering Facts] ********************************************************************************** ok: [203.0.113.10] TASK [Install Nginx] ************************************************************************************ ok: [203.0.113.10] TASK [Make sure new doc root exists] ******************************************************************** changed: [203.0.113.10] TASK [Apply Page Template] ****************************************************************************** changed: [203.0.113.10] TASK [Replace document root on default Nginx configuration] ********************************************* changed: [203.0.113.10] TASK [Allow all access to tcp port 80] ****************************************************************** ok: [203.0.113.10] RUNNING HANDLER [Restart Nginx] ************************************************************************* changed: [203.0.113.10] PLAY RECAP ********************************************************************************************** 203.0.113.10 : ok=7 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
如果您查看输出,您会看到“Restart Nginx”处理程序在播放结束之前正在执行。 如果您现在转到浏览器并访问服务器的 IP 地址,您将看到以下页面:
在本系列的下一部分和最后一部分中,我们将连接所有点,并整理出一个自动设置远程 Nginx 服务器以托管静态 HTML 网站的剧本。