我有一个简单的剧本,它复制 nginx 服务器的一些配置文件,然后发出 service nginx reload
命令:
---
- hosts: mirrors
tasks:
- name: Installs nginx web server
apt: pkg=nginx state=installed update_cache=true
notify:
- start nginx
- name: Copy vhost file
copy: src=vhost/test.vhost dest=/etc/nginx/sites-available/ mode=0644
- name: Symlink vhost file to enabled sites
file: src=/etc/nginx/sites-available/test.vhost dest=/etc/nginx/sites-enabled/test.vhost state=link
notify:
- reload nginx
handlers:
- name: start nginx
service: name=nginx state=started
- name: reload nginx
service: name=nginx state=reloaded
现在的问题是,test.host
文件可能包含错误,并且 nginx 无法正确重新加载。如果发生这种情况,我想运行命令 systemctl status nginx.service
并在 ansible playbook 执行时查看它的输出。如何添加这个“错误处理程序”?
最佳答案
如果处理程序输出告诉您有关失败的信息,您可以使用 ignore_errors
和 register
关键字进行一些不错的错误处理。
将处理程序设置为不结束失败并在返回错误代码时结束播放,而是将输出注册为变量:
handlers:
- name: reload nginx
service: name=nginx state=reloaded
ignore_errors: True
register: nginx_reloaded
然后回到任务部分,调用flush_handlers
来执行所有排队的处理程序,否则这些处理程序将等到播放结束。添加一个任务,当您的 nginx_reloaded
变量具有非零返回代码时,向服务器询问 Nginx 的状态,然后使用调试模块打印该信息:
- name: Symlink vhost file to enabled sites
file: src=/etc/nginx/sites-available/test.vhost dest=/etc/nginx/sites-enabled/test.vhost state=link
notify:
- reload nginx
- meta: flush_handlers
- name: Get the Nginx service status if it failed to failed.
command: "systemctl status nginx.service"
register: nginx_status
when: nginx_reloaded.rc != 0
- debug: var=nginx_status
when: nginx_reloaded.rc != 0
当然,更好的解决方案是修复配置文件中的这些错误 - 与通过 SSH 连接到目标主机进行检查相比,通过 Ansible 输出找出它们存在局限性。
关于ansible - ansible处理程序发生错误后如何运行命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32382231/