执行模块功能类似'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 但它有一堆我不关心的必需参数:sfnretsourcesource_sumusergroupmodeattrssaltenvbackup -- 如果您不为这些值提供值,file.manage_file 将失败。

我发现的最接近的模块函数是 cp.get_template,但它不允许您传入 contextdefaults,所以我不得不模板化我的 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 要求您同时提供 defaultscontext 参数。这实际上对我的用例非常有效,因为我使用适用于所有小兵的支柱的值设置默认值,context 是用户提供的覆盖。

cp.get_file_str returns 文件内容作为一个字符串——我不知道这将如何处理一个非常大的文件,但对于较小的配置文件我没有看到问题.