在jinja 2中使用regex作为ansible playbooks

thi*_*ter 13 python regex jinja2 ansible ansible-playbook

嗨我是jinja2的新手,并尝试使用正则表达式,如下所示

{% if ansible_hostname == 'uat' %}
   {% set server = 'thinkingmonster.com' %}

{% else %}
   {% set server = 'define yourself' %}
{% endif %}

{% if {{ server }} match('*thinking*') %}
  {% set ssl_certificate = 'akash' %}

{% elif {{ server }} match( '*sleeping*')%}
   {% set ssl_certificate = 'akashthakur' %}
{% endif %}
Run Code Online (Sandbox Code Playgroud)

根据"服务器"的值,我想评估使用哪些证书.即如果域包含"思考"关键字,则使用这些证书,如果它包含"sleeping"关键字,则使用该证书.

但没有发现任何jinja2过滤器支持这一点.请帮助我.我发现了一些python代码,确定可以工作,但如何在jinja2模板中使用python?

小智 13

Jinja2可以通过简单的"in"比较轻松地进行子检查,例如

{% set server = 'www.thinkingmonster.com' %}
{% if 'thinking' in server %}
   do something...
{% endif %}
Run Code Online (Sandbox Code Playgroud)

所以你的子串正则表达式过滤器不是必需的.但是,如果你想要更高级的正则表达式匹配,那么实际上有一些可用的过滤器 - 请参阅http://docs.ansible.com/playbooks_filters.html#other-useful-filters中的正则表达式过滤器- 有趣的是,你的匹配句法以上几乎是完全正确的.

但是Bereal的回答是+1 ,它以地图的形式提供了一个不错的选择.


sar*_*ole 6

Ansible> 1.6中提供了一个“ regex_replace”过滤器

其他有用的过滤器 向下滚动,您会看到以下信息:

1.6版中的新功能。

要用正则表达式替换字符串中的文本,请使用“ regex_replace”过滤器:

# convert "ansible" to "able"
{{ 'ansible' | regex_replace('^a.*i(.*)$', 'a\\1') }}

# convert "foobar" to "bar"
{{ 'foobar' | regex_replace('^f.*o(.*)$', '\\1') }}

# convert "localhost:80" to "localhost, 80" using named groups
{{ 'localhost:80' | regex_replace('^(?P<host>.+):(?P<port>\\d+)$', '\\g<host>, \\g<port>') }}
Run Code Online (Sandbox Code Playgroud)

话虽这么说,正则表达式对于找到此特定问题的解决方案是过大的。


thi*_*ter 5

因此,经过长时间的谷歌搜索并在一些博主的帮助下,这里是我问题的最终解决方案:-

1. Jinja2 没有任何用于查找子字符串或正则表达式的过滤器,因此唯一的解决方案是创建自定义过滤器。我按照以下步骤解决了我的问题。

2.在我的剧本的根目录中,我创建了一个目录“filter_plugins”并在python中编写了一个自定义模块并将文件放在这个目录中。python 文件的名称可以是任何名称。我的python代码如下所示:

 __author__ = 'akthakur'
class FilterModule(object):
    ''' Custom filters are loaded by FilterModule objects '''

    def filters(self):
        ''' Filter Module objects return a dict mapping filter names to filter functions. '''
        return {
            'substr': self.substr,
        }

        ''' def substr(self, check,checkin):
        return value1+value2'''
    def substr(self,check,checkin):
         if check in checkin:
            return True
         else:
            return False
Run Code Online (Sandbox Code Playgroud)

3.创建此文件后,我们全新的过滤器“substr” 就可以使用了,可以在模板中使用,如下所示:

{% if 5==5 %}
 {% set server = 'www.thinkingmonster.com' %}
{% endif %}
{% if 'thinking' | substr(server) %}
   {% set ssl_cert = 'abc.crt'%}
{% endif %}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这个答案已经过时了,现在 Ansible 中有正则表达式过滤器:http://docs.ansible.com/ansible/latest/playbooks_filters.html#regular-expression-filters (3认同)

Ale*_*kin 5

感谢Steve E.提示,我找到了一种在模板条件中添加正则表达式的方法:

{% if server | regex_search('thinking') %}
....
{% endif %}
Run Code Online (Sandbox Code Playgroud)