【发布时间】:2021-12-19 13:22:04
【问题描述】:
我正在尝试从存储在 ansible 中不同环境变量中的服务器创建字典。
我目前拥有的是:
env_loadbalancer_vservers2: "{{ hostvars[inventory_hostname] | dict2items | selectattr('key', 'match', 'env_.*_loadbalancer_vservers(?![_.])') | list | items2dict }} "
哪个会:
- 获取特定主机的 ansible 中的所有变量,
- 将字典更改为项目类型
- 因为我们现在可以轻松访问键值,所以我将只匹配我想要使用正则表达式的键
- 改回列表
- 返回字典
问题是输出看起来像这样:
{
"env_decision_manager_loadbalancer_vservers": {
"decision_central": {
"ip_or_dns": "ip",
"port": "port",
"protocol": "SSL",
"ssl": true,
"timeout": 600,
}
},
"env_ftp_loadbalancer_vservers": {
"ftp_1": {
"ip_or_dns": "ip",
"port": "port",
"protocol": "FTP",
"ssl": false,
"timeout": 9010,
}
},
"env_jboss_loadbalancer_vservers": {
"jboss": {
"ip_or_dns": "ip",
"port": "port",
"protocol": "SSL",
"ssl": true,
"timeout": 600,
}
"jboss_adm": {
"ip_or_dns": "som_other_ip",
"port": "rando_number",
"protocol": "SSL",
"ssl": true,
"timeout": 86410,
}
}
而我想要的输出应该是这样的:
{
"decision_central": {
"ip_or_dns": "ip",
"port": "port",
"protocol": "SSL",
"ssl": true,
"timeout": 600,
},
"ftp_1": {
"ip_or_dns": "ip",
"port": "port",
"protocol": "FTP",
"ssl": false,
"timeout": 9010,
},
"jboss": {
"ip_or_dns": "ip",
"port": "port",
"protocol": "SSL",
"ssl": true,
"timeout": 600,
},
"jboss_adm": {
"ip_or_dns": "som_other_ip",
"port": "rando_number",
"protocol": "SSL",
"ssl": true,
"timeout": 86410,
}
所以实际上我需要删除“顶级关键层”并合并它们的值。我在这个解决方案上花了很长时间没有任何好的进展,我很乐意提供任何建议:)
PS。解决方案应该是“干净的”,没有任何自定义模块或实际任务,最好的办法是在上面提到的过滤器管道中添加一些函数,这将导致正确的 dict 格式
谢谢你:)
【问题讨论】:
-
你的json有问题,
"timeout": number,都应该是"timeout": number,是不是错字? -
是的,对不起,这是错字,我在从 json 发布问题时删除了一些东西,我错过了一些细节 :)
标签: dictionary ansible jinja2 flatten ansible-filter