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

时间:2015-07-27 03:41:00

标签: salt-stack

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

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

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

有没有好办法呢?

2 个答案:

答案 0 :(得分:3)

想出来:

/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.

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

答案 1 :(得分:1)

虽然你有自己的答案(正确而直截了当),但实际上你需要更多的灵活性。

宏库

在少数情况下,我使用 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 even this 可以复制粘贴),但是&# 39;不够 DRY

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