在 saltstack sls 中调用 python 函数
calling python function within saltstack sls
我是 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
创世纪应用程序 1:
- 测试 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}}
我知道它 return 对我来说是一本字典,但我无法访问它的值。我唯一需要的是来自 python 函数的 2 returns:test-14 和 0.
当我在应用程序中从循环 fox x,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() %}
我在语法中遗漏了一些东西,但我在互联网上找不到任何东西来帮助我继续。我在应用程序中拥有我想要的值,但我无法访问它们来参与我想要的部分。
首先,你得到的不是字典,而是元组。有一个很大的不同。 second {% set app,no = salt['emod.app_instance_match'](app) %}
正是您应该使用的。这会将变量分成两部分 app
和 no
。我应该注意,有时使用 salt-ssh 实际上会使 salt 中的调试变得更加困难。我建议安装一个本地 minion 来至少测试这些基本的东西。
这是一个使用您自己的代码的示例。我将它命名为 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-search 这已经是一个正则表达式搜索。
第三个。你的正则表达式看起来不对。 ^
和 $
不能很好地处理单个字符串。这可以解释为什么 test-14
没有以 ('test',1)
的形式返回,而是以 ('test-14',0)
的形式返回
我想你想要 '(.*)-(\d*)'
作为你真正的正则表达式。这将 return ('test',14)
用于 test-14
我是 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
创世纪应用程序 1:
- 测试 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}}
我知道它 return 对我来说是一本字典,但我无法访问它的值。我唯一需要的是来自 python 函数的 2 returns:test-14 和 0.
当我在应用程序中从循环 fox x,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() %}
我在语法中遗漏了一些东西,但我在互联网上找不到任何东西来帮助我继续。我在应用程序中拥有我想要的值,但我无法访问它们来参与我想要的部分。
首先,你得到的不是字典,而是元组。有一个很大的不同。 second {% set app,no = salt['emod.app_instance_match'](app) %}
正是您应该使用的。这会将变量分成两部分 app
和 no
。我应该注意,有时使用 salt-ssh 实际上会使 salt 中的调试变得更加困难。我建议安装一个本地 minion 来至少测试这些基本的东西。
这是一个使用您自己的代码的示例。我将它命名为 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-search 这已经是一个正则表达式搜索。
第三个。你的正则表达式看起来不对。 ^
和 $
不能很好地处理单个字符串。这可以解释为什么 test-14
没有以 ('test',1)
的形式返回,而是以 ('test-14',0)
我想你想要 '(.*)-(\d*)'
作为你真正的正则表达式。这将 return ('test',14)
用于 test-14