使用multi-ter group_vars的Ansible循环

时间:2016-08-04 14:50:32

标签: ansible ansible-playbook ansible-2.x

我尝试使用group_vars在ansible中动态创建模板,但似乎无法使嵌套循环正常工作。

在group_vars中,我有

my_environment:
  serv1:
    foo: 2
    bar: 3
    baz: 3
  serv2:
    foo: 1

我试图创建以下结构:

/serv1/foo1
/serv1/foo2

/serv1/bar1
/serv1/bar2
/serv1/bar3

/serv1/baz1
/serv1/baz2
/serv1/baz3

/serv2/foo1

创建上述内容后,我想将模板文件放入每个目录中,最终结果如下:

/serv1/bar1/template

/serv2/foo1/template

我的剧本:

- debug: msg="{{ ce }}"
  with_list:
    - "{{ item.value }}"
  loop_control:
    loop_var: ce

以上输出:

ok: [localhost] => (item=None) => {
    "ce": {
        "bar": 3,
        "baz": 3,
        "foo": 2
    },
    "msg": {
        "bar": 3,
        "baz": 3,
        "foo": 2
    }
}

问题是,如何使用foo的值迭代2次来创建结构?每当我使用include: with_dictinclude: with_list时,我一直只是获取上面的列表?我无法找到一种方法来横扫......

1 个答案:

答案 0 :(得分:1)

最好的方法是编写自己的查找插件,从输入中形成所需的路径列表。

使用标准查找(循环),您可以这样做:
x.yml:

- hosts: localhost
  vars:
    my_environment:
      serv1:
        foo: 2
        bar: 3
        baz: 3
      serv2:
        foo: 1
  tasks:
    - include: x2.yml
      with_dict: "{{ my_environment }}"
      loop_control:
        loop_var: my_server

x2.yml:

- include: x3.yml
  with_dict: "{{ my_server.value }}"
  loop_control:
    loop_var: my_param

x3.yml:

- debug: var=item
  with_sequence: end={{ my_param.value }} format=/{{ my_server.key }}/{{ my_param.key }}%1d/template
x3.yml中的

debug您可以使用template替换,并使用{{ item }}作为dest