在我的状态文件顶部,我有:
{% if grains['os'] == 'Ubuntu' %}
{% set ubuntu = True %}
{% set arch = False %}
{% elif grains['os'] == 'Arch' %}
{% set ubuntu = False %}
{% set arch = True %}
{% endif %}
稍后的,
{% if ubuntu %}
cron:
{% elif arch %}
cronie:
{% endif %}
pkg.installed
service.running:
- enable: True
但这不起作用;我的条件没有渲染任何内容(空字符串)。即使进行一点重构就可以完成工作,但这对我来说还是很糟糕。
有没有一种更惯用的方法可以用 Salt 来替换这样的小细节而不需要那么多模板样板?
答案1
它不起作用可能是因为pkg.installed
必须是一个列表,即使没有参数:
pkg.installed: []
这应该有效:
{% if ubuntu %}
cron:
{% elif arch %}
cronie:
{% endif %}
pkg.installed: []
service.running:
- enable: True
或者,用更聪明的方式:
{% set cron = salt['grains.filter_by']({
'Ubuntu': 'cron',
'Arch': 'cronie',
}, grain='os') %}
{{cron}}:
pkg.installed: []
service.running:
- enable: True
或者服务名称与包名称可能不同:
{% set cron = salt['grains.filter_by']({
'Ubuntu': {
'package': 'cron',
'service': 'crond',
},
'Arch': {
'package': 'cronie',
'service': 'cronie',
},
}, grain='os') %}
{{cron['package']}}:
pkg.installed: []
service.running:
- name: {{cron['service']}}
- enable: True
grains.filter_by
记录在http://docs.saltstack.com/en/latest/ref/modules/all/salt.modules.grains.html#salt.modules.grains.filter_by
如果需要更详细的东西,请查看https://github.com/saltstack-formulas/apache-formula/blob/master/apache/map.jinja