为某些键迭代字典 Ansible
Iterate dictionary Ansible for certain keys
对某个字典如何迭代的疑惑
---
- name: main playbook
hosts: localhost
tasks:
- name: Set fact
var:
tower_objects_organizations:
security:
org: ORG_I-SSO-ES-ADM-SSMM
teams:
- I-SSO-ES-ADM-SSMM
- I-SSO-ES-ADM-SSMM2
monit:
org: ORG_I-SSO-ES-TS-MONIT
teams:
- I-SSO-ES-TS-MONIT
- name: "[{{ productname }}][parallel set organization] Set organizations fact"
debug:
msg: "XXXXX"
with_items: "{{ tower_objects_organizations| dict2items | subelements('value.teams') }}"
有谁知道我如何遍历每个子目录(安全、监控...)中的团队,并以团队为键并以其组织为值来填充字典,即 I-SSO-ES-ADM-SSMM: ORG_I-SSO-ES-ADM-SSMM, I-SSO-ES-ADM-SSMM2: ORG_I-SSO-ES-ADM-SSMM, I-SSO-ES-TS-MONIT:ORG_I-SSO-ES-TS-MONIT
使用子元素我能够到达团队列表,但输出不是预期的
带和不带自定义过滤器的解决方案:
当我必须对字典执行一些复杂的操作时,我更喜欢使用自定义过滤器:
您在剧本文件夹中创建了一个文件夹 filter_plugins(我已将文件命名为 myfilters.py 并且过滤器 customfilter)
#!/usr/bin/python
class FilterModule(object):
def filters(self):
return {
'customfilter': self.customfilter
}
def customfilter(self, obj):
result = {}
for k in obj:
org = obj[k]['org']
for l in obj[k]['teams']:
result[l] = org
return result
剧本示例:
tasks:
- name: Set fact
set_fact:
result: "{{ tower_objects_organizations | customfilter}}"
vars:
tower_objects_organizations:
security:
org: ORG_I-SSO-ES-ADM-SSMM
teams:
- I-SSO-ES-ADM-SSMM
- I-SSO-ES-ADM-SSMM2
monit:
org: ORG_I-SSO-ES-TS-MONIT
teams:
- I-SSO-ES-TS-MONIT
others:
org: ORG_I-SSO-ES-TS-OTHER
teams:
- I-SSO-ES-TS-OTHER0
- I-SSO-ES-TS-OTHER1
- name: display result
debug:
var: result
结果:
ok: [localhost] =>
result:
I-SSO-ES-ADM-SSMM: ORG_I-SSO-ES-ADM-SSMM
I-SSO-ES-ADM-SSMM2: ORG_I-SSO-ES-ADM-SSMM
I-SSO-ES-TS-MONIT: ORG_I-SSO-ES-TS-MONIT
I-SSO-ES-TS-OTHER0: ORG_I-SSO-ES-TS-OTHER
I-SSO-ES-TS-OTHER1: ORG_I-SSO-ES-TS-OTHER
编辑
另一种没有自定义过滤器但我认为可读性较差的解决方案:
- set_fact:
result: "{{ result | d({}) | combine(dict(item.value.teams|product([item.value.org]))) }}"
loop: "{{ tower_objects_organizations|dict2items }}"
- name: debug result
debug:
var: result
对某个字典如何迭代的疑惑
---
- name: main playbook
hosts: localhost
tasks:
- name: Set fact
var:
tower_objects_organizations:
security:
org: ORG_I-SSO-ES-ADM-SSMM
teams:
- I-SSO-ES-ADM-SSMM
- I-SSO-ES-ADM-SSMM2
monit:
org: ORG_I-SSO-ES-TS-MONIT
teams:
- I-SSO-ES-TS-MONIT
- name: "[{{ productname }}][parallel set organization] Set organizations fact"
debug:
msg: "XXXXX"
with_items: "{{ tower_objects_organizations| dict2items | subelements('value.teams') }}"
有谁知道我如何遍历每个子目录(安全、监控...)中的团队,并以团队为键并以其组织为值来填充字典,即 I-SSO-ES-ADM-SSMM: ORG_I-SSO-ES-ADM-SSMM, I-SSO-ES-ADM-SSMM2: ORG_I-SSO-ES-ADM-SSMM, I-SSO-ES-TS-MONIT:ORG_I-SSO-ES-TS-MONIT
使用子元素我能够到达团队列表,但输出不是预期的
带和不带自定义过滤器的解决方案:
当我必须对字典执行一些复杂的操作时,我更喜欢使用自定义过滤器:
您在剧本文件夹中创建了一个文件夹 filter_plugins(我已将文件命名为 myfilters.py 并且过滤器 customfilter)
#!/usr/bin/python
class FilterModule(object):
def filters(self):
return {
'customfilter': self.customfilter
}
def customfilter(self, obj):
result = {}
for k in obj:
org = obj[k]['org']
for l in obj[k]['teams']:
result[l] = org
return result
剧本示例:
tasks:
- name: Set fact
set_fact:
result: "{{ tower_objects_organizations | customfilter}}"
vars:
tower_objects_organizations:
security:
org: ORG_I-SSO-ES-ADM-SSMM
teams:
- I-SSO-ES-ADM-SSMM
- I-SSO-ES-ADM-SSMM2
monit:
org: ORG_I-SSO-ES-TS-MONIT
teams:
- I-SSO-ES-TS-MONIT
others:
org: ORG_I-SSO-ES-TS-OTHER
teams:
- I-SSO-ES-TS-OTHER0
- I-SSO-ES-TS-OTHER1
- name: display result
debug:
var: result
结果:
ok: [localhost] =>
result:
I-SSO-ES-ADM-SSMM: ORG_I-SSO-ES-ADM-SSMM
I-SSO-ES-ADM-SSMM2: ORG_I-SSO-ES-ADM-SSMM
I-SSO-ES-TS-MONIT: ORG_I-SSO-ES-TS-MONIT
I-SSO-ES-TS-OTHER0: ORG_I-SSO-ES-TS-OTHER
I-SSO-ES-TS-OTHER1: ORG_I-SSO-ES-TS-OTHER
编辑
另一种没有自定义过滤器但我认为可读性较差的解决方案:
- set_fact:
result: "{{ result | d({}) | combine(dict(item.value.teams|product([item.value.org]))) }}"
loop: "{{ tower_objects_organizations|dict2items }}"
- name: debug result
debug:
var: result