如果您想要调用模块函数salt.cmd
,您还应该传递所需的kwarg with_pillar
以支持渲染柱,如官方doc中所述
您可能还希望将参数更正为pillar
,而不是pillars
secret = runner.cmd(fun='salt.cmd', arg=['pillar.get', 'my_secret'], kwargs={"with_pillar": True})
然而,我不喜欢这种方法,原因有两个:
它假设您的saltmaster的id
与您在top.sls
中目标的minion id匹配,这是非常不可能的,因为主的id
的后缀是_master
和运行它的主机的hostname
(默认情况下).
非常笨重,而且很贵.为什么?因为它不仅首先调用Runner客户端,然后该客户端调用Runner salt
模块,然后Runner salt
模块最终调用pillar
模块!
更好的方法是直接导入和使用pillar
模块,如下所示,这样可以省go 大量昂贵的操作:
import salt.pillar
import salt.runner
import logging
log = logging.getLogger(__name__)
runner = salt.runner.Runner(__opts__)
master_id = "my_saltmaster"
grains = None # specify any grain if required to render your top.sls
# Load required pillars
# deepcopy because we don't want to modify the actual __opts__
opts = copy.deepcopy(__opts__)
opts['pillar'] = salt.pillar.get_pillar(
opts,
grains,
master_id,
saltenv=opts['saltenv'],
pillarenv=opts.get('pillarenv')).compile_pillar()
# extract required secret key from the pillar
my_secret = opts['pillar'].get('my_secret', None)
log.info(f"my_secret = {my_secret}")
阅读有关pillar
模块代码here的更多信息:)