我有一个简单的playbook,它复制了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时看到它的输出。如何添加这个"错误处理程序"?
答案 0 :(得分:2)
如果处理程序输出告诉您有关失败的信息,您可以使用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
当然,更好的解决方案是在配置文件中修复这些错误 - 通过Ansible输出计算它们与在目标主机上进行SSH检查相比具有局限性。
答案 1 :(得分:0)
为什么不使用Ansible模块验证配置的能力?:
例如:
MyCompany.Dispositivos.Plugins.TICAnKorr.DeviceTICAnKorr.StopLive()