默认情况
文章插图
使用了 ignore_errors 的情况
文章插图
自定义错误判定条件-failed_when命令不依赖返回状态码来判定是否执行失败,而是要查看命令返回内容来决定,比如返回内容中包括 command not found 字符串,则判定为失败 。
1 [yun@ansi-manager object05]$ pwd 2 /app/ansible_info/object05 3 [yun@ansi-manager object05]$ ll 4 total 48 5 -rw-rw-r-- 1 yun yun369 Aug 29 16:12 test_custom_error.yml 6 [yun@ansi-manager object05]$ cat test_custom_error.yml7 --- 8 # 自定义错误条件 9 - hosts: proxyservers10 11tasks:12- name: "this command prints 'command not found' if not find"13shell: "kkk -x"# 测试一14#shell: "/bin/kkk -x"# 测试二15register: shell_result16failed_when: "'command not found' in shell_result['stderr']"17 18- name: "print shell_result info"19debug:20msg: "{{ shell_result['stderr'] }}"21 22 [yun@ansi-manager object05]$ ansible-playbook -b -i ../hosts_key --syntax-check test_custom_error.yml# 语法检测23 [yun@ansi-manager object05]$ ansible-playbook -b -i ../hosts_key -C test_custom_error.yml# 预执行,测试执行24 [yun@ansi-manager object05]$ ansible-playbook -b -i ../hosts_key test_custom_error.yml# 执行
强制调用触发器-force_handlers通常情况下,当 task 执行失败后,playbook 会终止 。任何在此之前已经被 task notify 的 handlers 都不会被执行 。
此时,如果你在 playbook 中设置了 force_handlers: yes 参数,则被通知的 handlers 就会被强制执行(有些特殊场景可能会使用到) 。
如示例,在一个 playbook 中,如果配置文件的 task 已经被执行成功,并且 notify 了 handlers,之后必须重启服务 。那么我们会强制要求:即使后续的 task 执行失败,之前被通知的 handlers 也必须执行 。
如果不强制执行就变成了,第一次执行时:配置文件修改成功,但由于之后有 task 执行失败,导致 playbook 终止,后续 handlers 没有被调用,对应服务没有重启;第二次执行时:配置文件没发生改变「因此第一次已经更新了配置文件」,因此不会通知 handlers 。最终结果就是配置改变了,但是就是没有重启服务 。显然不符合我们的初衷 。
1 [yun@ansi-manager object05]$ pwd 2 /app/ansible_info/object05 3 [yun@ansi-manager object05]$ ll 4 total 40 5 drwxrwxr-x 2 yun yun129 Aug 24 14:28 file 6 -rw-rw-r-- 1 yun yun909 Aug 29 12:23 test_error_deal.yml 7 [yun@ansi-manager object05]$ cat test_error_deal.yml8 --- 9 # 即使 task 执行错误,之前已 notify 的 handlers 必须被执行10 - hosts: proxyservers11# 这里为了演示方便,因此变量直接就写在了该文件中12vars:13- httpd_port: 808714# 即使 task 执行错误,之前已 notify 的 handlers 必须被执行15force_handlers: yes16 17tasks:18- name: "Install httpd"19yum:20name: "{{ packages }}"21state: present22vars:23packages:24- httpd25- httpd-tools26 27- name: "Httpd config"28template:29src: ./file/httpd.conf.j230dest: /etc/httpd/conf/httpd.conf31notify: "Restart httpd server"32 33- name: "Start httpd server"34systemd:35name: httpd36state: started37enabled: yes38 39# /bin/false返回状态码为1,不为040- name: "Shell task"41shell: /bin/false42 43- name: "Create dir"44file:45path: /tmp/with_items_testdir46state: directory47 48handlers:49- name: "Restart httpd server"50systemd:51name: httpd52state: restarted53 54 [yun@ansi-manager object05]$ ansible-playbook -b -i ../hosts_key --syntax-check test_error_deal.yml# 语法检测55 [yun@ansi-manager object05]$ ansible-playbook -b -i ../hosts_key -C test_error_deal.yml# 预执行,测试执行56 [yun@ansi-manager object05]$ ansible-playbook -b -i ../hosts_key test_error_deal.yml# 执行
抑制changed状态-changed_whenansible 会自动判断模块执行状态,command、shell 及其它模块如果修改了远程主机状态则被判定为 changed 状态,不过也可以自己决定达到 changed 状态的条件 。
当我们在 playbook 中使用 shell 或者 command 模块时,每次 task 执行状态都是 changed 。原因是因为每次我们都去执行获取当前数据,而不是一个固化的状态 。
但在实际应用中,我们可能不需要 shell 或者 command 模块执行后的 changed 状态,这时我们就需要通过 changed_when: false 来抑制这个改变 。
当然上述的 changed_when: false 可以在任何模块中使用,不局限于 shell 和 command 模块,只是我们常用于这两个模块而已 。
1 [yun@ansi-manager object05]$ pwd 2 /app/ansible_info/object05 3 [yun@ansi-manager object05]$ ll 4 total 44 5 -rw-rw-r-- 1 yun yun299 Aug 29 14:47 test_changed_when.yml 6 [yun@ansi-manager object05]$ cat test_changed_when.yml7 --- 8 # 使用 changed_when: false 抑制 changed 状态 9 - hosts: proxyservers10 11tasks:12- name: "Shell task"13shell: netstat -lntp | grep 'httpd'14register: check_httpd15# changed_when: false# 任何时候,都不为 changed 状态16#### check_httpd['stdout'] 不包含 httpd 为 true,否则 false17changed_when: "'httpd' not in check_httpd['stdout']" # 结果为 false 18 19- name: "Debug output"20debug:21msg: "{{ check_httpd.stdout }}"22 23 [yun@ansi-manager object05]$ ansible-playbook -b -i ../hosts_key --syntax-check test_changed_when.yml# 语法检测24 [yun@ansi-manager object05]$ ansible-playbook -b -i ../hosts_key -C test_changed_when.yml# 预执行,测试执行25 [yun@ansi-manager object05]$ ansible-playbook -b -i ../hosts_key test_changed_when.yml# 执行
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Mac 上的 Web 开发者最喜欢的编程工具
- 你可能不知道的4种奇怪的编程语言
- 编程人员必须遵循的编码规范
- Go 并发编程的思考
- 编程新手该如何调优程序?程序员必备性能调优利器——火焰图
- 我最喜欢用的 5 个 Ansible 模块
- 80后架构师教你学ApacheBeam,一个开源统一分布式数据处理编程库
- 适用于编程和开发人员的苹果Mac电脑
- JavaScript中的函数式编程
- 机器指令到汇编再到高级编程语言