我正在做一个项目,我必须对系统执行多个查询,然后根据查询的结果执行步骤(每个查询可以分支出2到3种不同的方式)。
查询的结果使用寄存器模块存储在字符串变量中。例如,对于其中一个查询,我必须检查是否配置了多个备用服务器,预期的输出可能如下所示:
database role = PRIMARY
host name = random_name
service name = service1
target list = server1:10201|server4:40704|server8:52125
timeout value = 120
其中唯一需要的部分是目标列表,我需要提取每个服务器(它们由"|"分隔)我不知道目标列表上有多少服务器)。所以本质上我需要一种方法来扫描字符串直到它找到单词目标列表然后提取"="后面的内容在换行之前,我猜这些值中的每一个都可以存储在数组中。
我甚至不知道从哪里开始,有人知道任何模块或我如何去提取字符串的所需部分吗?
这是示例剧本,只有最后一行与regex_search
相关。休息是为了说明目的。regex_search
可用于从文本中提取所需的部分:
regex_search('target list\s+=\s+(.*)','\1')
上面的regex将捕获=
之后的所有内容,其中包含target list
并使用1
进行反向引用。
- name: Sample playbook
connection: local
# gather_facts: false
hosts: localhost
vars:
data: "{{ lookup('env', 'x') }}"
tasks:
- debug:
msg: "{{ data }}"
- debug:
msg: "{{ data |regex_search('target list\s+=\s+(.*)','\1')}}"
输出上述剧本:
PLAY [Sample playbook] **********************************************************************************************************************************************
TASK [Gathering Facts] **********************************************************************************************************************************************
ok: [localhost]
TASK [debug] ********************************************************************************************************************************************************
ok: [localhost] => {}
MSG:
database role = PRIMARY
host name = random_name
service name = service1
target list = server1:10201|server4:40704|server8:52125
timeout value = 120
TASK [debug] ********************************************************************************************************************************************************
ok: [localhost] => {}
MSG:
['server1:10201|server4:40704|server8:52125']
PLAY RECAP **********************************************************************************************************************************************************
localhost : ok=3 changed=0 unreachable=0 failed=0
给定在变量results中注册的数据
result:
stdout_lines:
- database role = PRIMARY
- host name = random_name
- service name = service1
- target list = server1:10201|server4:40704|server8:52125
- timeout value = 120
使用属性stdout_lines,例如
- set_fact:
servers: "{{ _val.split('|') }}"
vars:
_line: "{{ result.stdout_lines|select( 'match', '^target list.*$') }}"
_arr: "{{ _line.0.split('=')|map('trim') }}"
_val: "{{ _arr.1 }}"
为
servers:
- server1:10201
- server4:40704
- server8:52125
如果必须重复解析相同的结构,请使用cli_parse。