我试图在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;命令,但据我所知,这只适用于同一本书和戏剧,而不是角色。有没有人有这样做的好方法?
答案 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_task
和ansible_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
事实检查。