我已经在这里阅读了上千个关于Ansible regex_search的问题,但没有找到一个令人满意的答案。
这是测试剧本。backup_stdout
的设置与我从备份实用程序中获得的设置相同:
---
- hosts: localhost
connection: local
gather_facts: no
vars:
backup_stdout: |-
Saving active configuration...
/var/local/ucs/f5-apm-1625-081021.ucs is saved.
tasks:
- name: Get the backup name
ansible.builtin.set_fact:
backup_name: "{{ backup_stdout | regex_search(stdout_regex, multiline=True) }}"
vars:
stdout_regex: '"/var.*ucsb"gm'
failed_when: backup_name == ''
- debug:
var: backup_name
我不能让regex_search
产生匹配。下面是regex101上的相同代码,这表明它确实匹配。我尝试了以下方法:
- 带/不带
multiline
- 表达式 中带/不带末尾的
- 有/没有传递结果给
| first
过滤器 - 使用
^/var.*ucs
代替单词边界(也匹配regex101)
'\1'
到目前为止,无论我怎么努力,我都无法让Ansible匹配。谢谢你的帮助。
你的正则表达式中有一些奇怪的引号导致了问题。因为你写了:
stdout_regex: '"/var.*ucsb"gm'
将文字值"/var.*ucsb"gm
传递给regex_search
。在backup_stdout
的内容中没有引号(也没有gm
),所以这永远不会匹配。
我想你要:
- hosts: localhost
connection: local
gather_facts: no
vars:
backup_stdout: |-
Saving active configuration...
/var/local/ucs/f5-apm-1625-081021.ucs is saved.
tasks:
- name: Get the backup name
ansible.builtin.set_fact:
backup_name: "{{ backup_stdout | regex_search(stdout_regex, multiline=True) }}"
vars:
stdout_regex: '/var.*ucsb'
failed_when: backup_name == ''
- debug:
var: backup_name
生产:
TASK [debug] *******************************************************************
ok: [localhost] => {
"backup_name": "/var/local/ucs/f5-apm-1625-081021.ucs"
}