使用 Ansible regex_search 提取部分字符串并将输出保存为变量

使用 Ansible regex_search 提取部分字符串并将输出保存为变量

我的文件里面有如下内容。

dataDir=/var/lib/zookeeper
4lw.commands.whitelist=mntr,conf,ruok,stat
syncLimit=2

我想读取数据目录使用 Ansible 并将其设置为变量。我编写了以下代码,但正则表达式和存储变量都存在一些问题。

  - name: Read zoo.cfg content
    shell:
      cmd: cat zoo.cfg
    register: zoo_config_content

  - set_fact:
      my_var: "{{ zoo_config_content.stdout | regex_search('dataDir.*')}}"

  - name: Print
    debug:
      var: my_var

Q1.) 如何改进正则表达式以仅获取/var/lib/zookeeper

Q2.) 我如何存储提取的值以便在另一个任务中使用?

答案1

您需要向正则表达式添加一个组,并添加第二个参数来指定要返回哪个组:

- set_fact:
    my_var: "{{ zoo_config_content.stdout | regex_search('dataDir=(.+)', '\\1') | first }}"

这将返回一个包含单个元素的数组,因此我添加了| first直接获取一个元素作为字符串的功能。

结果:

ok: [localhost] => {
    "my_var": "/var/lib/zookeeper"
}

如果配置文件位于 Ansible 机器上,你可以让它更容易使用查找

- set_fact:
    my_var: "{{ lookup('file', 'zoo.cfg') | regex_search('dataDir=(.+)', '\\1') | first }}"

相关内容