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()过滤器用于柱体定义。

    使用这个支柱定义,您可以直接从支柱数据中直接在状态定义中使用namehome

    {% 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