Ansible regex_findall 没有给出负面搜索的预期结果

Ansible regex_findall is not giving expected results with negative search

我的 ansible 负正则表达式正在返回所有内容

所以我从 JSON 中获取 dns 名称的结果,我正在尝试对其进行排序以创建一个自动化的 ansible 清单。 我的服务器的命名方案如下:

abc02vsomeserver01.subdomain1.domain.gov
abc02someserver01.subdomain1.domain.gov
xyz03votherserver11.subdomain2.domain.gov
wyz03otherserver11.subdomain2.domain.gov
qrsmainserver02.maindomain.domain.gov

我正在获取按环境划分的“v”服务器,然后我想创建一个不是“v”服务器的包罗万象的组 所以!我正在尝试做:

{{ jsonOutput | json_query('json.response.results[].dnsName') | regex_findall('(?![a-z]{3}[0-9]{2}v)^.*', multiline=true) }}

当我将它插入 https://pythex.org 时,它似乎确实有效。 但是 ansible 正在返回所有东西...... 我到底做错了什么?

这是因为 json_query 发出一个 list[str] ,当直接输入 regex_findall 时它不会变成换行符分隔的字符串,它变得与 str(["alpha", "beta"]) 相同(例如 ['alpha', 'beta']) 然后多行正则表达式无法执行您期望的操作

与生活中的许多事情一样,有一些方法可以解决这个问题。一种是将结果输入 |join("\n"),然后您可能会回到您认为开始的地方:

- debug:
    msg: "{{ jsonOutput | json_query('json.response.results[].dnsName') | join('\n') | regex_findall('(?![a-z]{3}[0-9]{2}v)^.*', multiline=true) }}"

另一个是承认它是 list[str] 并使用 | select("match", ...) 过滤器只允许匹配的项目:

    - debug:
        msg: >-
          {{ response | json_query('results[].dnsName')
          | select('match', '(?![a-z]{3}[0-9]{2}v)^.*')
          | list }}
      vars:
        response:
          results:
          - dnsName: abc02vsomeserver01.subdomain1.domain.gov
          - dnsName: abc02someserver01.subdomain1.domain.gov
          - dnsName: xyz03votherserver11.subdomain2.domain.gov
          - dnsName: wyz03otherserver11.subdomain2.domain.gov
          - dnsName: qrsmainserver02.maindomain.domain.gov

类似地产生:

    "msg": [
        "abc02someserver01.subdomain1.domain.gov",
        "wyz03otherserver11.subdomain2.domain.gov",
        "qrsmainserver02.maindomain.domain.gov"
    ]

我猜个人偏好哪种风格最适合您的剧本