[英]Ansible - Convert a list inside a dictionary to a list of dictionaries, then put it in a play
如果有更好的方法可以完全做到這一點,我將首先准確說明我想要實現的目標。
我正在嘗試使用記錄在“theforeman.foreman.content_view”Ansible 模塊下的“redhat.satellite.content_view”Ansible 模塊來讀取以下變量並以冪等性循環遍歷它。
composite_content_views:
- name: 'ccv-number1'
content_views:
- 'cv-number1'
- 'cv-number2'
- name: 'ccv-number2'
content_views:
- 'cv-number3'
- 'cv-number4'
- 'cv-number5'
我試圖實現的最終結果如下,但只使用上面的變量和循環。
- name: create composite content views
redhat.satellite.content_view:
name: ccv-number1
composite: true
components:
- content_view: 'cv-number1'
latest: true
- content_view: 'cv-number2'
latest: true
然后
- name: create composite content views
redhat.satellite.content_view:
name: ccv-number2
composite: true
components:
- content_view: 'cv-number3'
latest: true
- content_view: 'cv-number4'
latest: true
- content_view: 'cv-number5'
latest: true
在嘗試了各種方法之后,我真的一直在摸不着頭腦,所以我們將不勝感激任何幫助。 :)
我已經嘗試使用各種過濾器進行循環以嘗試使用類似下面的內容,但未能使其正常工作。
- name: create composite content views
redhat.satellite.content_view:
name: "{{ item.name }}"
composite: true
components: "{{ list of dictionaries here with only the 'cv-numberX' values changing }}"
在每次迭代中聲明
components: "{{ item.content_views|
map('community.general.dict_kv', 'content_view')|
map('combine', {'latest': true})|
list }}"
給
components:
- content_view: cv-number1
latest: true
- content_view: cv-number2
latest: true
和
components:
- content_view: cv-number3
latest: true
- content_view: cv-number4
latest: true
- content_view: cv-number5
latest: true
用於測試的完整劇本示例
- hosts: localhost vars: composite_content_views: - name: ccv-number1 content_views: - cv-number1 - cv-number2 - name: ccv-number2 content_views: - cv-number3 - cv-number4 - cv-number5 tasks: - debug: msg: | name: {{ item.name }} composite: true components: {{ components|to_nice_yaml }} loop: "{{ composite_content_views }}" vars: components: "{{ item.content_views| map('community.general.dict_kv', 'content_view')| map('combine', {'latest': true})| list }}"
任務示例
- name: create composite content views redhat.satellite.content_view: name: "{{ item.name }}" composite: true components: "{{ components }}" loop: "{{ composite_content_views }}" vars: components: "{{ item.content_views| map('community.general.dict_kv', 'content_view')| map('combine', {'latest': true})| list }}"
Jinja 模板給出了相同的結果
components: | [{% for i in item.content_views %} {"content_view": "{{ i }}", "latest": "true"}, {% endfor %}]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.