如何使用 ansible 正则表达式将新字符串插入 telegraf.conf 的 inputs.ping
How to Insert a new string into telegraf.conf's inputs.ping using ansible regexp
我正在尝试使用 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-temp4"
之后添加 ,"tac-temp10"
。
- 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"
警告:前面的正则表达式很丑。谨防下一个家伙(包括时间过去后的你......)在维护时的不可预知的理解。
如果您的服务器不存在(列表中的任何位置)并带有一个幂等任务,则以下内容会将您的服务器添加到列表的末尾。
- 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: ', "tac-temp10"'
您需要使用反向引用将表达式中已经匹配的部分放回行中。我使用了 backup: yes
这样我就可以很容易地回到原来的状态进行测试。随意放弃它。
如您所见(以及我的警告中所建议的),对于必须快速阅读代码的任何人来说,这几乎是不可能理解的。如果您还需要做任何事情 fancy/complicated,请考虑使用模板并将您的服务器列表存储在某处的变量中。
我正在尝试使用 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-temp4"
之后添加 ,"tac-temp10"
。
- 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"
警告:前面的正则表达式很丑。谨防下一个家伙(包括时间过去后的你......)在维护时的不可预知的理解。
如果您的服务器不存在(列表中的任何位置)并带有一个幂等任务,则以下内容会将您的服务器添加到列表的末尾。
- 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: ', "tac-temp10"'
您需要使用反向引用将表达式中已经匹配的部分放回行中。我使用了 backup: yes
这样我就可以很容易地回到原来的状态进行测试。随意放弃它。
如您所见(以及我的警告中所建议的),对于必须快速阅读代码的任何人来说,这几乎是不可能理解的。如果您还需要做任何事情 fancy/complicated,请考虑使用模板并将您的服务器列表存储在某处的变量中。