SaltStack:来自SLS文件的数据的属性(计算值)?

gue*_*tli 7 python salt-stack

我们在salt管理的minions上运行了几个Python虚拟环境.

系统的名称由此架构构建:

project_customer_stage
Run Code Online (Sandbox Code Playgroud)

例:

supercms_favoritcustomer_p
Run Code Online (Sandbox Code Playgroud)

支柱数据:

systems:
  - customer: favoritcustomer
    project: supercms
    stage: p
  - customer: favoritcustomer
    project: supercms
    stage: q 
Run Code Online (Sandbox Code Playgroud)

对于每个virtualenv我们有一个linux用户.到目前为止,我们像这样计算像"home"这样的值:

{% for system in pillar.systems %}
  {% set system_name = system.project + '_' + system.customer + '_' + system.stage %}
  {% set system_home = '/home/' + system_name %}
  ...
Run Code Online (Sandbox Code Playgroud)

但这是多余的.

我们怎么能避免复制+粘贴{% set system_home = ...%}

我就像面向对象编程的工作方式:

  • 您可以为主目录定义属性
  • 如果在特殊情况下需要不同的主目录,那么您可以继承基类并覆盖基类的工作方式.

在盐中你有YAML和模板......两件好事.但就我而言,OOP会很好.

hel*_*ert 3

您还可以动态生成支柱数据。考虑以下支柱文件示例:

{% 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 %}
Run Code Online (Sandbox Code Playgroud)

此支柱定义从systems.ymlSalt 将在您的目录中查找的文件加载 YAML 数据pillar_root。该文件可能如下所示(与您最初的示例非常相似):

- customer: smith
  project: cms
  stage: p
- customer: jones
  project: shop
  stage: p
  name: jones_webshop_p  # <-- alternate name here!
Run Code Online (Sandbox Code Playgroud)

请注意,此示例动态计算项目名称和用户主目录等属性,除非它们在数据文件中明确定义。为此,在支柱定义中使用Jinjadefault()过滤器。

使用此支柱定义,您可以直接在支柱数据中直接在州定义中使用name和:home

{% for system in salt['pillar.get']('systems') %}
{{ system.home }}:
  file.directory
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

此外,在我看来,这些 Jinja 重的 SLS 文件有点难以阅读,您可能会考虑切换到Pillar 文件的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}
Run Code Online (Sandbox Code Playgroud)