1

我正在尝试使用 ansible 来更新 telegraf.conf 的 [[inputs.ping]]。

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"

我试图在上面显示的第 2 行,"tac-temp10"之后添加,"tac-temp4"

- 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"
4

1 回答 1

0

警告:前面有丑陋的正则表达式。谨防下一个进行维护的人(包括经过一段时间后的您)的不可预测的理解。

如果服务器尚不存在(列表中的任何位置),则以下内容会将您的服务器添加到列表的末尾,并带有单个幂等任务。

    - 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,所以我可以很容易地回到原来的测试。随意丢弃它。

正如您所看到的(并且正如我的警告中所建议的),对于任何必须快速阅读代码的人来说,这几乎是不可能理解的。如果您必须做任何更花哨/更复杂的事情,请考虑使用模板并将您的服务器列表存储在某个变量中。

于 2019-06-14T13:41:39.310 回答