我是saltstack的新手,在创建python函数进行正则表达式检查时遇到了一些问题。我有这个功能
from re import sub, match, search
def app_instance_match(app):
instance_no = 0
m = search('^(.*)(-)(d)$', app)
if m is not None:
app = m.group(1)
instance_no = int(m.group(3))
return app, instance_no
当我用从控制台调用它时
salt-ssh -i 'genesis-app-1' emod.app_instance_match test-14
我得到
$salt ssh-i'genesis-app-1'emod.app_instance_match test-14
genesis-app-测试-14-0
当我尝试在像这样的sls文件中使用它时
{% set app = salt['emod.app_instance_match'](app) %}
我不能再使用这个应用了。我试过
{% for x,y in app %}
test:
cmd.run:
- names:
- echo {{x} {{y}}
或类似
cmd.run:
- names:
- echo {{app}}
我知道它给我返回了一个字典,但我无法访问它的值。我唯一需要的是python函数的2个返回:test-14和0。
当我从应用程序中的循环foxx,y中回显测试X时,我看到了retcode、stdout、stderror等值。
有没有其他方法可以对进行语法分析
{% set app = salt['emod.app_instance_match'](app) %}
类似的东西,所以在sls 中会有2个设置变量
{% set app,no = salt['emod.app_instance_match'](app) %}
我也试过像
{% set app = salt['emod.app_instance_match'](app).items() %}
我在语法上遗漏了一些东西,但我在互联网上找不到任何东西来帮助我继续。我在应用程序中有我想要的价值观,但我无法访问它们来扮演我想要的角色。
首先,你没有得到一个dict,你得到的是一个元组。有很大的不同。第二个{% set app,no = salt['emod.app_instance_match'](app) %}
正是您应该使用的。这将把变量分成两个部分CCD_ 2和CCD_。我应该注意到,有时使用salt-ssh实际上会使在salt中调试东西变得更加困难。我建议安装一个本地仆从,至少可以测试这些基本的东西。
下面是一个使用您自己的代码的示例。我把它命名为epp而不是emod。
[root@salt00 tests]# cat tests.sls
{% set x,y = salt['epp.app_instance_match']('test-14') %}
x: {{x}}
y: {{y}}
[root@salt00 tests]# salt-call slsutil.renderer salt://tests/tests.sls default_render=jinja
local:
----------
x:
test-14
y:
0
[root@salt00 tests]# cat ../_modules/epp.py
from re import sub, match, search
def app_instance_match(app):
instance_no = 0
m = search('^(.*)(-)(d)$', app)
if m is not None:
app = m.group(1)
instance_no = int(m.group(3))
return app, instance_no
第二件事是你可能想看看https://docs.saltproject.io/en/latest/topics/jinja/index.html#regex-搜索,这已经是正则表达式搜索。
第三。您的正则表达式看起来不太好。^
和$
不能很好地处理单个字符串。这就解释了为什么test-14
没有以('test',1)
的形式出现,而是以('test-14',0)
的的形式出现
我想你想要'(.*)-(d*)'
作为你真正的正则表达式。将返回CCD_ 10用于CCD_ 11