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 属性 文件:
- append_property 更改 "automatic part" 属性文件,保持 "manual part" 不变
- comment_out_property 确保未设置
- set_property(强制新值)同时注释掉旧值
例子
从您的状态文件中的文件导入宏并像这样使用它们:
# 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就够了。
至少上面的宏仍然普遍适用于许多用例。
使用 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 属性 文件:
- append_property 更改 "automatic part" 属性文件,保持 "manual part" 不变
- comment_out_property 确保未设置
- set_property(强制新值)同时注释掉旧值
例子
从您的状态文件中的文件导入宏并像这样使用它们:
# 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就够了。
至少上面的宏仍然普遍适用于许多用例。