Ansible не выполняется задача rds_instance из-за неправильной оценки переменной - PullRequest
0 голосов
/ 29 января 2020

Я борюсь с ansible, так как задача, определенная в playbook, не выполняется для управления экземпляром AWS. Rds.

Это команда, которую я выполняю в конвейере jenkins:

состояние: "выполняется"

идентификатор: "myDatabase"

 sh "ansible-playbook ${env.WORKSPACE}/cost-optimization/ansible/manage_rds.yml --extra-vars 'instanceState=${state} identifier=${dbsIdentifier}'"

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

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

  tasks:

    - name: "Starting RDS instances"
      rds_instance:
        state: running
        db_instance_identifier: "{{ rdsIdentifier }}"
        wait: yes
      register: rds_result
      when: rdsState == "running"


    - name: "Stopping RDS instances"
      rds_instance:
        state: stopping
        db_instance_identifier: "{{ rdsIdentifier }}"
        wait: yes
      register: rds_result
      when: rdsState == "stopped"


    - name: Show RDS result
      debug:
        var: rds_result

    - import_tasks: tasks/task_create_partial_report.yml
      vars:
        identifier: "{{rdsIdentifier|lower}}"
        partial: "db"

Я ожидаю экземпляр AWS RDS раскручивается Вместо этого результат выглядит следующим образом:

TASK [Starting RDS instances] **************************************************
ok: [localhost]

TASK [Stopping RDS instances] **************************************************
skipping: [localhost]

TASK [Show RDS result] *********************************************************
ok: [localhost] => {
    "rds_result": {
        "changed": false, 
        "skip_reason": "Conditional result was False", 
        "skipped": true
    }
}

Любая идея, как решить эту проблему?

РЕДАКТИРОВАТЬ:

Я следовал рекомендации ниже. Тем не менее, экземпляр RDS все еще не затронут:

    + ansible-playbook /var/lib/jenkins/workspace/.../ansible/manage_rds.yml --extra-vars 'instanceState=running identifier=myDatabase'
PLAY [localhost] ***************************************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Starting RDS instances] **************************************************
ok: [localhost]

TASK [Show RDS result] *********************************************************
ok: [localhost] => {
    "rds_result": {
        "allocated_storage": 20, 
        "associated_roles": [], 
        "auto_minor_version_upgrade": false, 
        "availability_zone": "eu-central-1a", 
        "backup_retention_period": 21, 
        "ca_certificate_identifier": "rds-ca-2015", 
        "changed": false, 
        "character_set_name": "SQL_Latin1_General_CP1_CI_AS", 
        "copy_tags_to_snapshot": true, 
        "db_instance_arn": "arn:aws:rds:mydatabase", 
        "db_instance_class": "db.t2.micro", 
        "db_instance_identifier": "mydatabase", 
        "db_instance_port": 0, 
        "db_instance_status": "stopped", 
        "db_parameter_groups": [
            {
                "db_parameter_group_name": "....-sqlserver-ex-14-00", 
                "parameter_apply_status": "in-sync"
            }
        ], 
...

Таким образом, состояние остается остановленным, даже если оно настроено на работу.

1 Ответ

0 голосов
/ 29 января 2020

register зарегистрирует результат задания, что бы это ни было четным, если оно пропущено.

В вашем случае вы запускаете первое задание when: rdsState == "running", регистрируете результат этого успешного запустите и немедленно переопределите ваш зарегистрированный var с пропущенным результатом задачи.

Существует несколько решений для go, кроме этого. Я просто дам 2 из своей шляпы здесь:

  1. Отладка var после каждой задачи

Вы можете добавить следующую задачу после каждого rds_instance call

    - name: Show RDS result
      debug:
        var: rds_result
      when: rds_result is not skipped

Это напечатало бы только после каждой задачи, если она была фактически выполнена.

Выполнить одно параметризованное задание

Вам необходимо сопоставить значение вашей переменной с ожидаемым в параметрах модуля. Добавьте к своим переменным следующее:

    my_rds_state:
      running:
        name: started
        description: Starting
      stopped:
        name: stopped
        description: Stopping

Тогда у вас может быть одно задание, которое выполнит работу независимо от параметра:

    - name: "{{ my_rds_state[rdsState].description }} RDS instances"
      rds_instance:
        state: "{{ my_rds_state[rdsState].name }}"
        db_instance_identifier: "{{ rdsIdentifier }}"
        wait: yes
      register: rds_result

    - name: Show RDS result
      debug:
        var: rds_result
...