SaltStack:来自SLS文件的数据的属性(计算值)?
我们在由盐管理的我们的爪牙上运行多个Python虚拟环境。
系统的名称由该模式构建而成:
project_customer_stage
例:
supercms_favoritcustomer_p
支柱数据:
systems:
- customer: favoritcustomer
project: supercms
stage: p
- customer: favoritcustomer
project: supercms
stage: q
对于每个virtualenv我们都有一个linux用户。 到目前为止,我们计算像“home”这样的值:
{% for system in pillar.systems %}
{% set system_name = system.project + '_' + system.customer + '_' + system.stage %}
{% set system_home = '/home/' + system_name %}
...
但它是多余的。
我们如何避免复制粘贴{% set system_home = ...%}
?
我喜欢面向对象编程的工作方式:
在盐你有YAML和模板......两件好事。 但在我的情况下,OOP会很好。
您也可以动态生成支柱数据。 考虑支柱文件的以下示例:
{% import_yaml "systems.yml" as systems %}
systems:
{% for system in systems %}
{% set name = system['name'] | default(system.project + '_' + system.customer + '_' + system.stage) %}
{% set home = system['home'] | default('/home/' + name) %}
- name: {{ name }}
customer: {{ system['customer'] }}
project: {{ system['project'] }}
stage: {{ system['stage'] }}
home: {{ home }}
{% endfor %}
这个支柱定义从Salt将在你的pillar_root
目录中查找的systems.yml
文件加载YAML数据。 该文件可能如下所示(非常类似于您的初始示例):
- customer: smith
project: cms
stage: p
- customer: jones
project: shop
stage: p
name: jones_webshop_p # <-- alternate name here!
请注意,此示例动态地计算项目名称和用户主目录等属性,除非它们在数据文件中明确定义。 为此,Jinja default()
过滤器用于柱体定义。
使用这个支柱定义,您可以直接从支柱数据中直接在状态定义中使用name
和home
:
{% for system in salt['pillar.get']('systems') %}
{{ system.home }}:
file.directory
{% endfor %}
另外 ,在我看来,这些Jinja重的SLS文件有点难以阅读,您可以考虑切换到您的支柱文件的Python渲染器:
#!py
import yaml
def run():
systems = []
with open('systems.yml', 'r') as f:
data = yaml.safe_load(f)
for system in data:
if not 'name' in system:
system['name'] = "%s_%s_%s" % (system['project'], system['customer'], system['stage'])
if not 'home' in system:
system['home'] = "/home/%s" % name
systems.append(system)
return {"systems": systems}
链接地址: http://www.djcxy.com/p/31265.html
上一篇: SaltStack: Properties (computed values) for data from SLS files?
下一篇: Spring Security locks user out with concurrent login attempts