如何将一些项目值转换为新的项目值?

How can I transform some items values into new items value?

这是我的变量:

    zones:
      - hostname: host10
        cname: "{{cname1|default(omit)}}"
        zone: ["v120","v121","linux"]
        ips: 8
      - hostname: host11
        cname: "{{cname2|default(omit)}}"
        zone: ["v120","v121"]
        ips: 10
      - hostname: host12
        zone: [linux]
        ips: 88

如何在 zones.zone 上构建几乎没有替换的相同变量(将 v120 替换为 120,将 v121 替换为 121,将 linux 替换为 v120):

    zones:
      - hostname: host10
        cname: "{{cname1|default(omit)}}"
        zone: ["120","121","120"]
        ips: 8
      - hostname: host11
        cname: "{{cname2|default(omit)}}"
        zone: ["120","121"]
        ips: 10
      - hostname: host12
        zone: [120]
        ips: 88

我尝试了很多与一些过滤器的组合,特别是“组合”和“regex_replace”

   regex_replace('^v(.*)$', '\1')

但从未成功获得最终objective。做起来好像很简单,我一定漏掉了什么...

创建字典替换并迭代区域。在每次迭代中提取替换 zone,将字典与 item 组合并连接列表 zones2。例如

    - set_fact:
        zones2: "{{ zones2|default([]) +
                    [item|combine({'zone': zone})] }}"
      loop: "{{ zones }}"
      vars:
        zone: "{{ item.zone|map('extract', substitute)|list }}"
        substitute:
          v120: 120
          v121: 121
          linux: 120
    - debug:
        var: zones2

给予

  zones2:
  - hostname: host10
    ips: 8
    zone:
    - 120
    - 121
    - 120
  - hostname: host11
    ips: 10
    zone:
    - 120
    - 121
  - hostname: host12
    ips: 88
    zone:
    - 120

映射regex_replace

    - set_fact:
        zones2: "{{ zones2|default([]) +
                    [item|combine({'zone': zone})] }}"
      loop: "{{ zones }}"
      vars:
        zone: "{{ item.zone|
                  map('regex_replace', regex, replace)|
                  map('regex_replace', regex2, replace2)|
                  list }}"
        regex: '^v(.*)$'
        replace: ''
        regex2: '^linux$'
        replace2: '120'
    - debug:
        var: zones2

给予

  zones2:
  - hostname: host10
    ips: 8
    zone:
    - '120'
    - '121'
    - '120'
  - hostname: host11
    ips: 10
    zone:
    - '120'
    - '121'
  - hostname: host12
    ips: 88
    zone:
    - '120'

"了解提取过滤器的作用"

显示 extract 过滤器

的结果
    - debug:
        msg: |
          {{ item.zone|to_yaml }}{{ zone|to_yaml }}
      loop: "{{ zones }}"
      vars:
        zone: "{{ item.zone|map('extract', substitute)| list }}"
        substitute:
          v120: 120
          v121: 121
          linux: 120

给出(删节)

  msg: |-
    [v120, v121, linux]
    [120, 121, 120]

  msg: |-
    [v120, v121]
    [120, 121]

  msg: |-
    [linux]
    [120]

"了解组合解决方案的作用"

显示 combine 过滤器

的结果
    - debug:
        msg: "{{ item|combine({'zone': zone})|
                 to_yaml}}"
      loop: "{{ zones }}"
      vars:
        zone: "{{ item.zone|map('extract', substitute)| list }}"
        substitute:
          v120: 120
          v121: 121
          linux: 120

给出(删节)

  msg: |-
    cname: __omit_place_holder__3938838202c238b505bfc39af57a09b4fe9972f6
    hostname: host10
    ips: 8
    zone: [120, 121, 120]

  msg: |-
    cname: __omit_place_holder__3938838202c238b505bfc39af57a09b4fe9972f6
    hostname: host11
    ips: 10
    zone: [120, 121]

  msg: |-
    hostname: host12
    ips: 88
    zone: [120]

""zones2": "[AnsibleUndefined, AnsibleUndefined]" 你怎么解释?"

下面的代码按预期工作

    - set_fact:
        zones2: "{{ item.zone|map('extract', substitute)|list }}"
      loop: "{{ zones }}"
      register: zones_list
      vars:
        substitute:
          v120: 120
          v121: 121
          linux: 120
    - debug:
        msg: "{{ zones_list.results|map(attribute='ansible_facts')|list|
                 to_yaml }}"

给出(删节)

  msg: |-
    - zones2: [120, 121, 120]
    - zones2: [120, 121]
    - zones2: [120]