使用变量匹配的 regex_search 的 Ansible 语法

使用变量匹配的 regex_search 的 Ansible 语法

regex_search() 中与变量匹配的语法是什么?

对于下面的情况,vcsourcekit = 10,我想匹配正则表达式 ^10。它不评估变量,而是按字面意思解释。

- name: Do something awesome
  vmware_guest:
  hostname: "{{ vcenterhostname }}"
  ...

 when:
      - item.key | regex_search('^(vcsourcekit)')
 with_dict: "{{ vmfacts.virtual_machines }}"

谢谢!

答案1

虽然不是最美丽的东西,但是它可以起作用:

- item.key | regex_search('^' + vcsourcekit | string)

如果没有转换为字符串,我得到的cannot concatenate 'str' and 'int' objects是 ansible 2.2.0.0,而且我现在没有时间更新。

答案2

此连接无需强制转换即可进行:

when:
      - item.key | regex_search('^(' ~ vcsourcekit ~ ')')
 with_dict: "{{ vmfacts.virtual_machines }}"

(在 Ansible 2.5.6 中测试)

答案3

此代码:

tasks:
- set_fact: 
    keytype: ed25519

- set_fact: 
    matchstring: ".*_{{ keytype }}_.*"

- debug:
    var: item
  with_fileglob: "/etc/ssh/ssh_host_*_key"
  when: not item is match(matchstring)

仅选择 /etc/ssh/ssh_host_ed25519_key,这似乎与 OP 的要求类似。似乎“匹配”需要一个与整个字符串匹配的模式,因此需要匹配该字符串前后的 *.。

需要两个单独的“set_fact”节,以便在使用“keytype”之前进行设置。

该代码在 Debian 9(Raspbian“Stretch”)上运行的 Ansible 2.4.3.0 中运行。

我的申请要求在“何时”陈述中使用“不”,但回答原始问题时不需要使用它。

对于 OP 来说,批评的陈述似乎是:

matchstring: "^vcsourcekit.*"

显然,帮助 OP 已经太晚了,但这种方法可能会对其他人有所帮助。

答案4

我个人会使用类似

- item.key | regex_search('^%d' % vcsourcekit)

顺便说一句,这未经测试。我也不确定它是否符合 Ansible/Jinja2 最佳实践。

编辑:其中之一(也未经测试)可能更加正确。

- item.key | regex_search('^{0}'.format(vcsourcekit))

- item.key | regex_search('^%d' | format(vcsourcekit))

相关内容