Как в Ansible перебрать стандартный вывод с помощью массива?

Ansible v2.6.3

У меня есть простая задача: получить ARN AWS ​​в моем кластере jenkins ECS.

  tasks:
  - command: aws ecs list-container-instances --cluster jenkins
    register: jenkins_ecs_containers

  - debug: var=jenkins_ecs_containers.stdout

и имеет следующий вывод

TASK [debug] *******************************************************************
ok: [localhost] => {
    "jenkins_ecs_containers.stdout": {
        "containerInstanceArns": [
           "arn:aws:ecs:us-east-1:arn0", 
           "arn:aws:ecs:us-east-1:arn1"
        ]
    }
}

Как я могу перебирать ARN? Я пытался

- debug: var=item
  with_items: jenkins_ecs_containers.stdout.containerInstanceArns

дает

TASK [debug] *******************************************************************
ok: [localhost] => (item=jenkins_ecs_containers.stdout.containerInstanceArns) => {
    "item": "jenkins_ecs_containers.stdout.containerInstanceArns"
}

или

- debug: var=item
  with_items: "{{ jenkins_ecs_containers.stdout.containerInstanceArns }}"

дает

TASK [debug] *******************************************************************
fatal: [localhost]: FAILED! => {"msg": "'ansible.utils.unsafe_proxy.AnsibleUnsafeText object' has no attribute 'containerInstanceArns'"}
    to retry, use: --limit @/Users/cfouts/git-repos/ansible/playbooks/loop.retry

Спасибо!

Введение в Ansible Roles
Введение в Ansible Roles
Ansible - это отличный инструмент управления конфигурацией, который можно использовать для автоматизации настройки или развертывания на большом...
0
0
1 714
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я создал файл с вашим выводом. Поэтому я использовал set_fact. В противном случае это просто строка, а не объект JSON:

  tasks:

  - command: cat files/stdout.txt
    register: result

  - debug: var=result.stdout

  - set_fact:
      jenkins_ecs_containers: "{{ result.stdout }}"

  - debug:
      msg: "{{ item }}"
    with_items: "{{ jenkins_ecs_containers.containerInstanceArns }}"

Это дало мне следующий результат:

PLAY [localhost] ***************************************************************

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

TASK [command] *****************************************************************
changed: [localhost]

TASK [debug] *******************************************************************
ok: [localhost] => {
    "result.stdout": {
        "containerInstanceArns": [
            "arn:aws:ecs:us-east-1:arn0", 
            "arn:aws:ecs:us-east-1:arn1"
        ]
    }
}

TASK [set_fact] ****************************************************************
ok: [localhost]

TASK [debug] *******************************************************************
ok: [localhost] => (item=None) => {
    "msg": "arn:aws:ecs:us-east-1:arn0"
}
ok: [localhost] => (item=None) => {
    "msg": "arn:aws:ecs:us-east-1:arn1"
}

PLAY RECAP *********************************************************************
localhost                  : ok=5    changed=1    unreachable=0    failed=0   

Спасибо @Jack, это именно то, что я сделал.

Chris F 26.10.2018 17:11

Вы можете перебирать так:

- debug:
    msg: "{{ item[1] }}"
  with_subelements:
    - "{{ jenkins_ecs_containers }}"
    - containerInstanceArns

Пройдите этот ссылка, он станет понятнее.

Во-первых, это не сработает, потому что jenkins_ecs_containers не содержит containerInstanceArns. Замените это на jenkins_ecs_containers.stdout.containerInstanceArns, и вы получите ту же ошибку, что и O.P.

Jack 26.10.2018 05:29

Проверить это сейчас

robinhoodjr 26.10.2018 06:06

Это тоже не работает: fatal: [localhost]: FAILED! => {"msg": "subelements lookup expects a dictionary, got '[]'"}

Jack 26.10.2018 06:50

Другие вопросы по теме