Lineinfile às vezes não substitui linhas

Lineinfile às vezes não substitui linhas

Eu tenho nginx upstream com vários back-ends. Eu uso pre_tasksno manual para desabilitar back-ends na configuração upstream durante a implantação:

- 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']}}"
...

Funciona, mas nem sempre correto. Às vezes não desativa todos os 4 hosts (serial: 4). Acho que isso acontece porque tenta substituir 4 linhas ao mesmo tempo.

É possível fazer cada iteração uma por uma e manter serial: 4?

Atualizar:

Desculpe, meu último teste foi comreplace

Para regexp adicionado ^(obrigado @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']}}"

Em inventário

[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
...

Configuração upstream antes da execução:

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;
    ...

}

Configuração upstream após execução:

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;
    ...

}

Resultado esperado:

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;
    ...

}

Apenas quando executo o manual várias vezes, ele desativa 4 hosts necessários no upstream

Responder1

Você nos dá muito pouco com o que trabalhar, mas, em geral, não é uma prática muito boa substituir um padrão por algo que seja um superconjunto desse padrão. Por que? Porque em execuções consecutivas, ele irá corresponder continuamente, uma vez que inclui o padrão original. Então server {{ LAN }}torna-se #server {{ LAN }}, então ##server {{ LAN }}, então ###server {{ LAN }}, e assim por diante. Use ^ou algum outro padrão para indicar o padrão anterior. Por exemplo, se você usar algo como

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

Ele só corresponderá se a linha começar com server, ou seja, não tiver nenhum #precedente e, portanto, não colocará mais #caracteres antes dela em execuções consecutivas.

Responder2

A solução é usar umacelerador

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

informação relacionada