我想知道如何使用Environmental Variables
正确访问SaltStack Grains
。
我一直关注documentation,但一直无法让它发挥作用。这是我的代码:
/srv/salt/_grains/env_vars.py
import os
def env_vars():
return {'T17_SECRET_KEY': os.environ.get('T17_SECRET_KEY','')}
然后我运行salt '*' saltutil.sync_grains
我收到了这个回复:
salt:
- grains.env_vars
但是当我运行salt '*' grains.items
时,它会显示:
salt:
----------
SSDs:
T17_SECRET_KEY:
# other vars ...
所以关键在那里,但价值不是。当我从Python命令行运行os.environ.get('T17_SECRET_KEY','')
时,值就在那里。
导致这种情况的原因是什么?
修改
我改变了这个:
/srv/salt/_grains/env_vars.py
from salt.modules import environ
def env_vars():
return {'T17_SECRET_KEY': environ.get('T17_SECRET_KEY','')}
当我从Python命令行执行此函数时,它返回Key:Value,但仍然在运行salt '*' saltutil.sync_grains
和salt '*' grains.items
时,我看不到Value,只看到Key。
我甚至跑salt '*' state.highstate
来重新加载所有内容。
这可能是由其他一些配置引起的吗?
答案 0 :(得分:2)
os.environ
访问恰好执行代码的(随机)Salt minion的进程环境;如果要访问当前salt进程的环境,则需要使用此模块:salt.modules.environ
原因是salt可以在许多计算机上运行您的代码。每个人的环境可能会有所不同。因此,除非你能确保你的代码在某个minion上运行并且该minion上的环境是正确的,否则你的代码将无法工作。
模块salt.modules.environ
使您可以访问在提交命令时构建盐的虚拟过程环境。
要正确访问salt.modules.environ
,请使用salt.states.environ
添加以下文件:
/srv/salt/_grains/env_vars.py
from salt.modules import environ
def env_vars():
return {'T17_SECRET_KEY': environ.get('T17_SECRET_KEY','')}
/srv/salt/environ/init.sls
T17_SECRET_KEY:
environ.setenv:
- name: T17_SECRET_KEY
- value: <secret_key_value_here>
- update_minion: True
然后运行此命令以同步新添加的环境变量:
salt '*' state.sls environ
salt '*' saltutil.sync_grains
要验证,可以运行此代码:
salt '*' grains.get T17_SECRET_KEY