为多个 OS 和版本配置 Salt SLS 文件
Configuring Salt SLS files for multiple OS and versions
我正在尝试学习 Salt 并想为新 VM 设置部署机制。
目前每个虚拟机都有一个主机名,基于我要安装的软件和版本,所以:
- app-101-1 - 将是一个 Ubuntu 带有应用程序软件的 VM,版本 1.0.1,从本地 rpm 安装。
- app-101-2 - 将是 CentOS VM,具有相同的应用程序软件和版本,但转速不同,因为它是 CentOS 机器。
- dev-231-1 - 将从不同的本地 rpm 安装 2.3.1 版的开发软件。
你懂的。
这些 RPM 将根据应用程序、应用程序版本、O/S 类型和 O/S 版本而有所不同:
- app-1.0.1-rhel-6-x86_64.tar.gz
- app-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
这行得通,它匹配名称为 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_type
和 map
你可以得到更便携和干净的东西。
感谢@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 的输出表明它可以正常工作。
我正在尝试学习 Salt 并想为新 VM 设置部署机制。
目前每个虚拟机都有一个主机名,基于我要安装的软件和版本,所以:
- app-101-1 - 将是一个 Ubuntu 带有应用程序软件的 VM,版本 1.0.1,从本地 rpm 安装。
- app-101-2 - 将是 CentOS VM,具有相同的应用程序软件和版本,但转速不同,因为它是 CentOS 机器。
- dev-231-1 - 将从不同的本地 rpm 安装 2.3.1 版的开发软件。
你懂的。
这些 RPM 将根据应用程序、应用程序版本、O/S 类型和 O/S 版本而有所不同:
- app-1.0.1-rhel-6-x86_64.tar.gz
- app-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
这行得通,它匹配名称为 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_type
和 map
你可以得到更便携和干净的东西。
感谢@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 的输出表明它可以正常工作。