【问题标题】:Convert list to values in dictionary with Ansible使用 Ansible 将列表转换为字典中的值
【发布时间】:2021-03-23 20:36:41
【问题描述】:

我正在尝试使用来自 Linux 主机的 Ansible gather_facts 数据作为输入:

    "ansible_fibre_channel_wwn": [
        "1000e0071bd4d0ed",
        "10009440c90f9d85",
        "1000e0071bce95f3",
        "1000e0071bce95f2",
        "1000e0071bd4d0ec",
        "10009440c90f9d84"
    ],

并希望使用上述列表项为新“wwpn”键的字典值创建字典:

        fc_initiators: [
            {wwpn: '10:00:e0:07:1b:d4:d0:ed'}, 
            {wwpn: '10:00:94:40:c9:0f:9d:85'}, 
            {wwpn: '10:00:e0:07:1b:ce:95:f3'}, 
            {wwpn: '10:00:e0:07:1b:ce:95:f2'}, 
            {wwpn: '10:00:e0:07:1b:d4:d0:ec'}, 
            {wwpn: '10:00:94:40:c9:0f:9d:84'}
        ]

这个正则表达式似乎足以将初始列表项转换为殖民 WWPN:

"{{ ansible_fibre_channel_wwn | 
map('regex_replace', '^(..)(..)(..)(..)(..)(..)(..)(..)$', '\\1:\\2:\\3:\\4:\\5:\\6:\\7:\\8')|list }}"

我不确定从哪里开始列表->字典转换。 非常感谢任何帮助。

谢谢!

【问题讨论】:

    标签: ansible


    【解决方案1】:

    首先“殖民”项目,例如

        - set_fact:
            wwn_colonized: "{{ wwn_colonized|default([]) +
                               [item|map('join')|join(':')] }}"
          loop: "{{ ansible_fibre_channel_wwn|map('batch', 2)|map('list')|list }}"
    

    给予

      wwn_colonized:
      - 10:00:e0:07:1b:d4:d0:ed
      - 10:00:94:40:c9:0f:9d:85
      - 10:00:e0:07:1b:ce:95:f3
      - 10:00:e0:07:1b:ce:95:f2
      - 10:00:e0:07:1b:d4:d0:ec
      - 10:00:94:40:c9:0f:9d:84
    

    然后下面的任务创建字典列表

        - set_fact:
            fc_initiators: "{{ wwn_colonized|
                               map('regex_replace', '^(.*)$', '{wwpn: \\1}')|
                               map('from_yaml')|
                               list }}"
    

    给予

      fc_initiators:
      - wwpn: 10:00:e0:07:1b:d4:d0:ed
      - wwpn: 10:00:94:40:c9:0f:9d:85
      - wwpn: 10:00:e0:07:1b:ce:95:f3
      - wwpn: 10:00:e0:07:1b:ce:95:f2
      - wwpn: 10:00:e0:07:1b:d4:d0:ec
      - wwpn: 10:00:94:40:c9:0f:9d:84
    

    或者,JSON 中的相同数据

      fc_initiators|to_nice_json: |-
        [
            {
                "wwpn": "10:00:e0:07:1b:d4:d0:ed"
            },
            {
                "wwpn": "10:00:94:40:c9:0f:9d:85"
            },
            {
                "wwpn": "10:00:e0:07:1b:ce:95:f3"
            },
            {
                "wwpn": "10:00:e0:07:1b:ce:95:f2"
            },
            {
                "wwpn": "10:00:e0:07:1b:d4:d0:ec"
            },
            {
                "wwpn": "10:00:94:40:c9:0f:9d:84"
            }
        ]
    

    【讨论】:

    • 这看起来是正确的格式。添加“殖民”正则表达式以获取这种格式的输出有多难? fc_initiators: [ {wwpn: '10:00:e0:07:1b:d4:d0:ed'}, {wwpn: '10:00:94:40:c9:0f:9d:85'}, {wwpn: '10:00:e0:07:1b:ce:95:f3'}, {wwpn: '10:00:e0:07:1b:ce:95:f2'}, {wwpn: '10:00:e0:07:1b:d4:d0:ec'}, {wwpn: '10:00:94:40:c9:0f:9d:84'} ]
    • 通过将我最初发布的正则表达式添加到您的帖子中,我能够将 wwpns 格式化为每 2 位冒号一个冒号的所需格式。非常感谢您的帮助!
    • 不客气!我已经用“殖民”项目更新了答案。
    猜你喜欢
    • 2021-07-17
    • 1970-01-01
    • 2013-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-31
    • 1970-01-01
    • 2021-01-10
    相关资源
    最近更新 更多