Ansible中如何按指定系统键转换packages字典结构?
Ansible 字典转换解决方案
你需要在dict2items与items2dict之间添加的过滤器链如下:
selectattr('value', 'has_key', package_key) | map('json_query', '{key: key, value: value.' ~ package_key ~ '}')
完整任务代码
- name: Transformation debug: msg: "{{ packages | dict2items | selectattr('value', 'has_key', package_key) | map('json_query', '{key: key, value: value.' ~ package_key ~ '}') | items2dict }}"
步骤说明
selectattr('value', 'has_key', package_key):筛选出包含当前发行版(示例中为ubuntu)子项的应用条目,直接排除无对应发行版配置的项(比如示例里的cowsay)。map('json_query', '{key: key, value: value.' ~ package_key ~ '}'):对筛选后的每个条目做结构转换,保留原应用名称作为key,将value替换为对应发行版下的包列表。通过字符串拼接动态指定package_key对应的子键,适配不同发行版变量。items2dict:把处理后的列表格式重新转为字典,得到目标结构。
结果验证
当package_key为ubuntu时,最终输出的内容会与你期望的transformed_packages完全一致:
{ "openssh-server": ["pkg3"], "app-armor": ["pkg6", "pkg7"] }
内容的提问来源于stack exchange,提问作者user12441223
相关产品推荐
相关产品推荐

