Ansible如何从文件中提取指定字符串并保留首个匹配项?
从配置文件提取首个注释的BalancerMember主机名(Ansible实现)
需求
从给定的Apache反向代理配置文件中,提取首个被注释的BalancerMember行中的主机名(如server1.domain.com),作为后续Playbook的目标主机。
配置文件示例
<Proxy balancer://${balancerNameEAPI}> # BalancerMember https://server1.domain.com:port hctemplate=tcp BalancerMember https://server2.domain.com:port hctemplate=tcp ProxySet lbmethod=bybusyness </Proxy> <Proxy balancer://${balancerNamePAPI}> # BalancerMember https://server1.domain.com:port hctemplate=tcp BalancerMember https://server2.domain.com:port hctemplate=tcp ProxySet lbmethod=bybusyness </Proxy> <Proxy balancer://${balancerNameSAPI}> # BalancerMember https://server1.domain.com:port hctemplate=tcp BalancerMember https://server2.domain.com:port hctemplate=tcp ProxySet lbmethod=bybusyness </Proxy>
解决方案Playbook
方法1:使用lookup(适合小文件)
--- - name: Extract first commented BalancerMember hostname hosts: localhost gather_facts: false vars: source_file: /files/test/test.cfg # 正则捕获主机名:匹配注释行,提取https://后到:port前的部分 host_capture_regex: '^# BalancerMember https://([^:]+)' tasks: - name: Capture the first matching hostname set_fact: target_host: "{{ lookup('file', source_file) | regex_search(host_capture_regex, '\\1') | first }}" - name: Verify target host debug: var: target_host
方法2:使用slurp(适合大文件)
如果配置文件较大,用slurp更稳妥(避免一次性读取大文件到内存的问题):
--- - name: Extract first commented BalancerMember hostname hosts: localhost gather_facts: false vars: source_file: /files/test/test.cfg host_capture_regex: '^# BalancerMember https://([^:]+)' tasks: - name: Read config file content slurp: path: "{{ source_file }}" register: config_raw - name: Decode and extract hostname set_fact: target_host: "{{ config_raw.content | b64decode | regex_search(host_capture_regex, '\\1') | first }}" - name: Verify target host debug: var: target_host
关键说明
regex_search(host_capture_regex, '\\1'):通过正则捕获组直接提取主机名,\\1对应正则中()包裹的部分(即server1.domain.com)| first:强制只保留首个匹配结果,即使配置中有多个符合条件的行- 两种方法都避免了逐行遍历收集所有匹配项,直接定位到需要的内容,效率更高
测试输出
执行Playbook后,会输出提取到的主机名:
ok: [localhost] => { "target_host": "server1.domain.com" }
内容的提问来源于stack exchange,提问作者ITMike89
相关产品推荐
相关产品推荐

