使用子元素的 Ansible 双循环
Ansible double loop using subelements
我正在编写一个 Ansible 剧本,我有以下变量:
contracts:
- name: 'https'
subjects:
- name: 'permit'
filters:
- filter: tcp_443
一个合同有多个主题,一个主题可以有多个过滤器。剧本需要遍历这个变量。
我目前正在做以下事情:
- name: Task - Contract Subjects Have Filters
contract_subject_to_filter:
state: "present"
tenant: "{{ tenant }}"
contract: "{{ item..0.name }}"
subject: "{{ item.1.name }}"
filter: "{{ item.2.filter }}"
loop: "{{ contracts | subelements('subjects') | subelements('filters') }}"
tags: contract
{"msg": "Unexpected templating type error occurred on ({{ contracts |
subelements('subjects') | subelements('filters') }}): the key filters
should point to a dictionary, got '({'name': 'https', 'subjects':
[{'name': 'permit', 'filters': [{'filter': 'tcp_443'}]}]}, {'name':
'permit', 'filters': [{'filter': 'tcp_443'}]})'"}
如何在 Ansible 剧本中执行双循环(合同有主题,主题有过滤器)?我无法更改变量结构或使用不同的 Ansible 模块。
展开列表,例如
- set_fact:
my_list: "{{ _my_list|from_yaml }}"
vars:
_my_list: |-
{% for i in contracts %}
{% for j in i.subjects %}
{% for k in j.filters %}
- {name: {{ i.name }}, subject: {{ j.name }}, filter: {{ k.filter }}}
{% endfor %}
{% endfor %}
{% endfor %}
给予
my_list:
- filter: tcp_443
name: https
subject: permit
那么,迭代是微不足道的
- name: Task - Contract Subjects Have Filters
debug:
msg: |-
state: "present"
tenant: "tenant"
contract: "{{ item.name }}"
subject: "{{ item.subject }}"
filter: "{{ item.filter }}"
loop: "{{ my_list }}"
给予
msg: |-
state: "present"
tenant: "tenant"
contract: "https"
subject: "permit"
filter: "tcp_443"
我正在编写一个 Ansible 剧本,我有以下变量:
contracts:
- name: 'https'
subjects:
- name: 'permit'
filters:
- filter: tcp_443
一个合同有多个主题,一个主题可以有多个过滤器。剧本需要遍历这个变量。
我目前正在做以下事情:
- name: Task - Contract Subjects Have Filters
contract_subject_to_filter:
state: "present"
tenant: "{{ tenant }}"
contract: "{{ item..0.name }}"
subject: "{{ item.1.name }}"
filter: "{{ item.2.filter }}"
loop: "{{ contracts | subelements('subjects') | subelements('filters') }}"
tags: contract
{"msg": "Unexpected templating type error occurred on ({{ contracts | subelements('subjects') | subelements('filters') }}): the key filters should point to a dictionary, got '({'name': 'https', 'subjects': [{'name': 'permit', 'filters': [{'filter': 'tcp_443'}]}]}, {'name': 'permit', 'filters': [{'filter': 'tcp_443'}]})'"}
如何在 Ansible 剧本中执行双循环(合同有主题,主题有过滤器)?我无法更改变量结构或使用不同的 Ansible 模块。
展开列表,例如
- set_fact:
my_list: "{{ _my_list|from_yaml }}"
vars:
_my_list: |-
{% for i in contracts %}
{% for j in i.subjects %}
{% for k in j.filters %}
- {name: {{ i.name }}, subject: {{ j.name }}, filter: {{ k.filter }}}
{% endfor %}
{% endfor %}
{% endfor %}
给予
my_list:
- filter: tcp_443
name: https
subject: permit
那么,迭代是微不足道的
- name: Task - Contract Subjects Have Filters
debug:
msg: |-
state: "present"
tenant: "tenant"
contract: "{{ item.name }}"
subject: "{{ item.subject }}"
filter: "{{ item.filter }}"
loop: "{{ my_list }}"
给予
msg: |-
state: "present"
tenant: "tenant"
contract: "https"
subject: "permit"
filter: "tcp_443"