ssh失败时退出



在我的剧本中,我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的资源喜欢你说"把我放进去"加州",然后决定如何到达那里。如果你已经在加州,什么都不需要发生,它会让你知道的不需要更改任何内容。

相关内容

  • 没有找到相关文章

最新更新