使用SaltStack谷物访问环境变量

时间:2015-04-15 14:25:49

标签: python salt-stack

我想知道如何使用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_grainssalt '*' grains.items时,我看不到Value,只看到Key。

我甚至跑salt '*' state.highstate来重新加载所有内容。

这可能是由其他一些配置引起的吗?

1 个答案:

答案 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