使用哪个模块来编辑文件 - Ansible



我想编辑 telegraf(系统指标收集代理)的配置文件。

Telegraf 带有一个可以编辑的默认配置文件。其中定义了许多输入和输出插件,这些插件被注释掉,可以通过删除注释来添加,也可以自定义。

我只想编辑那里定义的一些插件,而不是全部。例如,考虑这是文件,

[global]
interval='10s'
[outputs.influxdb]
host=['http://localhost:8086']
#[outputs.elasticsearch]
#  host=['http://localhost:9200']
[inputs.netstat] 
interface='eth0'

现在,我想编辑 3 个块,globaloutputs.influxdbinputs.netstat。我不想编辑outputs.elasticsearch但也希望块outputs.elasticsearch应该保留在文件中。

使用 Ansible 时,我首先使用了模板模块,但如果我使用它,那么注释的数据就会丢失。

然后我使用了ini_file模块,而不是编辑已经存在的块,即使它已经存在,它也会添加一个新块,并产生这样的结果,

[outputs.influxdb]
host=[http://localhost:8086]
[outputs.influxdb]
host=[http://xx.xx.xx.xx:8086]

哪个模块最适合我的方案?

有几个选项,具体取决于您的目的.
lineinfile - module 是最好的选择,如果您只想添加、替换或删除行.
如果要添加、替换或删除几行,替换 - 模块是最好的。
blockinfile - 模块可以添加几行,用标记包围。

如果只想更改两行或三行,则可以使用任意数量的 lineinfile 调用。要更改整个配置文件,我建议像评论者建议的那样,使用模板 - 模块。

好的,如果你真的想避免使用模板,你可以尝试使用替换和正则表达式,如下所示:

- hosts: local
tasks:
- replace:
path: testfile
regexp: '^[{{ item.category }}]s(.*)host(.*)$'
replace: '[{{ item.category }}]n  host=[{{ item.host }}]'
with_items:
- { category: 'outputs.influxdb', host: 'http://cake.com:8080' }

以当前的形式,这不一定会处理每个类别下的多个选项,但可以修改正则表达式以处理多行。

根据需要,它不会触及 # 注释行。但是,如果您决定启用一些以前不活动的部分,则最终可能会得到一个稍微混乱的配置文件,其中包含注释和未注释的说明(不应影响功能,仅影响"外观")。您还需要考虑类似于以下示例的选项(交错的注释/未注释值),并专门为这些用例创建正则表达式:

[section]
option1=['value']
# option2=['value']
option3=['value']

这在很大程度上取决于您的用例,但我的建议仍然是使用模板,因为它们是一种更强大的方法,出错的可能性更小。

最新更新