Ansible Задача не выполняется при условии - PullRequest
3 голосов
/ 16 июня 2020

My Ansible Задача завершается неудачно с ложным условием при условии (задача должна завершиться ошибкой, только если условие «когда» истинно)

My Playbook

    - name: 'Check if any task is existing'
      command: aws ecs list-tasks --cluster mycluster --query length(taskArns[*])
      register: ecs_tasks

    - name: 'Fail playbook if some task is already existing in cluster'
      fail:
        msg: "There is already an existing task in mycluster"
      when: ecs_tasks.stdout != 0

    - name: 'Create Ranger task'
      command: create ECS task
      register: ecs_task

Вывод

    "stderr": "", 
    "stderr_lines": [], 
    "stdout": "0", 
    "stdout_lines": [
        "0"
    ]
    }

    TASK [Fail playbook if some task is already existing in cluster] ***************
    task path: /home/somepath/Task.yml:35
    fatal: [127.0.0.1]: FAILED! => {
    "changed": false, 
    "msg": "There is already an existing task in mycluster"
    }

    PLAY RECAP *********************************************************************
09:09:38  127.0.0.1                  : ok=5    changed=4    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0    

Это какая-то проблема с моим форматом условия when, потому что я пробовал различные условия, такие как> 0 и> = 1, но не повезло, поскольку он все еще не работает (в моем кластере ECS нет задач), а также AWS Команда CLI возвращает

aws ecs list-tasks --cluster mycluster --query length(taskArns[*])
0

Ответы [ 2 ]

2 голосов
/ 16 июня 2020

Проблема в том, что вы сравниваете string (в зарегистрированном выходе) с int (в предложении when). Вы должны изменить свое условие when на:

when: ecs_tasks.stdout != "0"

Более того, вам не нужна вторая задача для проверки на сбой, так как вы можете легко использовать условие failed_when для своей первой задачи:

    - name: 'Check if any task is existing'
      command: aws ecs list-tasks --cluster mycluster --query length(taskArns[*])
      register: ecs_tasks
      failed_when: ecs_tasks.stdout != "0"

Примечания на стороне :

  • Обычно рекомендуется проверять код возврата команды, если он по-прежнему значим, чтобы вы не Не анализируйте вывод, который может быть неправильно истолкован без необходимости. В вашем случае, я думаю, вы можете легко изменить свое условие на (обратите внимание, что rc - это int):

    failed_when: ecs_tasks.rc != 0 or ecs_tasks.stdout != "0"
    

    , если ваша команда имеет несколько кодов возврата, которые можно считать успешными (например, 0 и 2), вы можете изменить его на

    failed_when: ecs_tasks.rc not in [0,2] or ecs_tasks.stdout != "0"
    
  • У вас может возникнуть соблазн преобразовать результат сравнения как int, например:

    ecs_tasks.stdout | int != 0
    

    Это должно работать, но имейте в виду, что любое строковое значение в sdtout, не анализируемое как int, приведет к O, например:

    $ ansible localhost -m debug -a msg="{{ 'whatever' | int }}"
    localhost | SUCCESS => {
    "msg": "0"
    }
    
0 голосов
/ 16 июня 2020

Любой из следующих вариантов должен работать:

- name: 'Fail playbook if some task is already existing in cluster'
  fail:
    msg: "There is already an existing task in mycluster"
  when: ecs_tasks.stderr | length > 0

или

- name: 'Fail playbook if some task is already existing in cluster'
  fail:
    msg: "There is already an existing task in mycluster"
  when: ecs_tasks.stderr != ""

Подробнее см. Здесь: Как проверить, что зарегистрированная переменная не пуста?

...