我正在尝试学习Salt,并希望为新VM设置部署机制。
目前,每个VM都有一个主机名,该主机名基于我要安装的软件和版本,因此:
你明白了。
这些RPM将根据应用程序,应用程序版本,O / S类型和O / S版本而有所不同:
我希望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文件中拥有多组文件,但也许我在这里忽略了这一点。
答案 0 :(得分:0)
您可以使用map,例如,基于您可以定义自定义变量的os_family
,在此示例中,source
和use_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_type
和map
你可以提供更便携和干净的东西。
答案 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 *rpm
或dpkg -i *deb
)
- 期望在解开捆绑之后,包裹会
在一个特定的子目录。
然而,现在这对我有用,并希望能帮助别人。
我应该注意到我还没有在Debian服务器上尝试这个,因为我的Debian minion软件工作不正常,但RedHat的outpu表明它可以正常工作。