字典中的 Ansible 循环列表并保留密钥
Ansible loop list in dictionary and retain the key
我正在尝试使用从 yaml 文件导入的变量创建一系列 firewalld 规则。 yaml 文件创建一个服务名称字典,关联的端口是每个项目中的一个列表。一段 yaml 如下所示:
---
myservice:
description: My service desc
ports:
- 1234/tcp
- 1235/tcp
another:
description: Another service
ports:
- 2222/tcp
- 3333/tcp
我目前拥有的 Ansible 角色是:
- name: Read services from file
include_vars:
file: "services.yml"
name: services
- name: Create firewalld services
command: >
firewall-cmd --permanent
--new-service={{ item.key }}
--set-description="{{ item.value.description }}"
register: addserv
failed_when: addserv.rc != 26 and addserv.rc != 0
changed_when: not "NAME_CONFLICT" in addserv.stderr
with_dict: "{{ services }}"
- name: Add ports to firewalld service
command: >
firewall-cmd --permanent
--service={{ item.key }} --add-port={{ item.value.ports }}
register: addport
changed_when: not "ALREADY_ENABLED" in addport.stderr
创建 firewalld 服务的第一部分工作正常,但我对如何在保留字典键的同时遍历端口列表的第二部分感到困惑。我试过使用子元素来提取端口列表并且可行,但我无法弄清楚如何从密钥中保留服务名称。
使用subelements。例如
- debug:
msg: "{{ item.0.key }} - {{ item.0.value.description }} - {{ item.1 }}"
with_subelements:
- "{{ services|dict2items }}"
- value.ports
给予
"msg": "myservice - My service desc - 1234/tcp"
"msg": "myservice - My service desc - 1235/tcp"
"msg": "another - Another service - 2222/tcp"
"msg": "another - Another service - 3333/tcp"
我正在尝试使用从 yaml 文件导入的变量创建一系列 firewalld 规则。 yaml 文件创建一个服务名称字典,关联的端口是每个项目中的一个列表。一段 yaml 如下所示:
---
myservice:
description: My service desc
ports:
- 1234/tcp
- 1235/tcp
another:
description: Another service
ports:
- 2222/tcp
- 3333/tcp
我目前拥有的 Ansible 角色是:
- name: Read services from file
include_vars:
file: "services.yml"
name: services
- name: Create firewalld services
command: >
firewall-cmd --permanent
--new-service={{ item.key }}
--set-description="{{ item.value.description }}"
register: addserv
failed_when: addserv.rc != 26 and addserv.rc != 0
changed_when: not "NAME_CONFLICT" in addserv.stderr
with_dict: "{{ services }}"
- name: Add ports to firewalld service
command: >
firewall-cmd --permanent
--service={{ item.key }} --add-port={{ item.value.ports }}
register: addport
changed_when: not "ALREADY_ENABLED" in addport.stderr
创建 firewalld 服务的第一部分工作正常,但我对如何在保留字典键的同时遍历端口列表的第二部分感到困惑。我试过使用子元素来提取端口列表并且可行,但我无法弄清楚如何从密钥中保留服务名称。
使用subelements。例如
- debug:
msg: "{{ item.0.key }} - {{ item.0.value.description }} - {{ item.1 }}"
with_subelements:
- "{{ services|dict2items }}"
- value.ports
给予
"msg": "myservice - My service desc - 1234/tcp"
"msg": "myservice - My service desc - 1235/tcp"
"msg": "another - Another service - 2222/tcp"
"msg": "another - Another service - 3333/tcp"