Ansible:合并项变量,该变量为';它被多次使用

Ansible:合并项变量,该变量为';它被多次使用,ansible,Ansible,我已经为ansible编写了一个nftables角色,它为我的服务器打开了端口。我想要某种等级制度。我想定义应在每个主机上打开的规则,但有些规则仅适用于一组主机 存货 --- myservers: hosts: server1: server2: server3: server4: groupa: hosts: server1: server2: groupb: hosts: server3: server4: 这些是

我已经为ansible编写了一个nftables角色,它为我的服务器打开了端口。我想要某种等级制度。我想定义应在每个主机上打开的规则,但有些规则仅适用于一组主机

存货

---
myservers:
  hosts:
    server1:
    server2:
    server3:
    server4:
groupa:
  hosts:
    server1:
    server2:
groupb:
  hosts:
    server3:
    server4:
这些是我的小组成员: myservers.yml

---
nftablesopen:
  - dport: "22"
    comment: "SSH"
    proto: tcp
群a.yml

---
nftablesopen:
  - dport: "123"
    comment: "NTP"
    proto: "udp"
B.yml组

---
nftablesopen:
  - dport: "80"
    comment: "HTTP"
    proto: "udp"
当我运行playbook时,不同的优先级开始生效,并且只有我定义的一部分被应用。 Ansible中处理此问题的最佳方法是什么?
我不希望将大量不同的变量合并为一个变量,因为我不想在添加一组新的主机时更新我的任务。我能不能像在不同的编程语言中那样,将项目添加到已经存在的项目列表中?

我建议创建一个包含组的字典,并让主机进行配置。比如说

shell>cat主机
[我的服务器]
测试_01
测试02
[A组]
测试_01
[B组]
测试02
nftables打开:
我的服务器:
-端口:“22”
评论:“SSH”
协议:tcp
A组:
-端口:“123”
评论:“NTP”
原型:“udp”
B组:
-端口:“80”
评论:“HTTP”
原型:“udp”
-设置事实:
my_open:“{{组名称”|
映射('提取',打开)|
列表|展平}”
-调试:
我的门开了
给予

ok:[test\u 01]=>{
“my_open”:[
{
“评论”:“NTP”,
“dport”:“123”,
“proto”:“udp”
},
{
“评论”:“SSH”,
“dport”:“22”,
“proto”:“tcp”
}
]
}
确定:[测试02]=>{
“my_open”:[
{
“评论”:“HTTP”,
“dport”:“80”,
“proto”:“udp”
},
{
“评论”:“SSH”,
“dport”:“22”,
“proto”:“tcp”
}
]
}

Q:“如果有我在NFtabbleSpen中没有指定的组名怎么办?”

答:键和组的列表。比如说

-设置事实:
my_open:“{{nftableOpen.keys()|
名单|
相交(组名称)|
映射('提取',打开)|
列表|展平}”
与三位主持人一起运行剧本

shell>cat主机
[我的服务器]
测试_01
测试02
[A组]
测试_01
[B组]
测试02
[C组]
测试03
-主机:测试单元01、测试单元02、测试单元03
给予

ok:[测试02]=>{
“my_open”:[
{
“评论”:“SSH”,
“dport”:“22”,
“proto”:“tcp”
},
{
“评论”:“HTTP”,
“dport”:“80”,
“proto”:“udp”
}
]
}
确定:[测试\u 01]=>{
“my_open”:[
{
“评论”:“SSH”,
“dport”:“22”,
“proto”:“tcp”
},
{
“评论”:“NTP”,
“dport”:“123”,
“proto”:“udp”
}
]
}
确定:[测试03]=>{
“my_open”:[]
}

Q:“(这样)我需要通过显式命名它们来与组关联,而不仅仅是将变量放入相应的组中。”

答:将项目的公共变量放入目录中,例如全局变量

shell>cat全局变量/nftableopen.yml
NF表打开:
我的服务器:
-端口:“22”
评论:“SSH”
协议:tcp
A组:
-端口:“123”
评论:“NTP”
原型:“udp”
B组:
-端口:“80”
评论:“HTTP”
原型:“udp”
将此目录链接到项目的每个主机变量。比如说

shell>树主机\u变量/
东道主/
├── 测试_01
│   └── 全局变量->../../global变量
├── 测试02
│   └── 全局变量->../../global变量
└── 测试03
└── 全局变量->../../global变量

更改配置意味着以任何方式修改目录中的单个文件。

谢谢您的回答。如果有我没有为其指定NFtabbleSpen的组名呢?这将引发一个错误:任务执行期间发生异常。要查看完整的回溯,请使用-vvv。错误是:KeyError:'groupf'致命:[test_01]:失败!=>{“msg”:“模块执行期间发生意外故障”。,“stdout”:“}使用
intersect
filter选择组。查看更新的答案。对不起,我花了很长时间来测试这个。它确实有效。你的方式我需要通过显式命名它们来与组关联,而不是仅仅将变量放入相应的组中,但我可以接受。你可以利用它。创建一个新的目录global\u vars并将其链接到项目中的每个host\u vars目录。这可以很容易地实现自动化。将这些变量放入全局变量中的文件中。通过这种方式,您可以合并项目的公共变量,并将它们放在单个目录中。