执行模块功能类似'file.managed'?
Execution module function similar to 'file.managed'?
我正在尝试找到一个执行模块,它允许我通过 Jinja 模板引擎传递文件并提供应替换的参数。存在一个 file.managed
state 模块来完成此行为:
my cool state:
file.managed:
- source: salt://my/cool/file.xml
- name: 'C:\Program Files\My dir\file.xml'
- template: jinja
- context:
someVar: 'some value'
another_var: 12345
但是,我找不到可以执行此操作的 execution 模块。有 file.manage_file 但它有一堆我不关心的必需参数:sfn
、ret
、source
、source_sum
、user
、group
、mode
、attrs
、saltenv
、backup
-- 如果您不为这些值提供值,file.manage_file
将失败。
我发现的最接近的模块函数是 cp.get_template,但它不允许您传入 context
或 defaults
,所以我不得不模板化我的 XML 文件以从支柱中读取数据,如下所示:
{%- from "map.jinja" import my_vars with context %}
<?xml version="1.0" encoding="UTF-8"?>
<root>
<some-element>{{ my_vars.some-element }}</some-element>
<another-thing>{{ my_vars.another-thing }}</another-thing>
</root>
这行得通,但是我只能用支柱数据渲染我的 XML——我希望能够在调用我的执行模块时传入变量并使用 those 变量来呈现我的 XML。有什么方法可以用执行模块来完成这个行为吗?
我使用执行模块的组合解决了这个问题:
# Get template file
templateContent = __salt__['cp.get_file_str'](
'salt://my/cool/file.xml'
)
# Render file with Jinja
renderedContent = __salt__['file.apply_template_on_contents'](
contents = templateContent,
template = 'jinja',
saltenv = 'base',
defaults = defaults,
context = context
)
# Write the rendered file to disk
__salt__['file.write'](
'/opt/some/path/on/minion/file.xml',
renderedContent
)
需要考虑两件事:
file.apply_template_on_contents
要求您同时提供 defaults
和 context
参数。这实际上对我的用例非常有效,因为我使用适用于所有小兵的支柱的值设置默认值,context
是用户提供的覆盖。
cp.get_file_str
returns 文件内容作为一个字符串——我不知道这将如何处理一个非常大的文件,但对于较小的配置文件我没有看到问题.
我正在尝试找到一个执行模块,它允许我通过 Jinja 模板引擎传递文件并提供应替换的参数。存在一个 file.managed
state 模块来完成此行为:
my cool state:
file.managed:
- source: salt://my/cool/file.xml
- name: 'C:\Program Files\My dir\file.xml'
- template: jinja
- context:
someVar: 'some value'
another_var: 12345
但是,我找不到可以执行此操作的 execution 模块。有 file.manage_file 但它有一堆我不关心的必需参数:sfn
、ret
、source
、source_sum
、user
、group
、mode
、attrs
、saltenv
、backup
-- 如果您不为这些值提供值,file.manage_file
将失败。
我发现的最接近的模块函数是 cp.get_template,但它不允许您传入 context
或 defaults
,所以我不得不模板化我的 XML 文件以从支柱中读取数据,如下所示:
{%- from "map.jinja" import my_vars with context %}
<?xml version="1.0" encoding="UTF-8"?>
<root>
<some-element>{{ my_vars.some-element }}</some-element>
<another-thing>{{ my_vars.another-thing }}</another-thing>
</root>
这行得通,但是我只能用支柱数据渲染我的 XML——我希望能够在调用我的执行模块时传入变量并使用 those 变量来呈现我的 XML。有什么方法可以用执行模块来完成这个行为吗?
我使用执行模块的组合解决了这个问题:
# Get template file
templateContent = __salt__['cp.get_file_str'](
'salt://my/cool/file.xml'
)
# Render file with Jinja
renderedContent = __salt__['file.apply_template_on_contents'](
contents = templateContent,
template = 'jinja',
saltenv = 'base',
defaults = defaults,
context = context
)
# Write the rendered file to disk
__salt__['file.write'](
'/opt/some/path/on/minion/file.xml',
renderedContent
)
需要考虑两件事:
file.apply_template_on_contents
要求您同时提供 defaults
和 context
参数。这实际上对我的用例非常有效,因为我使用适用于所有小兵的支柱的值设置默认值,context
是用户提供的覆盖。
cp.get_file_str
returns 文件内容作为一个字符串——我不知道这将如何处理一个非常大的文件,但对于较小的配置文件我没有看到问题.