Salt的mine.get命令在CLI中有效但在jinja模板中无效
我在使用SaltStack,并且为每个小矿工(minion)设置了匹配其特征的配置文件。
当我在小矿工的命令行界面运行一个叫做mine.get的命令时,一切正常:
salt-call mine.get 'role:production-server' network.ip_addrs grain
但是,当我在同一个小矿工的jinja模板中使用相同的命令时,就出现了错误:
{% for host, ip in salt['mine.get']('role:production-server', 'network.ip_addrs', expr_form='grain').items() %}
local:
Data failed to compile:
----------
Pillar failed to render with the following messages:
----------
Rendering SLS 'role_settings.staging-server' failed, render error:
Jinja error: 'master_uri'
Traceback (most recent call last):
File "/usr/lib/python2.7/dist-packages/salt/utils/templates.py", line 265, in render_jinja_tmpl
output = template.render(**unicode_context)
File "/usr/lib/python2.7/dist-packages/jinja2/environment.py", line 894, in render
return self.environment.handle_exception(exc_info, True)
File "<template>", line 25, in top-level template code
File "/usr/lib/python2.7/dist-packages/salt/modules/mine.py", line 182, in get
auth = _auth()
File "/usr/lib/python2.7/dist-packages/salt/modules/mine.py", line 24, in _auth
__context__['auth'] = salt.crypt.SAuth(__opts__)
File "/usr/lib/python2.7/dist-packages/salt/crypt.py", line 498, in __init__
self.crypticle = self.__authenticate()
File "/usr/lib/python2.7/dist-packages/salt/crypt.py", line 510, in __authenticate
self.opts.get('_safe_auth', True)
File "/usr/lib/python2.7/dist-packages/salt/crypt.py", line 341, in sign_in
if self.opts['master_ip'] not in self.opts['master_uri']:
KeyError: 'master_uri'
我对此感到很困惑,因为在命令行中运行是没问题的,这似乎排除了与salt主控(master)通信的问题。
1 个回答
1
我知道这是个老帖子,但……
你似乎是在调用一个自定义的Python模块,以便在你的pillar文件中访问矿井(mine)。
在公式的上下文中这样做是可以的,但默认情况下,这种方法不适用于pillar数据,因为自定义模块是在从属机(minion)上,而pillar数据是在主控机(master)上编译的。
为了让主控机能够访问从属机的模块,你需要在你的Salt主控机配置中添加类似下面的内容:
module_dirs:
- /var/cache/salt/minion/extmods
添加完之后,你需要重启你的Salt主控机:
sudo service salt-master restart
注意:我怀疑上面的设置只有在你的Salt主控机上安装并配置了Salt从属机,并且安装了自定义模块的情况下才会有效。
想了解更多信息,可以查看Salt的文档: https://docs.saltstack.com/en/latest/ref/configuration/master.html#module-dirs