【问题标题】:Regex match for key in jinja2 selectattr()jinja2 selectattr() 中键的正则表达式匹配
【发布时间】:2021-01-16 16:15:58
【问题描述】:

给定数据:

"serverName", [
    serverData: [
          { 
            "internal_ip": "10.1.1.100",
            "external_ip": "172.16.1.10",
            "name": "dns-1"
      },
    ],
]

internal_ipequalto 匹配时,这会提取namedns-1。到目前为止,一切顺利。

- debug:
   msg: "{{  mydict | selectattr('internal_ip', 'equalto', '10.1.1.100') |  
   map(attribute='name') | list  }}"

在真正的问题中,我知道我正在搜索的 ip 地址将驻留哪种类型的 *_ip。它可能在internal_ip 下,也可能在external_ip 下,据我所知,可能还有更多选择,唯一永远存在的就是我正在搜索的实际IP 地址:'10.1 .1.100`。

所以我需要像这样进行正则表达式匹配:

- debug:
   msg: "{{  mydict | selectattr('^.*$', 'equalto', '10.1.1.100') |  
   map(attribute='name') | list  }}"

我不确定这是否可能,但这似乎是摆脱困境的方法之一。

【问题讨论】:

    标签: ansible jinja2


    【解决方案1】:

    例如,剧本

    shell> cat playbook.yml
    - hosts: localhost
      vars:
        mylist:
          - {internal_ip: 10.1.1.101, external_ip: 172.16.1.10, name: dns-1}
          - {internal_ip: 10.1.1.102, external_ip: 172.16.1.10, name: dns-2}
          - {internal_ip: 10.1.1.103, external_ip: 172.16.1.10, name: dns-3}
      tasks:
        - set_fact:
            sel: "{{ sel|default([]) + [item.name] }}"
          loop: "{{ mylist }}"
          when: sel_ip|default('') in item.values()|list
        - debug:
            var: sel
    

    给予

    shell> ansible-playbook playbook.yml -e sel_ip=172.16.1.10
      ...
      sel:
      - dns-1
      - dns-2
      - dns-3
    
    shell> ansible-playbook playbook.yml -e sel_ip=10.1.1.103
      ...
      sel:
      - dns-3
    
    

    【讨论】:

    • 这确实有效。我编辑了我的原始 json 数据,因为它比原始数据更复杂。我必须迭代而不是硬编码服务器名。我确实觉得 jinja2 循环将是一个很好的解决方案,但我遇到了一种奇怪的行为(即使我使用的是 |from_json,它也会将列表转换为字符串。我可能会用那个问题提出另一个问题。
    • 是的。打开一个新问题。 JFYI,YAML 中的字符串实际上是一个字符列表(这会导致将字符串转换为列表的反向问题)。
    • @G_G 虽然打开一个新问题是一条好路,但对您收到的答案表示赞赏也是一个好主意。见What should I do when someone answers my question?
    • @β.εηοιτ.βε 您的意思是将答案标记为“已接受”吗?
    • @G_G 你是唯一选择是否应该接受答案的人。这就是说我从您的第一条评论中了解到答案确实对您有所帮助。如果是这种情况,那么即使不接受答案,我也会说它至少值得一票。 (正如upvote 上的工具提示所说,这个答案很有用)。
    猜你喜欢
    • 2016-12-12
    • 2018-03-09
    • 1970-01-01
    • 2016-11-28
    • 1970-01-01
    • 2019-08-17
    • 2017-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多