调用saltstack sls中的python函数



我是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

最新更新