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 ,它以地图的形式提供了一个不错的选择.
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)
话虽这么说,正则表达式对于找到此特定问题的解决方案是过大的。
因此,经过长时间的谷歌搜索并在一些博主的帮助下,这里是我问题的最终解决方案:-
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)
感谢Steve E.提示,我找到了一种在模板条件中添加正则表达式的方法:
{% if server | regex_search('thinking') %}
....
{% endif %}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
38479 次 |
| 最近记录: |