在我的剧本中,我ssh到一个主机并执行许多角色,但是,如果我未能ssh到实例中,则不管怎样,下一个include都会继续,id喜欢在-build无法执行时退出/失败
这是的例子
仅供参考-app_ec2在AWS上创建一个实例并设置主机,build.yml然后将配置应用于该实例并启动用户该实例以创建AMI,然后创建ASGroup
---
- hosts: localhost
connection: local
serial: 1
gather_facts: true
any_errors_fatal: true
max_fail_percentage: 0
vars_files:
- "vars/security.vars"
- "vars/{{ env }}/common.vars"
- "vars/server.vars"
roles:
- app_ec2
- include: build.yml
- include: launch-asg.yml
build.yml:
- hosts: "{{ role }}"
serial: 1
gather_facts: true
sudo: yes
any_errors_fatal: true
max_fail_percentage: 0
vars_files:
- "vars/{{ env }}/common.vars"
- "vars/server.vars"
roles:
- default
- restart
- awscli
- cloudwatch-logs
- ntp
- java
- tomcat
- newrelic
- newrelic_apm
- "{{role}}"
- app_liquibase
- restart
我建议使用Ansible Blocks:
tasks:
- block:
- debug: msg='i execute normally'
- command: /bin/false
- debug: msg='i never execute, cause ERROR!'
rescue:
- debug: msg='I caught an error'
- command: /bin/false
- debug: msg='I also never execute :-('
always:
- debug: msg="this always executes"
你可以使用这个变通方法:
- 在当前主机上运行一些剧本(-c local==本地连接)
- 呼叫在连接到远程主机的某个块内部运行ansible,如果阻止失败重试
PS:
可靠的剧本应该使用幂等概念:
更改命令只应在需要时应用的概念以便应用,并且最好描述一个系统比如何达到那个状态的过程更重要。作为类比,从美国北卡罗来纳州到加利福尼亚州的道路包括向西开很长一段路,但如果我在阿拉斯加州的安克雷奇,向西开很长一段路已经不再是正确的方式去加利福尼亚。Ansible的资源喜欢你说"把我放进去"加州",然后决定如何到达那里。如果你已经在加州,什么都不需要发生,它会让你知道的不需要更改任何内容。