2014-03-19 222 views
7

在Saltstack中,我有以下用例:在盐状态之间传递变量

有一个状态redis.sls可以被其他状态包含。 redis.sls的结果应该配置不同,具体取决于包含redis.sls的状态。

例如:

redis.sls: 
-------- 
{% if x==1 %} 
    #do something 
{% else %} 
    #do something else 
{% endif %} 


state_a.sls 
----------- 
{% set x=1 %} 
include: 
    - redis 

state_b.sls 
----------- 
{% set x=2 %} 
include: 
    - redis 

X未在* STATE_A认可*和* STATE_B *

我也试着设置一个支柱值像这样的东西:

{{salt['pillar.set']('x', 1)}} 

但也没有工作。

还有其他想法吗?

+0

好像你正试图参数状态的方式,他们目前没有被设计成进行参数设置。你想用这个完成什么? – pcurry

+0

我有几乎相同的[问题](http://stackoverflow.com/questions/38904308/passing-variables-with-include-in-salt-stack)。例如,我们有redis-master和redis-replication。这种状态几乎是一样的,问题是如何避免代码重复。 – Raz

回答

1

我想听听专家说什么,但我有一个类似的用例。我所做的是使用jinja template来扩展基本模板,然后我的子模板填充变量。

{% extends "base.template.sls" %} 
{% block x %}1{% endblock %} 

唯一的问题可能是你现在必须调用STATE_A并分别STATE_B但你总是可以把它们放到一个逗号分隔的列表,如果你想都呼吁。

0

它看起来像你想参数化一个状态的基础上依赖什么,或者它在什么地方使用。这听起来像是设置redis.sls状态应该改变的参数,取决于redis的特定配置。

对我来说,这似乎有不止一个不同的状态,其中的一些状态取决于redis的一种状态,而其他状态取决于redis的其他状态。

所以,给redis的安装一个状态,redis的具体配置会各自得到自己的状态。你STATE_A可以依靠redis_state_1和你STATE_B又将取决于redis_state_2redis_state_1redis_state_2将取决于redis。在我看来,传递给你的参数不太明确。

+0

你能解释一下如何存档吗?例如,我想在一台服务器上安装2个不同的redis实例。我可以用**版本**变量制作** redis **状态。但如何用不同的值调用它? – Raz

+0

@Raz自从我用盐以来,我一直在重新审视文档。我认为Ansible现在赢得了用户份额。 – pcurry

1

让你的redis状态成为一个忍者宏。

redis.sls: 
-------- 
{% macro redis(x) %} 
{% if x==1 %} 
    #do something 
{% else %} 
    #do something else 
{% endif %} 
{% endmacro %} 


state_a.sls 
----------- 
{% from 'redis.sls' import redis %} 
{{ redis(1) }} 


state_b.sls 
----------- 
{% from 'redis.sls' import redis %} 
{{ redis(2) }} 

为了清楚起见,redis.sls应该在这里重命名为redis.jinja。

这和许多其他管理状态定制的方式最好在Salt Formulas conventions guide中解释。特别是有关Jinja宏的部分

请注意,如果您可以完全避免x == 1逻辑,请参阅指南中的haproxy示例的'更好'版本。

-1

SALT.STATES.ENVIRON可能会为你工作:

set_secret_key: 
    environ.setenv: 
    - name: SECRET_KEY 
    - value: [email protected]#abc 
    - update_minion: True 

[..] 

settings_secret_key: 
    file.replace: 
    - name: {{ salt['pillar.get']('data:source_folder') }}superlists/settings.py 
    - pattern: "SECRET_KEY =.+$" 
    - repl: 'SECRET_KEY = os.environ["SECRET_KEY"]'