ansible - Ansible:使用公共键将值分组在同一行
问题描述
我正在努力使用 ansible 将一些常见值分组在同一行上。
我在每一行都有 vg 名称和磁盘,如下所示:
ok: [localhost] => {
"msg": [
"vg01 /dev/xvdk",
"vg01 /dev/xvdj",
"vg02 /dev/xvdi",
"vg02 /dev/xvdh",
"vg03 /dev/xvdg",
"vg03 /dev/xvdf"
]
}
现在,我想要 vg 及其所有磁盘,在同一行,每个 vg 一个,如下所示:
"vg01 /dev/xvdk, /dev/xvdj",
"vg02 /dev/xvdi, /dev/xvdh",
"vg03 /dev/xvdg, /dev/xvdf",
仍然无法做到这一点;有人可以帮忙吗?
谢谢你。
解决方案
创建字典列表。例如,假设数据存储在可变磁盘中
- set_fact:
l1: "{{ l1|default([]) + [{'dsk': item.split(' ')|first,
'dev': item.split(' ')|last}] }}"
loop: "{{ disks }}"
给
l1:
- dev: /dev/xvdk
dsk: vg01
- dev: /dev/xvdj
dsk: vg01
- dev: /dev/xvdi
dsk: vg02
- dev: /dev/xvdh
dsk: vg02
- dev: /dev/xvdg
dsk: vg03
- dev: /dev/xvdf
dsk: vg03
使用groupby过滤器并格式化循环中的行,例如
- debug:
msg: "{{ item.0 }} {{ item.1|flatten|map(attribute='dev')|join(', ') }}"
loop: "{{ l1|groupby('dsk') }}"
给
msg: vg01 /dev/xvdk, /dev/xvdj
msg: vg02 /dev/xvdi, /dev/xvdh
msg: vg03 /dev/xvdg, /dev/xvdf
使用regex_replace/from_yaml的更强大的选项可能能够处理一些格式错误的数据,其中简单的split/first/last会失败,例如
- set_fact:
l1: "{{ l1|default([]) + [item.0|combine(item.1)] }}"
with_together:
- "{{ disks|map('regex_replace', '^(.*?) (.*)$', 'dsk: \\1')|
map('from_yaml')|list }}"
- "{{ disks|map('regex_replace', '^(.*?) (.*)$', 'dev: \\2')|
map('from_yaml')|list }}"
推荐阅读
- python - send.keys(Keys.ENTER) 在 Python 中不起作用
- java - 我在使用 JAVA 8 登录 ALM 15 时遇到问题
- sql - 从两个日期字段(redshift、sql)生成时间序列
- cmake - CMake:如何使用输出对象文件尊重源树
- api - 如何创建查询以接收特定变量的数据
- c# - 虚方法引用的类,返回 null ASP.Net Core MVC
- python - 我的 python 项目中的导入不起作用,我没有找到原因
- java - 在超级构造函数中通过 setter 传递值
- loops - 尝试实现一个嵌套循环来测试 Iris Data 上 KNN 的多个 K 值
- wordpress - 受保护页面的 WordPress 快速访问链接