Как вставить новую строку во входные данные telegraf.conf с помощью ansible regexp - PullRequest
1 голос
/ 14 июня 2019

Я пытаюсь использовать ansible для обновления [[input.ping]] telegraf.conf.

telegraf.conf выглядит следующим образом:

[[inputs.ping]]
  urls = ["tac-temp1","tac-temp2", "tac-temp3","tac-temp4"] #tac
  count = 30
  timeout = 15.0
  [inputs.ping.tags]
  name = "tac"

[[inputs.ping]]
  urls = ["prod-temp1","prod-temp2", "prod-temp3","prod-temp4"] #prod
  count = 30
  timeout = 15.0
  [inputs.ping.tags]
  name = "prod"

[[inputs.ping]]
  urls = ["test-temp1","test-temp2", "test-temp3","test-temp4"] #test
  count = 30
  timeout = 15.0
  [inputs.ping.tags]
  name = "test"

Я пытаюсь добавить ,"tac-temp10" после ,"tac-temp4" в строке 2, показанной выше.

- hosts: Servers
  become: yes
  become_method: sudo
  tasks:
    - name: Loading telegraf.conf content for search
      shell: cat /tmp/telegraf.conf
      register: tele_lookup

    - name: Adding Server to  /tmp/telegraf.conf if does not exists
      lineinfile:
             path: /tmp/telegraf.conf
             state: present
             regexp: '^((.*)"] #tac$)'       
             line: ',"tac-temp10"'      
             backup: yes
      when: tele_lookup.stdout.find('tac-temp10') != '0'

regexp: '^((.*)"] #tac$)' заменяет всю строку на ,"tac-temp10".Ожидаемый результат:

[[inputs.ping]]
  urls = ["tac-temp1","tac-temp2", "tac-temp3","tac-temp4","tac-temp10"] #tac
  count = 30
  timeout = 15.0
  [inputs.ping.tags]
  name = "tac"

1 Ответ

0 голосов
/ 14 июня 2019

Предупреждение : Ужасное регулярное выражение впереди. Остерегайтесь непредсказуемого понимания того, что следующие ребята (включая вас после того, как прошло время ...) делают обслуживание.

Следующее добавит ваш сервер в конец списка, если он еще не присутствует (где-либо в списке) с одной идемпотентной задачей.

    - name: add our server if needed
      lineinfile:
        path: /tmp/test.conf
        backup: yes
        state: present
        regexp: '^( *urls *= *\[)(("(?!tac-temp10)([a-zA-Z0-9_-]*)",? *)*)(\] #tac)$'
        backrefs: yes
        line: '\1\2, "tac-temp10"\5'

Вам нужно использовать обратные ссылки, чтобы вернуть в строку уже сопоставленные части выражения. Я использовал backup: yes, поэтому я мог легко вернуться к оригиналу для моих тестов. Не стесняйтесь бросить его.

Как вы можете видеть (и, как советовали в моем предупреждении), это почти невозможно понять для тех, кому нужно быстро прочитать код. Если вам нужно сделать что-то более сложное / сложное, рассмотрите возможность использования шаблона и сохранения списка серверов в переменной где-нибудь.

...