I am trying to access the variable using loop, but it’s not working for me.
playbook
---
- name: test looping
hosts: localhost
gather_facts: False
vars:
repos:
- name: repo1
os_list:
- centos
- rhel
major_distribution_list:
- 6
- 7
- 8
archs:
- noarch
- x86_64
tasks:
- include_tasks: repo-paths.yml
with_items: "{{ repos }}"
loop_control:
loop_var: repo
- debug: msg="./{{ item.0 }}/{{ item.1 }}/{{ item.2 }}/{{ item.3 }}"
with_nested:
- "{{ repo.os_list }}"
- "{{ repo.major_distribution_list }}"
- "{{ repo.name }}"
- "{{ repo.archs }}"
But i am getting error repo variable is undefined.
Original Ouput:-
PLAY [test looping] ***********************************************************************************************************************************************************
TASK [include_tasks] **********************************************************************************************************************************************************
TASK [debug] ******************************************************************************************************************************************************************
fatal: [localhost]: FAILED! => {"msg": "'repo' is undefined"}
PLAY RECAP ********************************************************************************************************************************************************************
localhost : ok=0 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
Expected output:-
"msg": "./centos/6/repo1/noarch"
"msg": "./centos/6/repo1/x86_64"
"msg": "./centos/7/repo1/noarch"
"msg": "./centos/7/repo1/x86_64"
"msg": "./centos/8/repo1/noarch"
"msg": "./centos/8/repo1/x86_64"
"msg": "./rhel/6/repo1/noarch"
"msg": "./rhel/6/repo1/x86_64"
"msg": "./rhel/7/repo1/noarch"
"msg": "./rhel/7/repo1/x86_64"
"msg": "./rhel/8/repo1/noarch"
"msg": "./rhel/8/repo1/x86_64"
Please help me and please also tell if there is some alternative to do the same.
2
Answers
You need to put this:
into a file named
repo-paths.yml
. This is becausewith_items: "{{ repos }}"
runs loop over single taskinclude_tasks: repo-paths.yml
and passes therepo
variable to tasks inside the imported file. The loop does not affect consequent tasks in the same file.The
loop_control
statement is defined for the first task and relates only to it. It’s not kept thru the rest of the playbook. If you want to use it in thewith_nested
task, it needs to be stated again.The second problem you have is
with_nested
. Yourrepos
variable is a list containing one element. To support iterating over the list, you should define yourdebug
tasks in it’s own file, and useinclude_tasks
withloop
over the list. Something like this