簡體   English   中英

為列表中的每個項目向模板添加新行

[英]Add new line to template for each item in a list

給定以下示例列表和 Jinja 模板:

列表:

list:
    - foo
    - bar

神社模板:

{% for key in list %}
results:
      - "{{ key }}"
{% endfor %}

我能夠生成以下 output:

results:
    - foo
results:
    - bar

對於列表中的每個項目,我如何代替 append 一行到模板以產生此結果?

results:
    - foo
    - bar

Ansible 是否可以不使用lineinfile之類的東西? 我或多或少地嘗試復制可能如下所示的Helm 范圍過濾器

results:
    {{- range .Values.list }}
    - {{ . }}
    {{- end }}

join過濾器似乎讓我更接近了一點。 例如:

results:
    - "{{ list | join('\n- ') }}"

產生以下內容。 但它在語法上還不正確:

results:
    - "foo
- bar"

給定清單

list: - foo - bar

問: “產生這個結果!”

 results: - foo - bar

A:還有更多選擇:

  1. 您可以迭代列表
 - copy: dest: /tmp/test.yml content: | results: {% for key in list %} - {{ key }} {% endfor %}

shell> cat /tmp/test.yml results: - foo - bar

您可以將模板放入文件中

shell> cat templates/test.yml.j2 results: {% for key in list %} - {{ key }} {% endfor %}

然后,模板模塊給出相同的結果

 - template: dest: /tmp/test.yml src: test.yml.j2

  1. 下一個選項是Ansible 格式化過濾器和 Jinja縮進過濾器。 下面的任務給出了相同的結果
shell> cat /tmp/test.yml 
results:
    - foo
    - bar
  1. 如果你願意,你可以使用標簽
 - copy: dest: /tmp/test.yml content: | results: {% for key in list %} {{ '{}- {}'.format(tab, key) }} {% endfor %} vars: tab: "{{ '\t' }}"

標簽間距將取決於尋呼機

shell> cat /tmp/test.yml results: - foo - bar

它很難看,但我使用join過濾器和一些轉義序列得到了它。 這個:

results:
    - "{{ list | join('\"\n    - \"') }}"

產生以下內容:

results:
    - "foo"
    - "bar"

為了未來的谷歌員工清楚起見,拆除它......

list | join('') list | join('') - 檢索可變列表並使用以下定界符序列“加入”它們,這會以迂回的方式有效地引入列表項

\" - 在項目末尾添加一個"字符

\n - 在 4 個空格中添加換行符和制表符。 有關更多信息,請參見腳注。

- \" - 在添加每個連續的列表項之前添加一個新的- "

不確定是否可以在不將每個模板化列表項用引號引起來的情況下實現這一點。 但這在語法上是正確的,所以我將保留它。

腳注:如果您使用\t而不是添加空白字符,Ansible 將拋出以下錯誤:

味精:

加載 resource_definition 時出錯:掃描下一個標記時發現無法啟動任何標記的字符“\t”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM