Ansible:如果任何任务失败,则执行任务(或处理程序)

vab*_*ada 19 ansible

我正在使用Ansible将Django网站部署到我的服务器(生产,登台等),并且我希望当且仅当任何任务失败时才会收到通知(在这种情况下通过松弛).

我只能弄清楚如果指定的任务失败怎么做(所以我想我可以为所有任务添加一个处理程序),但是直觉告诉我必须有一个更简单,更优雅的选项.

基本上我的想法是:

---
- hosts: "{{hosts_to_deploy}}"

- tasks: 

   [...]

  - name: notify slack of deploy failure
    local_action:
      module: slack
      token: "{{slack_token}}"
      msg: "Deploy failed on {{inventory_hostname}}"
    when: # any task failed
Run Code Online (Sandbox Code Playgroud)

我一直在深入探讨Ansible文档,特别是在错误处理部分,并在SO处回答,但我很难找到我的问题的答案.所以任何帮助将不胜感激.

udo*_*dan 38

我认为处理程序不是解决方案,因为只有在任务报告更改状态时才会通知处理程序.在失败状态下,将不会通知处理程序.

此外,如果剧本失败,则不会触发默认处理程序.但这可以改变.为此,您需要在以下位置设置ansible.cfg:

force_handlers = True
Run Code Online (Sandbox Code Playgroud)

但是,是的,有更好的选择.

如果使用Ansible 2,则可以使用新功能.阻止将任务组合在一起,并有一个救援部分,只有在任何任务失败时才会触发.

tasks:
  - block:
      - here
      - go
      - all
      - your
      - tasks
    rescue:
      - name: notify slack of deploy failure
        local_action:
          module: slack
          token: "{{slack_token}}"
          msg: "Deploy failed on {{inventory_hostname}}"
Run Code Online (Sandbox Code Playgroud)

另一个选择,如果你使用Ansible 1.x特别有趣可能是回调插件.正如名称所暗示的那样,您可以编写可以在各种事件上触发的回调.

再说一遍,如果你使用Ansible 2,那么你很幸运,因为已经有一个松散的回调插件可用:https://github.com/ansible/ansible/blob/devel/lib/ansible/plugins/callback/slack. PY

要使用此插件,您需要在以下位置启用它ansible.cfg:

callback_whitelist = slack
Run Code Online (Sandbox Code Playgroud)

并在系统上定义一些环境变量以进行配置:

 This plugin makes use of the following environment variables:
    SLACK_WEBHOOK_URL (required): Slack Webhook URL
    SLACK_CHANNEL     (optional): Slack room to post in. Default: #ansible
    SLACK_USERNAME    (optional): Username to post as. Default: ansible
    SLACK_INVOCATION  (optional): Show command line invocation
                                  details. Default: False
Run Code Online (Sandbox Code Playgroud)

该插件可能需要一些修改才能满足您的需求.如果是这种情况,请复制源并将其相对于您的剧本存储为callback_plugins/custom_slack.py,然后在您的ansible.cfg:

callback_whitelist = custom_slack
Run Code Online (Sandbox Code Playgroud)

如果您使用Ansible 1.x,您将必须看到如何转换它.API不同,旧API的示例可以在这里找到:https://github.com/ansible/ansible/tree/v1.9.4-1/plugins/callbacks

  • 不,它属于街区.在它前面有一个破折号,这将是一个单独的任务. (2认同)

小智 5

我写了一个关于如何使用 Block/Rescue 和 Slack 模块(不是回调插件)的完整示例,该模块提供有意义的错误输出和格式:

这里的第一个答案让我成功了一部分,但仅适用于以这种方式为同一件事而苦苦挣扎的其他任何人!

一个简单的剧本示例如下所示:

剧本/剧本.yml

- 主机:“{{ target_host | default('127.0.0.1') }}”
  收集事实:真实

  任务:
  - 堵塞:
    - 包括角色:
        名称: install_app
    - 名称:向世界问好
      壳:回声“你好世界!”
    - 失败:
       msg:“我已经离开了,并且失败了!”
    救援:
      - 包括角色:
          名称:slack_handler
          tasks_from:失败

在我的 slack_handler 角色中(为了可重用性):

角色/slack_handler/tasks/failure.yml

- 名称:通知 Slack 的 Playbook 失败
  松弛:
    用户名:'Ansible'
    颜色:危险
    令牌:“{{ slack_webhook.split('https://hooks.slack.com/services/')[1] }}”
    频道:“#deployment-alerts”
    msg: "Ansible 在 *{{ ansible_hostname }} ({{ inventory_hostname }})* 上失败 * \n
    *任务*:{{ ansible_failed_task.name }} \n
    *动作*:{{ ansible_failed_task.action }} \n
    *错误信息*:\n ```{{ ansible_failed_result | to_nice_json }}``` "
  delegate_to: 本地主机

参考:http : //www.petewilcock.com/ansible-slack-failure-handler/