0

在我的游戏中,我 ssh 到主机并执行多个角色,但是如果我无法 ssh 到实例中,则下一个包含继续进行,我喜欢在 - 构建无法执行时退出/失败

这是一个例子,

仅供参考 - 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

构建.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
4

1 回答 1

0

我建议使用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 剧本应该使用幂等性概念:

仅在需要应用更改命令时才应应用更改命令的概念,并且最好描述系统的所需状态而不是如何到达该状态的过程。打个比方,从美国北卡罗来纳州到加利福尼亚州的道路需要向西行驶一段很长的路,但如果我在阿拉斯加的安克雷奇,向西行驶很长一段路不再是到达加利福尼亚的正确方式。Ansible 的资源就像你说“把我放在加利福尼亚”,然后决定如何到达那里。如果你已经在加利福尼亚,什么都不需要发生,它会让你知道它不需要改变任何东西。

于 2016-04-20T18:08:41.070 回答