Ansible - сыграть роль даже в случае предыдущего отказа - PullRequest
0 голосов
/ 07 августа 2020

Я создаю учебник для amazon AMI builder. Идея такова:

  • создать экземпляр EC2
  • подготовить его
  • зарегистрировать AMI
  • завершить экземпляр EC2

Я хотел бы завершить работу экземпляра 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

Я хочу, чтобы последняя игра была запущена, даже если предыдущая игра не удалась. Есть ли (желательно чистый) способ сделать это?

[EDIT] Я попробовал ответить @ 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

Спасибо

1 Ответ

1 голос
/ 07 августа 2020
  1. ansible метод, который вы можете использовать ansible delegate_to и block always

delegate_to может позволить вам запускать playbook на других хостах

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
Также можно использовать упаковщик, так проще собрать AMI в AWS. https://www.packer.io/intro
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...