簡體   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