首页 文章

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

提问于
浏览
0

我有一个简单的任务,我正在尝试用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 回答

  • 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
    

相关问题