在ansible中遍历两个列表

kam*_*iha 5 ansible

我是Ansible和YAML语法的新手,并且面临一个简单的问题:如何使用相同的索引遍历两个列表?

像这样:

int[] listOne;
int[] listTwo;

---  Attribute some values to the lists  ----

for(int i = 0; i < 10; i++){
  int result = listOne[i] + listTwo[i];
}
Run Code Online (Sandbox Code Playgroud)

就我而言,我正在尝试将一些值分配给route53模块,它们位于不同的列表中。

反正有做吗?我刚发现循环遍历单个列表或嵌套列表的循环。

kam*_*iha 5

在Ansible的文档中进行了更好的搜索后,我发现with_together模块(请参阅docs)完全可以满足我的需求。

仔细查看文档很重要:)


sta*_*tor 5

您可以使用loopzip过滤器来做到这一点:

- name: Loop over two lists
  vars:
    list_one: [1, 2, 3]
    list_two: [one, two, three]
  ansible.builtin.debug:
    msg: "{{ item.0 }} - {{ item.1 }}"
  loop: "{{ list_one | zip(list_two) | list }}"
Run Code Online (Sandbox Code Playgroud)

输出:

TASK [Loop over two lists] ***************************************************
ok: [192.168.0.1] => (item=[1, 'one']) => {
    "msg": "1 - one"
}
ok: [192.168.0.1] => (item=[2, 'two']) => {
    "msg": "2 - two"
}
ok: [192.168.0.1] => (item=[3, 'three']) => {
    "msg": "3 - three"
}
Run Code Online (Sandbox Code Playgroud)

对于超过 2 个列表,也只需将它们传递给zip过滤器即可:

loop: "{{ list_one | zip(list_two, list_three, list_four) | list }}"
Run Code Online (Sandbox Code Playgroud)

如果您想将列表组合为笛卡尔积,只需替换zipproduct

loop: "{{ list_one | product(list_two, list_three, list_four) | list }}"
Run Code Online (Sandbox Code Playgroud)

对于上面的示例,输出将是:

TASK [Loop over two lists] ************************
ok: [192.168.0.1] => (item=[1, 'one']) => {
    "msg": "1 - one"
}
ok: [192.168.0.1] => (item=[1, 'two']) => {
    "msg": "1 - two"
}
ok: [192.168.0.1] => (item=[1, 'three']) => {
    "msg": "1 - three"
}
ok: [192.168.0.1] => (item=[2, 'one']) => {
    "msg": "2 - one"
}
ok: [192.168.0.1] => (item=[2, 'two']) => {
    "msg": "2 - two"
}
ok: [192.168.0.1] => (item=[2, 'three']) => {
    "msg": "2 - three"
}
ok: [192.168.0.1] => (item=[3, 'one']) => {
    "msg": "3 - one"
}
ok: [192.168.0.1] => (item=[3, 'two']) => {
    "msg": "3 - two"
}
ok: [192.168.0.1] => (item=[3, 'three']) => {
    "msg": "3 - three"
}
Run Code Online (Sandbox Code Playgroud)