用于编辑文件的模块 - Ansible

时间:2017-07-05 09:30:52

标签: 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]

哪个模块适用于我的场景?

2 个答案:

答案 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']

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