为多个操作系统和版本配置Salt SLS文件

时间:2018-03-29 17:52:37

标签: salt-stack

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

目前,每个VM都有一个主机名,该主机名基于我要安装的软件和版本,因此:

  • app-101-1 - 将是一个带有应用程序软件ver 1.0.1的Ubuntu VM,从本地rpm安装。
  • app-101-2 - CentOS VM是一款相同的应用软件和版本,但转速不同,因为它是CentOS机器。
  • dev-231-1 - 将从不同的本地rpm安装dev软件ver 2.3.1。

你明白了。

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

  • 应用-1.0.1-RHEL -6- x86_64.tar.gz
  • 应用-1.0.1-的ubuntu-14-x86_64.tar.gz
  • APP-1.0.2-RHEL -6- x86_64.tar.gz
  • DEV-3.2.1-RHEL -7- x86_64.tar.gz

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

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

这样可行,它会匹配名称以" 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文件,以区分操作系统名称和版本并上载/安装正确的文件。复合语句似乎是显而易见的方法,但我不能让它们工作,如果我能,我仍然不知道如何在单个SLS文件中拥有多组文件,但也许我在这里忽略了这一点。

2 个答案:

答案 0 :(得分:0)

您可以使用map,例如,基于您可以定义自定义变量的os_family,在此示例中,sourceuse_path :(检查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你可以提供更便携和干净的东西。

答案 1 :(得分:0)

感谢@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的outpu表明它可以正常工作。