我正在为作为 podman 容器运行的应用程序编写自定义 Saltstack 状态,我发现这些状态之间有很多重复,因为它们都需要:
podman generate systemd
生成的 systemd 单元
systemd
单元的 env 文件以前这些主要由 RPM 包处理,但使用 Saltstack 就由我来处理,而且相当冗长。
我知道参数化状态+支柱,但我不喜欢那样,因为我会得到通用的
podman
状态加上大量的if/else,这会使其难以阅读。我认为 SaltStack 公式是相同的技术解决方案,但预先设计为可重用。
我不是 Python 程序员,所以我没有走定制模块的路。
还有其他选项来创建可重用的 Saltstack 自定义状态吗?
你不需要很多 if/else。您只需使用地图即可。
然后传递要使用的地图的最简单方法是通过 Jinja2
include
和 sls*
变量。
# salt/app1/init.sls
{% include common/states.sls %}
more specific state:
foo.whatever: []
# salt/app1/defaults.yaml
name: &NAME app1
user: *NAME
group: *NAME
data_dir: *NAME
conf_dir: *NAME
env:
FOO: 1
# ...
# salt/common/states.sls
{% from common/map.jinja import data with context %}
{{ data["name"] }} group:
group.present:
- name: {{ data["group"] }}
{{ data["name"] }} user:
user.present:
- name: {{ data["user"] }}
- groups: [ {{ data["group"] }} ]
- require:
- {{ data["name"] }} group
{{ data["name"] }} data directory:
file.directory:
- name: /var/lib/{{ data["datadir"] }}
- user: {{ data["user"] }}
- group: {{ data["group"] }}
- mode: '0750'
- require:
- {{ data["name"] }} user
- {{ data["name"] }} group
# ...
# salt/common/map.jinja
{% import_yaml slspath ~ "/defaults.yaml" as defaults %}
{% set overrides = salt["config.get"](slscolonpath) %}
{% set data = salt["slsutil.update"](defaults, overrides) %}
# pillar/minion-6.sls
app1:
group: shared-apps
env:
FOO: 0
BAR: 1