在 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) %} 正是您应该使用的。这会将变量分成两部分 appno。我应该注意,有时使用 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