首页 > 解决方案 > Ansible - 即使在以前失败的情况下也能发挥作用

问题描述

我正在构建亚马逊 AMI 构建器剧本。这个想法是:

在任何情况下,我都想终止 EC2 实例,即使之前的步骤失败了。

我的剧本目前看起来像(生成的 EC2 实例被动态添加到角色中的ec2_servers组中aws_spawn_ec2)):

---
- hosts: localhost
  connection: local
  gather_facts: False
  roles:
    - role: aws_spawn_ec2
      vars:
        ec2_host_group: ec2_servers


- hosts: ec2_servers
  roles:
    - role: provision_ec2


- hosts: localhost
  connection: local
  gather_facts: False
  roles:
    - role: aws_ami_register


- hosts: localhost
  connection: local
  gather_facts: False
  roles:
    -role: aws_terminate_ec2

即使以前的播放失败,我也希望运行最后的播放。有没有(最好是干净的)这样做的方法?

[编辑] 我试过@Z.Liu 的回答,我得到了以下错误: ERROR! 'delegate_to' is not a valid attribute for a IncludeRole

然后我尝试了:

        - name: provision ec2
          include_role:
            name: provision_ec2
            apply:
              delegate_to: ec2_servers

但我现在有这个错误:

TASK [provision ec2 : Check if reboot is required] **********************************************************************************************************
fatal: [localhost]: FAILED! => {"msg": "The conditional check 'reboot_required.stat.exists' failed. The error was: error while evaluating conditional (reboot_required.stat.exists): 'dict object' has no attribute 'stat'"}

我有ansible 2.9.10

谢谢

标签: amazon-web-servicesansible

解决方案


  1. ansible 方法,您可以利用 ansibledelegate_toblock always

delegate_to可以让你在其他主机上运行剧本

always无论之前的任务结果如何,都会执行任务。

- name: update AMI
  hosts: localhost
  tasks:
    - name: spawn new ec2 instance
      include_role:
        name: aws_spawn_ec2
      vars:
        ec2_host_group: ec2_servers

    - name: provision only spaw ec2 succeed
      block:
        - name: provision ec2
          include_role:
            name: provision_ec2
          delegate_to: ec2_servers

        - name: registe aws AMI
          include_role:
            name: aws_ami_register
      always:
        - name: terminate ec2 instance regardless of the ami registration results
          include_role:
            name: aws_terminate_ec2

  1. 您也可以使用 packer,在 AWS 中构建 AMI 更容易。 https://www.packer.io/intro

推荐阅读