Ansible rds_instance не ожидает завершения изменения multi az - PullRequest
0 голосов
/ 25 февраля 2020

Привет вместе,


Мне нужно закрыть экземпляры RDS. Однако, когда экземпляр RDS имеет развертывание Multi-AZ, их невозможно остановить. Следовательно, необходимо модифицировать развертывание для депломента Multi-AZ. Тогда я подумал, что смогу остановить дело.
При окончательном запуске экземпляра после его доступности он должен быть изменен на развертывание Multi-AZ.
Тем не менее, я борюсь с этой самой ansible пьесой, которая исполняется внутри конвейера Jenkins, так как она не «ждет», пока изменение не будет успешно выполнено и состояние RDS «доступно».

Здесь это файлы

### vars/rds.yml
my_rds_state:
  running:
    name: started
    description: Starting
    multiZone: true
  stopping:
    name: stopped
    description: Stopping
    multiZone: false

### manage_rds.yml
---
- hosts: localhost
  vars:
    rdsState: "{{instanceState}}"
    rdsIdentifier: "{{identifier}}"


  tasks:                                                                                                  

    - name: Include vars
      include_vars: rds.yml

    - import_tasks: tasks/task_modify_rds.yml
      when: rdsState == "stopping"

    - debug:
        var: my_rds_state

    - import_tasks: tasks/task_state_rds.yml

    - import_tasks: tasks/task_modify_rds.yml
      when: rdsState == "running



### tasks/task_modify_rds.yml
- name: Modify RDS deployment
  rds_instance:
    db_instance_identifier: "{{rdsIdentifier}}"
    apply_immediately: yes
    multi_az: "{{my_rds_state[rdsState].multiZone | bool}}"
    state: "{{my_rds_state[rdsState].name}}"

Значение my_rds_state:

my_rds_state:
    ok: [localhost] => {
        "my_rds_state": {
            "running": {
                "description": "Starting", 
                "multiZone": false, 
                "name": "started"
            }, 
            "stopping": {
                "description": "Stopping", 
                "multiZone": true, 
                "name": "stopped"
            }
        }
    }

Кроме того, вывод консоли выглядит следующим образом:

TASK [Modify RDS deployment] **********************************************
changed: [localhost]

TASK [Stopping RDS instances] **************************************************
An exception occurred during task execution. To see the full traceback, use -vvv. The error was: InvalidDBInstanceStateFault: An error occurred (InvalidDBInstanceState) when calling the StopDBInstance operation: Cannot stop or start a SQLServer MultiAz database instance
fatal: [localhost]: FAILED! => {"boto3_version": "1.11.8", "botocore_version": "1.14.8", "changed": false, "error": {"code": "InvalidDBInstanceState", "message": "Cannot stop or start a SQLServer MultiAz database instance", "type": "Sender"}, "msg": "Unable to stop DB instance: An error occurred (InvalidDBInstanceState) when calling the StopDBInstance operation: Cannot stop or start a SQLServer MultiAz database instance", "response_metadata": {"http_headers": {"connection": "close", "content-length": "311", "content-type": "text/xml", "date": "Tue, 25 Feb 2020 00:01:26 GMT", "x-amzn-requestid": "215571e3-12b6-4b1f-b640-587f3e1686fe"}, "http_status_code": 400, "request_id": "215571e3-12b6-4b1f-b640-587f3e1686fe", "retry_attempts": 0}}

Любые идеи, в чем может быть проблема, почему ansible не ждет?

1 Ответ

0 голосов
/ 05 марта 2020

Я нашел решение сам. Поскольку запуск действия, вызывающего изменение состояния на «изменение», является асинхронной операцией, мне пришлось использовать своего рода официанта.

- name: Wait until the DB instance status changes to 'modifying'
  rds_instance_info:
    db_instance_identifier: "{{rdsIdentifier}}" 
  register: database_info
  until: database_info.instances[0].db_instance_status == "modifying"
  retries: 18
  delay: 10
  when: 
    - rds_instance_info.db_instance_status != "modifying"
...