为多个 OS 和版本配置 Salt SLS 文件

Configuring Salt SLS files for multiple OS and versions

我正在尝试学习 Salt 并想为新 VM 设置部署机制。

目前每个虚拟机都有一个主机名,基于我要安装的软件和版本,所以:

你懂的。

这些 RPM 将根据应用程序、应用程序版本、O/S 类型和 O/S 版本而有所不同:

我希望 Salt 配置尽可能简单,但理想情况下我不希望每个 RPM 都有一个单独的 SLS 文件。到目前为止,我的 top.sls 为:

base:
  'host:app-101*':
    - match: grain
    - app-101

这行得通,它匹配名称为 start 和 "app-101" 的虚拟机。

我还有一个 app-101.sls 文件,看起来像:

app:
  'G@os:CentOS and G@osrelease:6.*':
    - match: compound

  file.managed:
    - name: /home/user/app-1.0.1-rhel-6-x86_64.tar.gz
    - source: salt://sw/app-1.0.1-rhel-6-x86_64.tar.gz

  cmd.run:
    - name: "tar xvzf /home/user/app-1.0.1-rhel-6-x86_64.tar.gz; rpm -ivh /home/user/app-101/*rpm"
    - creates: /usr/local/sbin/app

尽管 file.managed 和 cmd.run 部分确实将 tar 球复制到 VM 并安装从中提取的 RPM,但复合语句根本不起作用,所以任何对此的评论将不胜感激,尤其是关于复合语句有什么问题。

但是,有没有更好的方法来做到这一点?我希望能够为每个应用程序或至少为每个应用程序+版本提供一个 SLS 文件,该文件可以区分 OS 名称和版本以及 upload/install 正确的文件。复合语句似乎是显而易见的方法,但我无法让它们工作,如果可以的话,我仍然看不出如何在单个 SLS 文件中包含多组文件,但也许我错过了点这里。

您可以使用 map, for example, based on the os_family you could define custom variables, in this example, the source, and use_path: (check saltstack formulas 作为更多示例)

{% set conf = salt['grains.filter_by']({
'Debian':  {
    'source': 'https://app-01',
    'use_path': '/etc/app',
},
'FreeBSD': {
    'source': 'https://app-02',
    'use_path': '/usr/local/etc/app',
},
}, grain='os_family', merge=salt['pillar.get']('your-app:lookup')) %}

然后在你的 top.sls 中你可以使用类似的东西:

base:
  '*':
    - common

  'node_type:your_minion_type':
   - match: grain
   - your-app

在这种情况下,node_type 是一个自定义粒度,您可以在 /etc/salt/grains 中提升 VM 时添加它,或者使用类似的东西:

salt 'minion-ID' grains.setval node_type your_minion_type

因此,通过使用自定义颗粒,在这种情况下,node_typemap 你可以得到更便携和干净的东西。

感谢@nbari 为我指明了正确的方向。问题(事实证明)是如何在 SLS 文件中创建和使用 Jinja(?) 变量。我最终得到了这个,它很好地完成了工作:

$ cat app-101.sls
{% set apvar = salt['grains.filter_by'] ( {
  'Debian': {'osver': 'ubuntu-14.04', 'pkgend': 'deb', 'pkginst': 'dpkg -i'},
  'RedHat': {'osver': 'rhel-6', 'pkgend': 'rpm', 'pkginst': 'rpm -ivh'},
}, default = 'RedHat') %}

app:
  file.managed:
    - name: /home/user/app-1.0.1-{{ apvar.osver }}-x86_64.tar.gz
    - source: salt://sw/app-1.0.1-{{ apvar.osver }}-x86_64.tar.gz

  cmd.run:
    - name: "cd /home/user; tar xvzf /home/user/app-1.0.1-{{ apvar.osver }}-x86_64.tar.gz; {{apvar.pkginst }} /home/user/app-101/*.{{ apvar.pkgend }}"
    - creates: /usr/local/sbin/app

这里仍然存在错误,例如: - 假设您可以安装多个软件包 一个命令(rpm -i *rpmdpkg -i *deb) - 期望解压包后,包将 在特定的子目录中。

不过,目前这对我有用,希望对其他人有所帮助。

我应该注意到我还不能在 Debian 服务器上尝试这个,因为我的 Debian minion 软件不能正常工作,但是 RedHat 的输出表明它可以正常工作。