ansible - ansible处理程序发生错误后如何运行命令

标签 ansible

我有一个简单的剧本,它复制 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_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

当然,更好的解决方案是修复配置文件中的这些错误 - 与通过 SSH 连接到目标主机进行检查相比,通过 Ansible 输出找出它们存在局限性。

关于ansible - ansible处理程序发生错误后如何运行命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32382231/

相关文章:

Ansible 同步模式权限

ansible - 如何处理 Ansible 循环中的空列表

ansible - 如何按值对字典进行排序

python - 如何在 CentOS8 上安装 Ansible

ansible - 将列表保存在 Consul 的键/值对中

ansible - 如何访问 Action 插件中的 ansible 变量(不提供它们作为参数)

ansible - 如何检查我是否从 AWX 或命令行运行 Ansible?

ubuntu - apt-get 失败并显示 "There are problems and -y was used without --force-yes"

docker - 如何定制molecules的docker镜像?

python - 如何在 jinja2 过滤器中使用嵌套 if