Ansible 是否有一个模块可以组装配置文件,支持Jinja2模板,并在删除源模板时删除条目?

Ansible 是否有一个模块可以组装配置文件,支持Jinja2模板,并在删除源模板时删除条目?,ansible,Ansible,在使用Ansible模块时,更值得注意的是assemble和blockinfle,我注意到这两个模块都有一些缺点。这可能是由于缺乏任何一个模块的教育,或者是一个有意的设计 集合 例如,使用assemble时,我可以读取文件目录,并将它们“组装”到一个配置文件中,如下所示: assemble: src: <path to directory of files> dest: <destination> 我还可以包含多个类似以下内容的文件: block

在使用Ansible模块时,更值得注意的是
assemble
blockinfle
,我注意到这两个模块都有一些缺点。这可能是由于缺乏任何一个模块的教育,或者是一个有意的设计

集合 例如,使用
assemble
时,我可以读取文件目录,并将它们“组装”到一个配置文件中,如下所示:

  assemble:
    src: <path to directory of files>
    dest: <destination>
我还可以包含多个类似以下内容的文件:

  blockinfile:
    create: yes
    block: "{{ lookup('template', \"<path>/{{ item }}\") }}"
    dest: <destination>
    marker: "# {mark} Test {{ item }}"
    backup: yes
  with_items:
    - file1.j2
    - file2.j2
blockinfle:
创建:是
块:“{lookup('template',\”/{{item}}\”}”
目的地:
标记:“#{mark}测试{{item}”
备份:是的
有以下项目:
-文件1.j2
-文件2.j2
但是,此解决方案的缺点是,如果删除了源模板文件,则不会将其从
dest
中指定的文件中删除

最终目标 我想实现的目标如下

  • 读入文件目录,并将它们组合成一个文件
  • 对变量的支持。当源文件中有
    {{variable}}
    时,将其展开为其值
  • 如果先前将一个或多个源文件添加到目标文件中后缺少该源文件,请将其从目标文件中删除。同时将状态报告更改为

您可以使用包含其他模板的主模板

main.j2
的一个示例:

My first block
{% include block1.j2 %}

My second block
{% include block2.j2 %}

可以使用包含其他模板的主模板

main.j2
的一个示例:

My first block
{% include block1.j2 %}

My second block
{% include block2.j2 %}

您可以使用模板模块创建临时文件,然后使用汇编模块将所有临时文件缝合在一起(使用
remote\u src=true
),最后删除临时文件。不确定是否有更好的方法。感谢您的回复,这是解决此问题的一个好方法,我几乎忘记了存在
remote\u src
。我会尝试几种不同的方法。我能请你把你发现的情况汇报一下吗?我还没有经历过这种情况,但这只是时间问题,我想知道如何应对:D.非常感谢!最后,我们使用
blockinfle
在远程服务器上的临时目录中构造多个文件,然后
assemble
,将
remote\u src
设置为
true
,指向临时目录。组装文件后,将删除临时目录。您可以使用模板模块创建临时文件,然后使用组装模块将所有临时文件缝合在一起(使用
remote\u src=true
),最后删除临时文件。不确定是否有更好的方法。感谢您的回复,这是解决此问题的一个好方法,我几乎忘记了存在
remote\u src
。我会尝试几种不同的方法。我能请你把你发现的情况汇报一下吗?我还没有经历过这种情况,但这只是时间问题,我想知道如何应对:D.非常感谢!最后,我们使用
blockinfle
在远程服务器上的临时目录中构造多个文件,然后
assemble
,将
remote\u src
设置为
true
,指向临时目录。组装文件后,将删除临时目录。这是一种有趣的方法,但这与最后一个要求的目标背道而驰:
当一个或多个源文件在之前添加到目标文件后不存在时,将其从目标文件中删除。另外,将状态报告更改为
{%includeblock1.j2 ignore missing%}
这是一种有趣的方法,但是这违背了最后一个要求的目标:
当一个或多个源文件在之前添加到目标文件后不存在时,将其从目标文件中删除。还将状态报告更改为
{%includeblock1.j2忽略缺少的%}