SaltStack jinja在推向仆从之前对主人发出命令

时间:2018-01-07 20:36:19

标签: jinja2 salt-stack

我有一个简单的任务,我试图用Salt执行。

我想为我的所有服务器动态创建一个motd文件,这需要使用机器主机名在顶部呈现ascii art。

我想在主人身上做这个渲染,然后被推到仆从。

到目前为止,我有这个简单的文件:/srv/salt/content/all/etc/update-motd.d/05-hostname

#!/bin/bash
cat << "EOF"
{{ salt.cmd.shell('figlet TestServer') }}
EOF

然后将此文件用于:/srv/salt/motd/init.sls

/etc/update-motd.d/05-hostname:
  file.managed:
    - source: salt://content/all/etc/update-motd.d/05-hostname
    - template: jinja

如果我尝试运行它,它将使用输出保存文件:/bin/sh: 1: figlet: not found,我猜,这是因为命令是在minion上执行而不是在master上执行。

sudo salt 'server' state.sls motd

我确实知道,我可以在所有服务器上安装saltmaster figlet,但我认为这会浪费。主人已经通过grains知道主机名,因此它应该是一个简单的任务,在推送之前在主服务器上生成该文件。

有没有人有任何想法来完成这个?

1 个答案:

答案 0 :(得分:1)

状态jinja是在minion本身上呈现的,所以file.managed无法以这种方式工作。

为了在主人身上呈现某些东西,你需要使用支柱。

所以你需要在master上添加一个看起来像这样的柱子:

{% set host = grains['fqdn'] %}
{% set command = 'figlet ' + host %}
{% set output = salt.cmd.shell(command) %}
motd:
  out: {{ output|yaml_encode }}

然后将/srv/salt/content/all/etc/update-motd.d/05-hostname指向支柱。

#!/bin/bash
cat << "EOF"
{{ pillar['motd']['out'] }}
EOF