如何解决执行模块功能类似于“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
但是,我找不到可以执行此操作的执行模块。有 file.manage_file 但它有一堆我不关心的必需参数:sfn
、ret
、source
、source_sum
、{{1 }},user
,group
,mode
,attrs
,saltenv
-- 如果您不提供这些值,backup
将失败。
我发现的最接近的模块函数是 cp.get_template,但它不允许您传入 file.manage_file
或 context
,因此我不得不将我的 XML 文件模板化为像这样从柱子读入数据:
defaults
这行得通,但是我只能用支柱数据呈现我的 XML——我希望能够在调用我的执行模块时传入变量并使用 那些 变量来呈现我的 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
参数。这实际上对我的用例很有效,因为我使用来自应用于所有 Minion 的支柱的值设置默认值,而 context
是用户提供的覆盖。
cp.get_file_str
将文件内容作为字符串返回——我不知道这在非常大的文件上会如何执行,但对于较小的配置文件,我没有看到问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。