在Ansible中提取一个特定的模式

问题描述 投票:0回答:1

我需要从一个字符串中提取一个特定的值(在我的例子中是发布版本)。我不知道Ansible中的regex是如何工作的。以下是我的Play -

---
 - name: Getting the status of current deployment
   stat:
     path: /opt/tomcat/apps/myapp
   register: p

 - debug:
     msg: "The value of symlink is {{ p.stat.lnk_target }}"

 - debug:
     msg: "{{ p.stat.lnk_target.split('/')[4]}}"

输出。

Getting the status of current deployment...
Monday 18 May 2020  11:18:43 +0100 (0:00:01.580)       0:00:01.812 ************
  server1 ok
set_fact...
Monday 18 May 2020  11:18:43 +0100 (0:00:00.552)       0:00:02.364 ************
  server1 ok
debug...
Monday 18 May 2020  11:18:43 +0100 (0:00:00.077)       0:00:02.442 ************
  server1 ok: {
    "changed": false,
    "msg": "The value of symlink is /app/tomcat/releases/Release1.40.0-07/myapp/webapp"
}
debug...
Monday 18 May 2020  11:35:20 +0100 (0:00:00.080)       0:00:02.234 ************
  myvm-kn-u1 ok: {
    "changed": false,
    "msg": "Release1.40.0-07"
}

我想从中提取出发行号,并把它放到一个变量中。例如,在上面的输出中,它是 1.40.0-07

如果有人能指导,请告诉我。试着在google里找,但找不到任何东西。

ansible ansible-inventory
1个回答
1
投票

我认为最好的方法是使用 regex_replace

你的情况是

- debug:
     msg: "{{ p.stat.lnk_target.split('/')[4] | regex_replace('^Release(.*)$', '\\1') }}"

可能你需要调整一下Regex。


1
投票

它可以是 reject 字母部分。例如

    - debug:
        msg: "{{ p.stat.lnk_target.split('/')[4]|
                 reject('match', '[a-zA-Z]')|join() }}"

regex_replace

    - debug:
         msg: "{{ p.stat.lnk_target.split('/')[4]|
                  regex_replace(my_regex, my_replace) }}"
      vars:
        my_regex: '^Release(.*)$'
        my_replace: '\1'

结果相同

    "msg": "1.40.0-07"
© www.soinside.com 2019 - 2024. All rights reserved.