我有一个简单的任务,我试图用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
知道主机名,因此它应该是一个简单的任务,在推送之前在主服务器上生成该文件。
有没有人有任何想法来完成这个?
答案 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