拆分列表和重复值

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