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))