从ansible变量中过滤匹配模式的子字符串,并将匹配的子字符串分配给另一个变量

时间:2016-06-06 23:43:10

标签: ansible ansible-playbook ansible-2.x

假设我们有一个长的ansible字符串变量mystr。我们有一个正则表达式模式substr_pattern,匹配此模式的子字符串将从mystr过滤掉并分配给另一个变量substr。似乎没有明显的方法可以通过playbook_filters上的文档在ansible中执行此操作,尽管在python本身中使用re模块执行此操作很简单。

ansible docs中有3种方法,但似乎没有一种方法可以解决我的问题:

  1. match:此过滤器返回true / false,具体取决于整个模式是否与整个字符串匹配,但不返回匹配的组/子字符串。

  2. search:用于过滤较大字符串中的substr。但是像match一样,只返回true / false并且不匹配此处所需的group / substring。

  3. regex_replace:这用于将字符串中匹配的模式替换为另一个字符串。但目前尚不清楚如何将匹配模式对应的子串/组注册到一个新变量中。

  4. 我有什么遗失的吗?或者这是ansible中缺少的功能吗?

    Ansible版本: 2.1

    示例:

    mystr: "This is the long string. With a url. http://example.org/12345"
    pattern: "http:\/\/example.org\/(\d+)"
    substr: 12345   # First matched group i.e. \\1
    

    总结:如何从pattern获取与mystr匹配的子字符串并将其注册到ansible变量substr

1 个答案:

答案 0 :(得分:13)

如果您可以修改模式,则可以使用regex_replace过滤器并将整个字符串替换为匹配的数字。

mystr | regex_replace('^.*http:\/\/example.org\/(\d+).*?$', '\\1')

要将结果分配给新变量,您可以使用set_fact模块。

- set_fact:
    substr: "{{ mystr | regex_replace('^.*http:\/\/example.org\/(\d+).*?$', '\\1') }}"