在执行我的 ansible 脚本时出现错误 Object of type set is not JSON serializable

Getting error Object of type set is not JSON serializable while executing my ansible script

我的场景和上面提到的有点相似

但有点不同,让我以 Vladimir Botka 在上述问题解决方案中提到的相同示例,添加 name:c 和 name:d 块

output:
- Name: A
  source: [a, b, c, a, b, c]
  dest: [x,y,z]
- Name: B
  source: [a, b, c, a, b, c]
  dest: [x.c, y, z, x, y, z]
- Name: C
  source:
  dest:      
- Name: D
  source: "1.2"
  dest: "x"  

我使用上面 post 中建议的相同答案,但稍作修改:

- set_fact:
    out1: "{{output |replace('None','[]')}}"
- set_fact:
    out: "{{ out|d([]) + [{'Name': item.Name,
                           'source': _src,
                           'dest': _dst}] }}"
  loop: "{{ out1 }}"
  vars:
    _src: "{{ item.source|unique}}"
    _dst: "{{ item.dest|unique}}"
- debug:
      var: out

我使用 out1: "{{output |replace('None','[]')}}" 导致 name:c 的循环失败,因为源和目标是空的,而不是列表我通过将 None 替换为 [] 来使其成为列表,为了克服循环错误,我能够修复循环错误。 不确定其方法是否正确,但解决了循环错误问题。

但是我得到的第二个错误是 Object of type set is not JSON serializable for name:d 因为源和目标不是列表。

如何修复此错误或任何解决方法??

问:"源和目标不是列表时出错"

A:如果值的类型是列表,则过滤 unique 项,否则复制值,例如

    - set_fact:
        out: "{{ out|d([]) + [{'Name': item.Name,
                               'source': _src,
                               'dest': _dst}] }}"
      loop: "{{ out1 }}"
      vars:
        _src: "{{ (item.source|type_debug == 'list')|
                  ternary(item.source|unique, item.source) }}"
        _dst: "{{ (item.dest|type_debug == 'list')|
                  ternary(item.dest|unique, item.dest) }}"