My goal is to have a task that runs in a loop over multiple objects in a list, one of those objects is a list itself. When i seperate the list from the normal vars it works as expected, to save code i want to do them both in the same task.
The following playbook does not work for me, it just prints all the objects of the list instead of iterating over them, how can i iterate over them essentially as a nested list? Ty very much :)
I have the following playbook:
- hosts: localhost
connection: local
gather_facts: false
vars:
test_var:
- name: "ben"
- name: "ben_test"
tasks:
- name: test print
shell: "echo {{ item }}"
loop:
- "ben_str"
- "ben_second_str"
- "{{ test_var }}"
Also tried to have in the shell some if
conditionals without success, would love to know so i can save some code instead of double printing.
In my case it's a more complex code, just for simplicity reasons using echo and shell :) Ty for the help.
CodePudding user response:
I'm not entirely sure I get what you are trying to do exactly but I suspect both examples below should achieve what you expect. Meanwhile, I'd like to emphasize your data structure is absolutely not ideal (i.e. mix of string and list within the same list, mix of strings and objects in the same result flattened list....).
Note: the list of options below is not exhaustive
Option 1:
- name: test print
debug:
var: item
vars:
my_list:
- "ben_str"
- "ben_second_str"
- "{{ test_var | map(attribute='name') }}"
loop: "{{ my_list | flatten }}"
Option 2:
- name: test print
debug:
var: item
with_items:
- "ben_str"
- "ben_second_str"
- "{{ test_var | map(attribute='name') }}"
Option 3:
- name: test print
debug:
var: item
vars:
my_other_list:
- "ben_str"
- "ben_second_str"
loop: "{{ my_other_list test_var | map(attribute='name') }}"
which all give inserted in your above original play containing the test_var
definition:
TASK [test print] ************************************************************
ok: [localhost] => (item=ben_str) => {
"ansible_loop_var": "item",
"item": "ben_str"
}
ok: [localhost] => (item=ben_second_str) => {
"ansible_loop_var": "item",
"item": "ben_second_str"
}
ok: [localhost] => (item=ben) => {
"ansible_loop_var": "item",
"item": "ben"
}
ok: [localhost] => (item=ben_test) => {
"ansible_loop_var": "item",
"item": "ben_test"
}