Ansible - 出错,退出角色并运行清理

时间:2016-07-19 21:02:57

标签: amazon-web-services ansible ansible-playbook

我试图在Ansible中启动一个AWS部署环境,我希望能够做到这一点,如果事情一路走来,Ansible就会删掉到目前为止已经启动的AWS上的所有内容。我无法弄清楚如何让Ansible在角色中抛出错误

例如:

<main.yml>
- hosts: localhost
  connection: local
  roles:
    - make_ec2_role
    - make_rds_role 
    - make_s3_role

   2. Then I want it to run some code based on that error here.

<make_rds_role>
    - name: "Make it"
    - rds:
        params: etc <-- 1. Let's say it fails in the middle here

我试过了:

- name: this command prints FAILED when it fails
  command: /usr/bin/example-command -x -y -z
  register: command_result
  failed_when: "'FAILED' in command_result.stderr"

除了文档中的其他内容外,我真正想要的只是一种使用&#34; block&#34;和&#34;救援&#34;命令,但据我所知,这只适用于同一本书和戏剧,而不是角色。有没有人有这样做的好方法?

1 个答案:

答案 0 :(得分:0)

将角色中的任务包裹到阻止/救援物品中 确保救援区块至少有一个任务 - 这样Ansible不会将主机标记为失败 像这样:

- block:
    - name: task 1

    ... # something bad may happen here

    - name: task N

  rescue: 
    - assert: # we need a dummy task here to prevent our host from being failed
        that: ansible_failed_task is defined

在遇到救援区时,Ansible register ansible_failed_taskansible_failed_result的最新版本。
所以你可以在你的main.yml剧本中做一些post_tasks:

  post_tasks:
    - debug:
        msg: "Failed task: {{ ansible_failed_task }}, failed result: {{ ansible_failed_result }}"
      when: ansible_failed_task is defined

但要注意这个技巧不会阻止其他角色执行 因此,在您的示例中,如果make_rds_role失败,则ansible将应用make_s3_role并在之后运行post_tasks。
如果您需要阻止它,请在每个角色的开头添加一些ansible_failed_task事实检查。