Ansible regex_findall 没有给出否定搜索的预期结果

时间:2021-04-15 02:20:43

标签: ansible python-regex

我的 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”服务器的catchall组 所以!我正在尝试做:

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

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

1 个答案:

答案 0 :(得分:0)

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

与生活中的许多事情一样,有几种方法可以解决这个问题。一种方法是将结果输入到 ['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

我猜哪种风格最适合你的剧本是个人喜好