Lineinfile a veces no reemplaza líneas

Lineinfile a veces no reemplaza líneas

Tengo nginx upstream con múltiples backends. Utilizo pre_tasksen el libro de jugadas para deshabilitar backends en la configuración ascendente durante la implementación:

- 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, pero no siempre es correcto. A veces no desactiva los 4 hosts (serie: 4). Creo que sucede porque intenta reemplazar 4 líneas al mismo tiempo.

¿Es posible hacer cada iteración una por una y conservarla serial: 4?

Actualizar:

Lo siento, mi última prueba fue conreplace

A la expresión regular agregada ^(gracias @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']}}"

En inventario

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

Configuración ascendente antes de ejecutar:

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

}

Configuración ascendente después de la ejecución:

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

}

Justo cuando ejecuto el libro de jugadas varias veces, se desactivan 4 hosts necesarios en sentido ascendente.

Respuesta1

Nos das muy poco con qué trabajar, pero en general, no es una muy buena práctica reemplazar un patrón con algo que sea un superconjunto de dicho patrón. ¿Por qué? Porque en ejecuciones consecutivas, coincidirá una y otra vez, ya que incluye el patrón original. Entonces server {{ LAN }}se convierte en #server {{ LAN }}, luego ##server {{ LAN }}, luego ###server {{ LAN }}, y así sucesivamente. Utilice ^o algún otro patrón para indicar el patrón anterior. Por ejemplo, si usas algo como

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

Sólo coincidirá si la línea comienza con server, es decir, no tiene ningún #carácter precedido y, por lo tanto, no pondrá más #caracteres delante de ella en ejecuciones consecutivas.

Respuesta2

La solución es utilizar unacelerador

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

información relacionada