我想编辑telegraf(系统指标收集代理)的配置文件。
Telegraf附带一个可以编辑的默认配置文件。其中定义了许多输入和输出插件,这些插件已注释掉,可以通过删除注释添加,也可以自定义。
我只想编辑那里定义的一些插件,而不是全部。例如,考虑这是文件,
[global]
interval='10s'
[outputs.influxdb]
host=['http://localhost:8086']
#[outputs.elasticsearch]
# host=['http://localhost:9200']
[inputs.netstat]
interface='eth0'
现在,我想编辑3个区块,global
,outputs.influxdb
和inputs.netstat
。我不想编辑outputs.elasticsearch
,但也希望块outputs.elasticsearch
保留在文件中。
使用Ansible时,我首先使用了模板模块,但是如果我使用它,那么评论的数据就会丢失。
然后我使用了ini_file模块,而不是编辑已存在的块,它添加了一个新块,即使它已经存在,并产生类似的结果,
[outputs.influxdb]
host=[http://localhost:8086]
[outputs.influxdb]
host=[http://xx.xx.xx.xx:8086]
哪个模块适用于我的场景?
答案 0 :(得分:8)
根据您的目的,有几种选择
lineinfile - 模块是最佳选择,如果您只想添加,替换或删除一个行。
replace - 模块最好,如果你想添加,替换或删除几行
blockinfile - 模块可以添加多行,由标记包围。
如果您只想更改两行或三行,则可以使用lineinfile的多次调用。要更改整个配置文件,我建议,像评论者建议的那样,使用template - 模块。
答案 1 :(得分:0)
好的,如果你真的想避免使用模板,你可以尝试使用replace和这样的正则表达式:
- 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']
这在很大程度上取决于您的用例,但我的建议仍然是使用模板,因为它们是一种更强大的方法,更容易出错。