Lineinfile 有时不会替换行

Lineinfile 有时不会替换行

我有带有多个后端的 nginx 上游。我pre_tasks在部署期间在 playbook 中使用它来禁用上游配置中的后端:

- name: Deploy
  hosts: '{{ list_hosts }}'
  serial: 4

  pre_tasks:

  - name: Disable hosts in nginx upstream
    replace:
      path: /etc/nginx/conf.d/upstream.conf
      regexp: '^        server {{ LAN }}:'
      line: '        #server {{ LAN }}:5001;'
    delegate_to: "{{ item }}"
    with_items: "{{groups['nginx_api']}}"
...

它可以工作,但并不总是正确的。有时它不会禁用所有 4 个主机(序列号:4)。我认为发生这种情况是因为它试图同时替换 4 条线路。

是否可以逐一进行每次迭代并保持serial: 4

更新:

抱歉,我上次测试的是replace

添加到正则表达式^(感谢@bviktor)

- name: Deploy
  hosts: '{{ list_hosts }}'
  serial: 4

  pre_tasks:

  - name: Disable server in nginx upstream
    lineinfile:
      path: /etc/nginx/conf.d/upstream.conf
      regexp: '^        server {{ LAN }}:5001;'
      line: '        #server {{ LAN }}:5001;'
    delegate_to: "{{ item }}"
    with_items: "{{groups['nginx_api']}}"

有库存

[nginx_api]
api1 ansible_host=x.x.y.1   LAN=10.x.y.1
api2 ansible_host=x.x.y.2   LAN=10.x.y.2
api3 ansible_host=x.x.y.3   LAN=10.x.y.3
api4 ansible_host=x.x.y.4   LAN=10.x.y.4
[app]
app1 ansible_host=x.x.x.1   LAN=10.x.x.1
app2 ansible_host=x.x.x.2   LAN=10.x.x.2
app3 ansible_host=x.x.x.3   LAN=10.x.x.3
app4 ansible_host=x.x.x.4   LAN=10.x.x.4
app5 ansible_host=x.x.x.5   LAN=10.x.x.5
...

运行前的上游配置:

upstream app {
least_conn;
        server 10.x.x.1:5001;
        server 10.x.x.2:5001;
        server 10.x.x.3:5001;
        server 10.x.x.4:5001;
        server 10.x.x.5:5001;
    ...

}

运行后的上游配置:

upstream app {
least_conn;
        server 10.x.x.1:5001;
        #server 10.x.x.2:5001;
        server 10.x.x.3:5001;
        server 10.x.x.4:5001;
        server 10.x.x.5:5001;
    ...

}

预期结果:

upstream app {
least_conn;
        #server 10.x.x.1:5001;
        #server 10.x.x.2:5001;
        #server 10.x.x.3:5001;
        #server 10.x.x.4:5001;
        server 10.x.x.5:5001;
    ...

}

当我多次运行该剧本时,它会禁用上游所需的 4 个主机

答案1

您给我们提供的可用信息很少,但一般来说,用某个模式的超集替换该模式并不是一个好习惯。为什么?因为在连续运行中,它会反复匹配,因为它包含原始模式。因此server {{ LAN }}变成#server {{ LAN }},然后##server {{ LAN }},然后###server {{ LAN }},等等。使用^或其他模式来指示前面的模式。例如,如果您使用类似

regexp: '^server {{ LAN }}:'

它仅当行以 开头时才会匹配server,即,它前面没有任何字符,因此在连续运行时#它不会在它前面放置任何字符。#

答案2

解决方案是使用风门

- name: Deploy
  hosts: '{{ list_hosts }}'
  serial: 4

  pre_tasks:

  - name: Disable server in nginx upstream
    lineinfile:
      path: /etc/nginx/conf.d/upstream.conf
      regexp: '^        server {{ LAN }}:5001;'
      line: '        #server {{ LAN }}:5001;'
    delegate_to: "{{ item }}"
    throttle: 1
    with_items: "{{groups['nginx_api']}}"

相关内容