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
Спасибо!
Я создал файл с вашим выводом. Поэтому я использовал 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
Вы можете перебирать так:
- debug:
msg: "{{ item[1] }}"
with_subelements:
- "{{ jenkins_ecs_containers }}"
- containerInstanceArns
Пройдите этот ссылка, он станет понятнее.
Во-первых, это не сработает, потому что jenkins_ecs_containers
не содержит containerInstanceArns
. Замените это на jenkins_ecs_containers.stdout.containerInstanceArns
, и вы получите ту же ошибку, что и O.P.
Проверить это сейчас
Это тоже не работает: fatal: [localhost]: FAILED! => {"msg": "subelements lookup expects a dictionary, got '[]'"}
Спасибо @Jack, это именно то, что я сделал.