首页 > 解决方案 > ansible - 使用 jinja 模板更改配置文件中的特定行

问题描述

我有一个想要模板化的 .ini 配置文件,但我只想用 jinja2 文件操作一两行。

示例配置文件:

[configuration]
config1 = this_is_fine
config2 = to_be_templated
config3 = to_be_templated
config_4 = this_is_fine

定义只会改变的 configuration.ini.j2 的最佳方法是什么

config2 = {{ assigned_value }}
config3 = {{ assigned_value }}

在运行剧本时保持格式和剩余配置到位?

标签: linuxdeploymentansibleconfigurationjinja2

解决方案


问:用 Jinja2 文件操作一两行。

A:“一两行”是指一个。使用blockinfile来操作文件中的块。您需要标记来执行此操作,例如给定文件

shell> cat conf.ini
[configuration]
config1 = this_is_fine
config2 = to_be_templated
config3 = to_be_templated
config_4 = this_is_fine

下面的两个任务在开始config2和结束config3的块周围放置标记

    - replace:
        path: conf.ini
        regexp: '(config2.*)'
        replace: |-
          {{ '#' }} BEGIN ANSIBLE MANAGED BLOCK c2-3
          \g<1>
    - replace:
        path: conf.ini
        regexp: '(config2.*[\s\S]*?config3.*)'
        replace: |-
          \g<1>
          {{ '#' }} END ANSIBLE MANAGED BLOCK c2-3

shell> cat conf.ini
[configuration]
config1 = this_is_fine
# BEGIN ANSIBLE MANAGED BLOCK c2-3
config2 = to_be_templated
config3 = to_be_templated
# END ANSIBLE MANAGED BLOCK c2-3
config_4 = this_is_fine

这两个任务不是幂等的。只运行一次。将它们放在单独的剧本中以设置项目或测试标记的存在。

现在您可以使用模板

shell> cat conf.ini.j2
config2 = {{ assigned_value }}
config3 = {{ assigned_value }}

例如下面的任务

    - blockinfile:
        path: conf.ini
        marker: '# {mark} ANSIBLE MANAGED BLOCK c2-3'
        block: |
          {{ lookup('template', 'conf.ini.j2') }}
      vars:
        assigned_value: AVALUE

shell> cat conf.ini
[configuration]
config1 = this_is_fine
# BEGIN ANSIBLE MANAGED BLOCK c2-3
config2 = AVALUE
config3 = AVALUE
# END ANSIBLE MANAGED BLOCK c2-3
config_4 = this_is_fine

推荐阅读