使用Saltstack(作为一个完整的新手),我需要在目标上提供一个Java属性文件。这个文件将有一个模板(我假设最好的模板格式是Jinja)和一组键/值对来填充它。所以我可以这样做:
/some/file/on/target:
file.managed:
- source:
- salt://template.jinja
- template: jinja
- defaults:
key1: value1
key2: value2
问题是集合是可变的(随着时间的推移,从一个环境到另一个环境),并且盐公式似乎不是放置其成员的最佳位置。盐公式将由开发人员维护,而不同环境中的属性及其值将由开发人员维护。
有没有好办法呢?
答案 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
2015.5.3
开始,没有标准版本。使用上面的宏更麻烦(需要从文件中导入它们并使用更混乱的语法来调用它们。)至少上面的宏仍然普遍适用于许多用例。