Ansible嵌套循环,如何基于外部变量设置内部循环变量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ansible嵌套循环,如何基于外部变量设置内部循环变量相关的知识,希望对你有一定的参考价值。

我在ansible上遇到嵌套循环问题。

我正在使用ansible 2.5.2以及以下配置文件:

文件主机:

[group1]
host1
host2
host3
[group2]
hostA

file host_vars / host {N}(其中N是group1上每个主机的编号):

variable:
  - { line: "keyB" , file: "keyc"}
  - { line: "key2" , file: "key3"}

我需要在hostAvars / host {N}中的每一行上执行hostA一项任务。

在伪代码中,需要这样的东西:

- name: modify file
  for host in groups['group1']:
    for item in host['variables']:
      lineinfile: "path={{ host }}/{{ item.file }} line={{ item.line }}"

使用jinja2循环不起作用:

- name: Modify files
  lineinfile: "{% for linea in hostvars[item]['variables'] %}
              path={{ item }}/{{ linea.file }}
              line={{ linea.line }}
              {% endfor %}"
  loop: "{{ groups['group1'] }}"

正常的嵌套循环不起作用,因为内部循环取决于主机名:

- name: Modify files
  lineinfile: "path={{ item[0] }}/{{ item[1]['file'] }} line={{ item[1]['line'] }}"
  with_nested:
  - "{{ groups['group1'] }}"
  - "{{ hostvars[item[0]]['variables'] }}"

还有另一种循环嵌套循环的方法吗?

答案

我用loop_control解决了我的问题,

我添加了一个新文件:inner.yml

- name: Modify files
  lineinfile: "path={{ outer_item }}/{{ item.file }} line={{ item.line }}"
  loop: "{{ hostvars[outer_item]['variables'] }}"

并定义了我的任务文件如下

- include_tasks: inner.yml
  loop: "{{ groups['group1'] }}"
  loop_control:
    loop_var: outer_item

这解决了我在循环上使用两个嵌套变量的问题。

以上是关于Ansible嵌套循环,如何基于外部变量设置内部循环变量的主要内容,如果未能解决你的问题,请参考以下文章

嵌套查询 - 内部查询循环结束外部查询循环

Ansible变量嵌套解析

Ansible 嵌套循环 - 如何遍历循环项?

逆战班 js双重循环嵌套原理

循环语句的嵌套及练习题

Python中的嵌套循环