Ansible - 出错时,退出角色并 运行 清理
Ansible - On error, exit role and run cleanup
我正在尝试在 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"
以及文档中的其他内容,但我真正想要的只是一种使用 "block" 和 "rescue" 命令之类的方法,但据我所知只适用于同一本书和戏剧,而不是角色。有谁有好的方法吗?
将角色中的任务包装成 block/rescue 事物。
确保救援块至少有一项任务——这样 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_task
和 ansible_failed_result
当命中 rescue 块时。
所以你可以在你的 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
事实。
我正在尝试在 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"
以及文档中的其他内容,但我真正想要的只是一种使用 "block" 和 "rescue" 命令之类的方法,但据我所知只适用于同一本书和戏剧,而不是角色。有谁有好的方法吗?
将角色中的任务包装成 block/rescue 事物。
确保救援块至少有一项任务——这样 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_task
和 ansible_failed_result
当命中 rescue 块时。
所以你可以在你的 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
事实。