拆分列表和重复值
Split a list and duplicate values
我正在尝试拆分列表并根据输出复制一些值,但我无法让它工作。我可能想多了,但我有下面的代码,我将值存储在列表中
- set_fact:
devices: "{{devices.list|json_query('[*].{serial: stacked_serial,
IPv4: IPv4,
version: version,
hostname: Hostname,
models: stacked_models}') }}"
导致以下输出
'}) => {
"msg": {
"IPv4": "1.2.3.4",
"hostname": "name",
"models": "model1,model2,model3",
"serial": "serial1,serial2,serial3",
"version": "1.1"
}
}
我想要实现的目标很简单,如果存在 3 个(这个数字可以不同)序列号,则序列号应该被拆分,其余值重复。我希望它看起来像下面的输出(模型和序列号都应该分开,模型和序列号将始终匹配,即如果存在 3 个序列号,则将存在 3 个模型)。
'}) => {
"msg": {
"IPv4": "1.2.3.4",
"hostname": "name",
"models": "model1",
"serial": "serial1",
"version": "1.1"
}
}
'}) => {
"msg": {
"IPv4": "1.2.3.4",
"hostname": "name",
"models": "model2",
"serial": "serial2",
"version": "1.1"
}
}
'}) => {
"msg": {
"IPv4": "1.2.3.4",
"hostname": "name",
"models": "model3",
"serial": "serial3",
"version": "1.1"
}
}
上面的主要目标是能够通过 API 运行 并稍后将其存储为 CSV 文件。
我尝试了几种不同的方案,下面的代码可能是最接近的。如果有人能指出我正确的方向,我将不胜感激。我知道我已经在 python 中解决了这个问题,但那是一段时间以前的事了,我无法将它翻译成 ansible。
- set_fact:
testing: "{{testing|default([])}} + {{item.serial.split(',')}} + {{item.hostname}}"
loop: "{{devices}}"
退一步说容易解决,一直想多了。我没有将文件作为列表读取,而是将文件作为字典读取,然后解决方案自行呈现。显然可以做得更好,但这对我来说很有效。
- name: Testing
set_fact:
_new_dict: "{{_new_dict|default([]) + [item|combine
({'stacked_serial': item.stacked_serial[2],
'Hostname': item.Hostname,
'stacked_models_count': item.stacked_models_count})]}}"
loop: "{{new_dict}}"
when:
- item.stacked_serial[2] is defined
我正在尝试拆分列表并根据输出复制一些值,但我无法让它工作。我可能想多了,但我有下面的代码,我将值存储在列表中
- set_fact:
devices: "{{devices.list|json_query('[*].{serial: stacked_serial,
IPv4: IPv4,
version: version,
hostname: Hostname,
models: stacked_models}') }}"
导致以下输出
'}) => {
"msg": {
"IPv4": "1.2.3.4",
"hostname": "name",
"models": "model1,model2,model3",
"serial": "serial1,serial2,serial3",
"version": "1.1"
}
}
我想要实现的目标很简单,如果存在 3 个(这个数字可以不同)序列号,则序列号应该被拆分,其余值重复。我希望它看起来像下面的输出(模型和序列号都应该分开,模型和序列号将始终匹配,即如果存在 3 个序列号,则将存在 3 个模型)。
'}) => {
"msg": {
"IPv4": "1.2.3.4",
"hostname": "name",
"models": "model1",
"serial": "serial1",
"version": "1.1"
}
}
'}) => {
"msg": {
"IPv4": "1.2.3.4",
"hostname": "name",
"models": "model2",
"serial": "serial2",
"version": "1.1"
}
}
'}) => {
"msg": {
"IPv4": "1.2.3.4",
"hostname": "name",
"models": "model3",
"serial": "serial3",
"version": "1.1"
}
}
上面的主要目标是能够通过 API 运行 并稍后将其存储为 CSV 文件。
我尝试了几种不同的方案,下面的代码可能是最接近的。如果有人能指出我正确的方向,我将不胜感激。我知道我已经在 python 中解决了这个问题,但那是一段时间以前的事了,我无法将它翻译成 ansible。
- set_fact:
testing: "{{testing|default([])}} + {{item.serial.split(',')}} + {{item.hostname}}"
loop: "{{devices}}"
退一步说容易解决,一直想多了。我没有将文件作为列表读取,而是将文件作为字典读取,然后解决方案自行呈现。显然可以做得更好,但这对我来说很有效。
- name: Testing
set_fact:
_new_dict: "{{_new_dict|default([]) + [item|combine
({'stacked_serial': item.stacked_serial[2],
'Hostname': item.Hostname,
'stacked_models_count': item.stacked_models_count})]}}"
loop: "{{new_dict}}"
when:
- item.stacked_serial[2] is defined