Saltstack:使用任意值从 Jinja 模板创建 Java 属性文件

Saltstack: creating Java properties file from Jinja template with arbitrary values

使用 Saltstack(作为一个完全的新手),我需要在目标上提供一个 Java 属性文件。该文件将有一个模板(我认为最好的模板格式是 Jinja)和一组 key/value 对来填充它。所以我可以这样做:

/some/file/on/target:
  file.managed:
    - source:
      - salt://template.jinja
    - template: jinja
    - defaults:
      key1: value1
      key2: value2

问题是集合是可变的(随着时间的推移,从一个环境到另一个环境),盐公式似乎不是放置其成员的最佳位置。盐公式将由开发人员维护,而不同环境中的属性及其值将由开发人员维护。

有什么好的方法吗?

想通了:

/some/file/on/target:
  file.managed:
    - source:
      - salt://template.jinja
    - template: jinja
    - defaults:
{%- for key, value in pillar.get('default', {}).items() %}
      {{key}}: {{value}}
{%- endfor %}

注意开始标记的具体形式,以抑制空格,否则它不是有效的 YAML。默认支柱包含例如:

key1: value1
key2: value2
.. etc.

很抱歉回答我自己的问题。我确实花了那么长时间才找到答案。

虽然您有自己的答案(正确且直接),但在实践中您通常需要更大的灵活性。

宏库

在少数情况下,我使用 these Jinja macros 来管理 Java 属性 文件:

例子

从您的状态文件中的文件导入宏并像这样使用它们:

# Import one macro.
{% from 'common/libs/java_properties.lib.sls' import set_property with context %}

# State id which `set_property` below requires to complete successfully first.
unzip_application_archive:
  archive.extracted:
    - name: /tmp
    - source: salt://path/to/application.zip
    - source_hash: md5=499ae16dcae71eeb7c3a30c75ea7a1a6
    - archive_format: zip

# Call macro to render states which actually set the property.
# NOTE: It depends on the state `unzip_application_archive` above.
{{ set_property(
        'some_unique_string_for_global_state_id',
        '/absolute/path/to/file.properties',
        'property_name', 'property_value',
        [
            { 'archive': 'unzip_application_archive' }
        ]
    )
}}

# Example of state which depends on successful setting of property.
dummy_dependent_state:
    cmd.run:
        - name: 'echo DONE'
        - require:
            - cmd: set_property_some_unique_string_for_global_state_id

备选方案

  • 自定义 Salt state module... Salt 版本 2015.5.3 没有标准版本。使用上面的宏比较麻烦(需要从文件中导入它们并使用更混乱的语法来调用它们)。
  • 可以直接写状态(this or even this are copy-paste-able), but it's not DRY就够了。

至少上面的宏仍然普遍适用于许多用例。