如何将变量从SaltStack编排(Orchestration)传递至Minion状态文件?
问题分析
你当前的写法中,test.sls在Master端通过salt.pillar.get('env')拿到了编排时传入的env变量,但调用salt.state执行web_check.sls时,并没有将这个变量传递给Minion端。web_check.sls里直接使用env变量会报错,因为Minion端的pillar默认没有这个env值,也没有从编排上下文接收这个变量。
解决方法
有两种常用方式可以将编排中的env变量传递给子状态文件:
方法一:通过salt.state的pillar参数传递
修改test.sls,在salt.state模块中添加pillar参数,将env变量注入到Minion的临时pillar中,这样web_check.sls就可以通过salt.pillar.get获取该值:
修改后的test.sls
{% set env = salt.pillar.get('env') %} {{ env }}_check: salt.state: - tgt: 'minion-id' - sls: web_check - pillar: env: {{ env }} # 将env传递给Minion的pillar
修改后的web_check.sls
{% set env = salt.pillar.get('env') %} {% if env == 'qa' %} test: cmd.run: - name: ls -ltra /tmp {% elif env == 'uat' %} test: cmd.run: - name: ls -ltra /tmp/uat {% endif %}
方法二:通过context参数传递上下文变量
另一种方式是使用salt.state的context参数传递变量,子状态文件可以直接通过jinja变量获取:
修改后的test.sls
{% set env = salt.pillar.get('env') %} {{ env }}_check: salt.state: - tgt: 'minion-id' - sls: web_check - context: env: {{ env }} # 将env作为上下文变量传递
修改后的web_check.sls
{% if env == 'qa' %} test: cmd.run: - name: ls -ltra /tmp {% elif env == 'uat' %} test: cmd.run: - name: ls -ltra /tmp/uat {% endif %}
执行命令
保持原执行命令不变:
salt-run state.orchestrate test pillar='{"env": "qa"}'
内容的提问来源于stack exchange,提问作者Megazord
相关产品推荐
相关产品推荐

