该系列的一部分:
如何编写 Ansible Playbooks
Ansible 是一种现代配置管理工具,不需要在远程节点上使用代理软件,仅使用 SSH 和 Python 在托管服务器上进行通信和执行命令。本系列将带您了解可用于编写服务器自动化剧本的主要 Ansible 功能。最后,我们将看到一个实际示例,说明如何创建剧本以自动设置远程 Nginx Web 服务器并向其部署静态 HTML 网站。
简而言之,处理程序是只有在通过notify
指令触发时才会执行的特殊任务。一旦所有任务完成,处理程序将在播放结束时执行。
在 Ansible 中,处理程序通常用于启动、重新加载、重新启动和停止服务。如果您的剧本涉及更改配置文件,则很有可能您需要重新启动服务以使更改生效。在这种情况下,您需要为该服务定义一个处理程序,并notify
在需要该服务处理程序的任何任务中包含该指令。
在本系列的前一部分中,您已经了解了如何使用模板将默认的 Nginx 页面替换为自定义的 HTML 登录页面。实际上,在设置 Nginx Web 服务器时,您很可能会在sites-available
目录中包含新的服务器块文件、创建符号链接或更改需要重新加载或重新启动服务器的设置。
考虑到这种情况,重新启动 Nginx 服务的处理程序如下所示:
...
handlers:
- name: Restart Nginx
service:
name: nginx
state: restarted
要触发此处理程序,您需要notify
在任何需要在 Nginx 服务器上重新启动的任务中包含一个指令。
以下 playbook 使用内置的 Ansible 模块replace 替换了 Nginx 配置文件中的默认文档根目录。此模块根据由 定义的正则表达式在文件中查找模式regexp
,然后将找到的任何匹配项替换为由 定义的内容replace
。然后,该任务向Restart Nginx
处理程序发送通知以尽快重新启动。这意味着,触发重启的次数无关紧要,只有在所有任务都已完成执行并且处理程序开始运行时才会发生。此外,当未找到匹配项时,不会对系统进行任何更改,因此不会触发处理程序。
playbook-12.yml
在您的ansible-practice
目录中创建一个名为的新文件:
- nano ~/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
触发器的任务导致服务器发生更改时才会触发。考虑到这个剧本,它第一次运行replace
任务时会更改 Nginx 配置文件,因此会重新启动。但是,在后续执行中,由于要替换的字符串不再存在于文件中,因此任务不会引起任何更改,也不会触发处理程序执行。
-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 网站。