jinja2 过滤器中的正则表达式匹配(用于 saltstack)

Regex matching in jinja2 filters (for use in saltstack)

似乎 Jinja2(在 Saltstack 中支持)不支持正则表达式匹配,除非我遗漏了什么?许多利用 Jinja2 的框架,例如 Ansible have custom support for regex filters. Elsewhere 人们被指示编写自定义过滤器。

一些知情人士的问题可能有助于理解这种情况:

  1. 在 Saltstack 中利​​用正则表达式匹配的最佳方式是什么? (我这里的用例相当简单:测试字符串是否以子字符串结尾,但问题更笼统)。
  2. 在 Jinja2 中没有标准解决方案的情况下,将其作为 Saltstack 中的标准扩展(类似于 Ansible 解决方案)提供是个好主意吗?
  3. Jinja2 不支持标准正则表达式的原因是什么?在一个我能找到even Windows Powershell supports regex matching, there must be a reason I'm missing since this perceived regression from Jinja2 compared to the previous version has been complained about since 2010; however there isn't even an issue for this in Jinja's github的世界里?

这是一个古老的 post,但我遇到了它并帮助其他做同样事情的人..

自 2017.7.0 起,SaltStack 现在有 regex_search 和 regex_match:

https://docs.saltstack.com/en/latest/topics/jinja/index.html#regex-search

即使它很旧,在谷歌搜索盐匹配正则表达式时,它仍然是顶部 post。在 2018.3.3 中可以编写如下代码:

{% if "abc" is match("*b*") %}
...
{% endif %}

相关文档link:https://docs.saltstack.com/en/latest/topics/jinja/index.html#match

您可以像这样匹配 State 和 Pillar 文件,

例如,Top.sls

base:
 '*':
   - servers.{{ grains.id }}
   {% if grains.id | regex_match('nyc(.*)', ignorecase=True) %}
   - data.region.nyc
   {% endif %}
   - ignore_missing: True

任何匹配 nyc* 的节点都将获得这些支柱值。这也适用于状态文件(在 2018.3.4 上测试)