SaltStack file.recurse per minion

时间:2016-09-29 07:31:52

标签: salt-stack

目标

如何在minion上安装file.recurse的文件?

当前战略

这样可行:

   files_per_minion:
      file.recurse:
        - source: salt://monitoring/files/per_minion/{{ grains.id }}
        - name: /
        - template: jinja

...但是对于那些在主人身上没有此目录的仆从来说却失败了。我不想为我主人的每个小兵创建一个目录。

我搜索可选包含的方法。这是伪代码中的条件:

 {% if magic_way_to_check_if_source_exists salt://monitoring/files/per_minion/{{ grains.id }} %}

   files_per_minion:
      file.recurse:
        - source: salt://monitoring/files/per_minion/{{ grains.id }}
        - name: /
        - template: jinja

 {% endif %}

问题

如何写条件magic_way_to_check_if_source_exists

欢迎其他解决方案

条件magic_way_to_check_if_source_exists只是实现目标的一种策略。欢迎其他解决方案。

使用案例

想象一下,我希望安装cron_tab_file_for_xhost,但只能在名为 xhost 的主机上安装。我可以通过为此主机创建目录树和文件来解决此问题:

monitoring/files/per_minion/xhost/etc/cron.d/cron_tab_file_for_xhost

1 个答案:

答案 0 :(得分:2)

根据您的用例和状态树,有不同的方法。

最简单的方法是创建一个单独的状态,并使用top.sls附加此状态。

如果您处理通过支柱配置的公式。我会把这些信息写在我支柱的某个地方。然后各州根据支柱数据做出决定。

<强> pillar.example

yourformula:
  getspecificfile: true

<强> somestate.sls

{% if salt['pillar.get']("yourformula:getspecificfile") %}
files_per_minion:
  file.recurse:
    - source: salt://monitoring/files/per_minion/{{ grains.id }}
    - name: /
    - template: jinja
{% endif %}

<强>更新

我刚看了docs of the file.managed state

  

可以将source参数指定为列表。如果这样做,那么要匹配的第一个文件将是使用的文件。如果salt文件服务器上不存在所需的文件,则允许您拥有一个默认文件。这是一个例子:

/etc/foo.conf:
  file.managed:
    - source:
      - salt://foo.conf.{{ grains['fqdn'] }}
      - salt://foo.conf.fallback
    - user: foo
    - group: users
    - mode: 644
    - backup: minion

这似乎是另一种选择 - 如果你不小心推出你的爪牙上不需要的空文件。