如何在ansible处理程序

时间:2015-09-03 17:44:09

标签: ansible ansible-playbook

我有一个简单的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时看到它的输出。如何添加这个"错误处理程序"?

2 个答案:

答案 0 :(得分:2)

如果处理程序输出告诉您有关失败的信息,您可以使用ignore_errorsregister关键字进行一些错误处理。

将处理程序设置为不结束失败并在返回错误代码时结束播放,但将输出注册为变量:

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()