繁体   English   中英

如何使用 jinja2 解析 ansible vars dict

[英]How to parse ansible vars dict with jinja2

假设我有这样的主机特定变量:

projects:
  - project1:
    urls:
    - "https://foo.bar"
    - "https://foo2.bar2"
    names:
    - "some_name"
    address: 
      city1:
      - "street1"
      - "street2"
      city2:
      - "streetX"

而且我必须使用 jinja2 模板生成文件(每个项目)。 我将使用所有嵌套变量...

我应该改变我的 vars dict 结构还是这个可以..? 我怎样才能得到所有这些嵌套变量?

我试过了:

  - name: Create projects
    ansible.builtin.template:
      src: project.yml.j2
      dest: "/client/projects/{{ item | dict2items| json_query('[0].key') }}.yaml"
    loop: "{{ projects }}"

然后,我在模板文件中迷失了所有循环和这些 json_queries 的 vars 长度......

  1. 这是一个好方法还是有更好的方法?
  2. 你能帮我定义所有嵌套的键/值吗? 或者有什么简单的方法可以得到它们?

您的实际结构没有多大意义。 您要么想要使用列表或字典,而不是使用具有 null 值的键之间的东西

我怀疑您正在寻找字典:

projects:
  project1:
    urls:
      - "https://foo.bar"
      - "https://foo2.bar2"
    names:
      - "some_name"
    address: 
      city1:
        - "street1"
        - "street2"
      city2:
        - "streetX"
  project2:
    # etc.

从那里,鉴于您的文件扩展名为 yaml,我猜您想要一个看起来像这个project.yml.j2文件的模板:

---
{{ item.value | to_yaml }}

您将像这样调用它来创建一个以每个项目命名的文件

  - name: Create projects
    template:
      src: project.yml.j2
      dest: "/client/projects/{{ item.key') }}.yaml"
    loop: "{{ projects | dict2items }}"

请注意,对于简单的事情,您可以通过直接在content选项中使用copy和流式传输内容来消除外部模板文件的负担:

  - name: Create projects
    copy:
      dest: "/client/projects/{{ item.key') }}.yaml"
      content: "{{ item.value | to_yaml }}"
    loop: "{{ projects | dict2items }}"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM