我认为您正在尝试使用srcaddr × dstaddr × service 的笛卡尔积来生成一系列策略操作。我们可以使用set_fact 模块为每个包含适当数据的策略添加一个值,然后在后续循环中使用subelements 过滤器来实际呈现策略任务。
在下面的示例中,我将所有内容都包装在 debug 模块中(因为我没有任何方法来测试您对 fortios_firewall_policy 模块的使用),但输出应该确认(或不确认)这会产生正确的结果。
- hosts: localhost
gather_facts: false
vars:
policy:
- policyid: "0" # policy[0].policyid
name: "Internal->Internet1"
action: "accept"
srcintf: "Internal"
dstintf: "Internet"
srcaddr: # policy[0].srcaddr
- name: "n_10.0.10.0_24" # policy[0].srcaddr[0].name
- name: "n_10.0.20.0_24" # policy[0].srcaddr[1].name
dstaddr:
- name: "n_8.8.8.8_32"
- name: "n_7.8.8.8_32"
service:
- name: "TCP_8080"
- name: "TCP_8081"
- policyid: "1"
name: "Internal->Internet2"
action: "accept"
srcintf: "Internal"
dstintf: "DMZ"
srcaddr:
- name: "n_10.0.10.0_24"
- name: "n_10.0.20.0_24"
dstaddr:
- name: "n_172.16.0.0_24"
service:
- name: "TCP_8080"
- name: "TCP_8081"
tasks:
# Here we're adding a "values" key to each entry in your "policy" list that
# contains the cross product of srcaddr, dstaddr, and service.
- set_fact:
targets: >-
{{
targets + [
item | combine({
'policy': item,
'values': item.srcaddr|product(item.dstaddr, item.service)|list
})
]
}}
loop: "{{ policy }}"
vars:
targets: []
# Now we can use the "values" key we created in the previous task with
# the "subelements" filter:
- debug:
msg:
- name: Firewall Policy
fortios_firewall_policy:
state: "foo"
firewall_policy:
policyid: "{{ item.0.policyid }}"
schedule: "always"
nat: "disable"
name: "{{item.0.name}}"
action: "{{item.0.action}}"
srcintf:
- name: "{{item.0.srcintf}}"
dstintf:
- name: "{{item.0.dstintf}}"
srcaddr:
- name: "{{item.1.0.name}}"
dstaddr:
- name: "{{item.1.1.name}}"
service:
- name: "{{item.1.2.name}}"
loop: "{{ targets|subelements('values') }}"
loop_control:
label: "{{ item.0.name }}-{{ item.1 }}"
这将生成为输出:
PLAY [localhost] ******************************************************************************
TASK [set_fact] *******************************************************************************
ok: [localhost] => (item={'policyid': '0', 'name': 'Internal->Internet1', 'action': 'accept', 'srcintf': 'Internal', 'dstintf': 'Internet', 'srcaddr': [{'name': 'n_10.0.10.0_24'}, {'name': 'n_10.0.20.0_24'}], 'dstaddr': [{'name': 'n_8.8.8.8_32'}, {'name': 'n_7.8.8.8_32'}], 'service': [{'name': 'TCP_8080'}, {'name': 'TCP_8081'}]})
ok: [localhost] => (item={'policyid': '1', 'name': 'Internal->Internet2', 'action': 'accept', 'srcintf': 'Internal', 'dstintf': 'DMZ', 'srcaddr': [{'name': 'n_10.0.10.0_24'}, {'name': 'n_10.0.20.0_24'}], 'dstaddr': [{'name': 'n_172.16.0.0_24'}], 'service': [{'name': 'TCP_8080'}, {'name': 'TCP_8081'}]})
TASK [debug] **********************************************************************************
ok: [localhost] => (item=Internal->Internet1-[{'name': 'n_10.0.10.0_24'}, {'name': 'n_8.8.8.8_32'}, {'name': 'TCP_8080'}]) => {
"msg": [
{
"fortios_firewall_policy": {
"action": "accept",
"dstaddr": [
{
"name": "n_8.8.8.8_32"
}
],
"dstintf": [
{
"name": "Internet"
}
],
"firewall_policy": null,
"name": "Internal->Internet1",
"nat": "disable",
"policyid": "0",
"schedule": "always",
"service": [
{
"name": "TCP_8080"
}
],
"srcaddr": [
{
"name": "n_10.0.10.0_24"
}
],
"srcintf": [
{
"name": "Internal"
}
],
"state": "foo"
},
"name": "Firewall Policy"
}
]
}
ok: [localhost] => (item=Internal->Internet1-[{'name': 'n_10.0.10.0_24'}, {'name': 'n_8.8.8.8_32'}, {'name': 'TCP_8081'}]) => {
"msg": [
{
"fortios_firewall_policy": {
"action": "accept",
"dstaddr": [
{
"name": "n_8.8.8.8_32"
}
],
"dstintf": [
{
"name": "Internet"
}
],
"firewall_policy": null,
"name": "Internal->Internet1",
"nat": "disable",
"policyid": "0",
"schedule": "always",
"service": [
{
"name": "TCP_8081"
}
],
"srcaddr": [
{
"name": "n_10.0.10.0_24"
}
],
"srcintf": [
{
"name": "Internal"
}
],
"state": "foo"
},
"name": "Firewall Policy"
}
]
}
ok: [localhost] => (item=Internal->Internet1-[{'name': 'n_10.0.10.0_24'}, {'name': 'n_7.8.8.8_32'}, {'name': 'TCP_8080'}]) => {
"msg": [
{
"fortios_firewall_policy": {
"action": "accept",
"dstaddr": [
{
"name": "n_7.8.8.8_32"
}
],
"dstintf": [
{
"name": "Internet"
}
],
"firewall_policy": null,
"name": "Internal->Internet1",
"nat": "disable",
"policyid": "0",
"schedule": "always",
"service": [
{
"name": "TCP_8080"
}
],
"srcaddr": [
{
"name": "n_10.0.10.0_24"
}
],
"srcintf": [
{
"name": "Internal"
}
],
"state": "foo"
},
"name": "Firewall Policy"
}
]
}
ok: [localhost] => (item=Internal->Internet1-[{'name': 'n_10.0.10.0_24'}, {'name': 'n_7.8.8.8_32'}, {'name': 'TCP_8081'}]) => {
"msg": [
{
"fortios_firewall_policy": {
"action": "accept",
"dstaddr": [
{
"name": "n_7.8.8.8_32"
}
],
"dstintf": [
{
"name": "Internet"
}
],
"firewall_policy": null,
"name": "Internal->Internet1",
"nat": "disable",
"policyid": "0",
"schedule": "always",
"service": [
{
"name": "TCP_8081"
}
],
"srcaddr": [
{
"name": "n_10.0.10.0_24"
}
],
"srcintf": [
{
"name": "Internal"
}
],
"state": "foo"
},
"name": "Firewall Policy"
}
]
}
ok: [localhost] => (item=Internal->Internet1-[{'name': 'n_10.0.20.0_24'}, {'name': 'n_8.8.8.8_32'}, {'name': 'TCP_8080'}]) => {
"msg": [
{
"fortios_firewall_policy": {
"action": "accept",
"dstaddr": [
{
"name": "n_8.8.8.8_32"
}
],
"dstintf": [
{
"name": "Internet"
}
],
"firewall_policy": null,
"name": "Internal->Internet1",
"nat": "disable",
"policyid": "0",
"schedule": "always",
"service": [
{
"name": "TCP_8080"
}
],
"srcaddr": [
{
"name": "n_10.0.20.0_24"
}
],
"srcintf": [
{
"name": "Internal"
}
],
"state": "foo"
},
"name": "Firewall Policy"
}
]
}
ok: [localhost] => (item=Internal->Internet1-[{'name': 'n_10.0.20.0_24'}, {'name': 'n_8.8.8.8_32'}, {'name': 'TCP_8081'}]) => {
"msg": [
{
"fortios_firewall_policy": {
"action": "accept",
"dstaddr": [
{
"name": "n_8.8.8.8_32"
}
],
"dstintf": [
{
"name": "Internet"
}
],
"firewall_policy": null,
"name": "Internal->Internet1",
"nat": "disable",
"policyid": "0",
"schedule": "always",
"service": [
{
"name": "TCP_8081"
}
],
"srcaddr": [
{
"name": "n_10.0.20.0_24"
}
],
"srcintf": [
{
"name": "Internal"
}
],
"state": "foo"
},
"name": "Firewall Policy"
}
]
}
ok: [localhost] => (item=Internal->Internet1-[{'name': 'n_10.0.20.0_24'}, {'name': 'n_7.8.8.8_32'}, {'name': 'TCP_8080'}]) => {
"msg": [
{
"fortios_firewall_policy": {
"action": "accept",
"dstaddr": [
{
"name": "n_7.8.8.8_32"
}
],
"dstintf": [
{
"name": "Internet"
}
],
"firewall_policy": null,
"name": "Internal->Internet1",
"nat": "disable",
"policyid": "0",
"schedule": "always",
"service": [
{
"name": "TCP_8080"
}
],
"srcaddr": [
{
"name": "n_10.0.20.0_24"
}
],
"srcintf": [
{
"name": "Internal"
}
],
"state": "foo"
},
"name": "Firewall Policy"
}
]
}
ok: [localhost] => (item=Internal->Internet1-[{'name': 'n_10.0.20.0_24'}, {'name': 'n_7.8.8.8_32'}, {'name': 'TCP_8081'}]) => {
"msg": [
{
"fortios_firewall_policy": {
"action": "accept",
"dstaddr": [
{
"name": "n_7.8.8.8_32"
}
],
"dstintf": [
{
"name": "Internet"
}
],
"firewall_policy": null,
"name": "Internal->Internet1",
"nat": "disable",
"policyid": "0",
"schedule": "always",
"service": [
{
"name": "TCP_8081"
}
],
"srcaddr": [
{
"name": "n_10.0.20.0_24"
}
],
"srcintf": [
{
"name": "Internal"
}
],
"state": "foo"
},
"name": "Firewall Policy"
}
]
}
ok: [localhost] => (item=Internal->Internet2-[{'name': 'n_10.0.10.0_24'}, {'name': 'n_172.16.0.0_24'}, {'name': 'TCP_8080'}]) => {
"msg": [
{
"fortios_firewall_policy": {
"action": "accept",
"dstaddr": [
{
"name": "n_172.16.0.0_24"
}
],
"dstintf": [
{
"name": "DMZ"
}
],
"firewall_policy": null,
"name": "Internal->Internet2",
"nat": "disable",
"policyid": "1",
"schedule": "always",
"service": [
{
"name": "TCP_8080"
}
],
"srcaddr": [
{
"name": "n_10.0.10.0_24"
}
],
"srcintf": [
{
"name": "Internal"
}
],
"state": "foo"
},
"name": "Firewall Policy"
}
]
}
ok: [localhost] => (item=Internal->Internet2-[{'name': 'n_10.0.10.0_24'}, {'name': 'n_172.16.0.0_24'}, {'name': 'TCP_8081'}]) => {
"msg": [
{
"fortios_firewall_policy": {
"action": "accept",
"dstaddr": [
{
"name": "n_172.16.0.0_24"
}
],
"dstintf": [
{
"name": "DMZ"
}
],
"firewall_policy": null,
"name": "Internal->Internet2",
"nat": "disable",
"policyid": "1",
"schedule": "always",
"service": [
{
"name": "TCP_8081"
}
],
"srcaddr": [
{
"name": "n_10.0.10.0_24"
}
],
"srcintf": [
{
"name": "Internal"
}
],
"state": "foo"
},
"name": "Firewall Policy"
}
]
}
ok: [localhost] => (item=Internal->Internet2-[{'name': 'n_10.0.20.0_24'}, {'name': 'n_172.16.0.0_24'}, {'name': 'TCP_8080'}]) => {
"msg": [
{
"fortios_firewall_policy": {
"action": "accept",
"dstaddr": [
{
"name": "n_172.16.0.0_24"
}
],
"dstintf": [
{
"name": "DMZ"
}
],
"firewall_policy": null,
"name": "Internal->Internet2",
"nat": "disable",
"policyid": "1",
"schedule": "always",
"service": [
{
"name": "TCP_8080"
}
],
"srcaddr": [
{
"name": "n_10.0.20.0_24"
}
],
"srcintf": [
{
"name": "Internal"
}
],
"state": "foo"
},
"name": "Firewall Policy"
}
]
}
ok: [localhost] => (item=Internal->Internet2-[{'name': 'n_10.0.20.0_24'}, {'name': 'n_172.16.0.0_24'}, {'name': 'TCP_8081'}]) => {
"msg": [
{
"fortios_firewall_policy": {
"action": "accept",
"dstaddr": [
{
"name": "n_172.16.0.0_24"
}
],
"dstintf": [
{
"name": "DMZ"
}
],
"firewall_policy": null,
"name": "Internal->Internet2",
"nat": "disable",
"policyid": "1",
"schedule": "always",
"service": [
{
"name": "TCP_8081"
}
],
"srcaddr": [
{
"name": "n_10.0.20.0_24"
}
],
"srcintf": [
{
"name": "Internal"
}
],
"state": "foo"
},
"name": "Firewall Policy"
}
]
}
PLAY RECAP ************************************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0