我的目标是让一个任务在一个列表中的多个对象的循环中运行,其中一个对象就是列表本身。当我将列表从普通的vars中分离出来时,它会像预期的那样工作,为了保存代码,我想在相同的任务中完成这两个任务。
下面的剧本不适用于我,它只打印列表的所有对象,而不是迭代它们,我如何从本质上将它们作为嵌套列表来迭代呢?Ty非常:)
我有以下的剧本:
- 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 }}"
也试图在shell中有一些if
条件,但没有成功,我很想知道,这样我就可以保存一些代码,而不是双重打印。
在我的例子中,这是一个更复杂的代码,只是出于简单的原因,使用echo和shell :) Ty作为帮助。
发布于 2022-10-31 08:14:26
我不完全肯定我完全明白你想要做的事情,但我怀疑下面这两个例子都能达到你的期望。同时,我想强调您的数据结构是绝对不理想的(即在同一个列表中混合字符串和列表,在相同的结果扁平列表中混合字符串和对象……)。
注:以下选项清单并非详尽无遗。
备选案文1:
- name: test print
debug:
var: item
vars:
my_list:
- "ben_str"
- "ben_second_str"
- "{{ test_var | map(attribute='name') }}"
loop: "{{ my_list | flatten }}"
备选案文2:
- name: test print
debug:
var: item
with_items:
- "ben_str"
- "ben_second_str"
- "{{ test_var | map(attribute='name') }}"
备选方案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') }}"
它们都是插入到上面包含test_var
定义的原始剧本中的:
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"
}
https://stackoverflow.com/questions/74265647
复制