Я хочу отредактировать конфигурационный файл телеграфа (агента сбора системных метрик).

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 я сначала использовал модуль Template, но если я использую его, то прокомментированные данные будут потеряны.

Затем я использовал модуль ini_file, вместо того, чтобы редактировать уже существующий блок, он добавляет новый блок, даже если он уже присутствует, и приводит к примерно следующему:

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

Какой модуль идеально подходит для моего сценария?

4
Luv33preet 5 Июл 2017 в 12:30
4
Лучший способ сделать это - использовать модуль шаблона и просто включить закомментированные строки как таковые в шаблон, который вы используете.
 – 
rasebo
5 Июл 2017 в 12:45
Я тоже думал об этом! давай посмотрим, есть ли лучший способ
 – 
Luv33preet
5 Июл 2017 в 12:54
Как упоминал @rasebo, модуль Template - лучший способ работать с файлом конфигурации, который изменяется в соответствии с вашим env.
 – 
Manjit Kumar
5 Июл 2017 в 13:08

2 ответа

В зависимости от вашей цели есть несколько вариантов.
Модуль lineinfile - лучший вариант, если вы просто хотите добавить, заменить или удалить одна строка.
Модуль replace - лучший вариант, если вы хотите добавить, заменить или удалить несколько строк.
Модуль blockinfile - может добавлять несколько строк, окруженных маркерами.

Если вы хотите изменить только две или три строки, вы можете использовать столько вызовов lineinfile. Чтобы изменить весь файл конфигурации, я бы рекомендовал, как предлагают комментаторы, использовать шаблон - модуль.

10
ThoFin 5 Июл 2017 в 13:16

Хорошо, если вы действительно хотите избежать использования шаблонов, вы можете попробовать использовать замену и регулярное выражение, подобное этому:

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

Это сильно зависит от вашего варианта использования, но я по-прежнему рекомендую использовать вместо них шаблоны, поскольку они представляют собой более надежный подход с меньшими шансами на то, что что-то пойдет не так.

0
rasebo 5 Июл 2017 в 17:22