SaltStack jinja 运行 在推送到 minion 之前在 master 上执行命令

SaltStack jinja run command on master before pushing to minion

我有一个简单的任务,我正在尝试使用 Salt 来执行它。

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

我想在 master 上渲染,然后被推送到 minion。

到目前为止我有这个简单的文件:/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 上执行的,而不是在大师.

sudo salt 'server' state.sls motd

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

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

State 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