Lineinfile ersetzt manchmal keine Zeilen

Lineinfile ersetzt manchmal keine Zeilen

Ich habe Nginx Upstream mit mehreren Backends. Ich verwende pre_tasksein Playbook zum Deaktivieren von Backends in der Upstream-Konfiguration während der Bereitstellung:

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

Es funktioniert, aber nicht immer richtig. Manchmal deaktiviert es nicht alle 4 Hosts (Seriennummer: 4). Ich denke, das passiert, weil es versucht, 4 Zeilen gleichzeitig zu ersetzen.

Ist es möglich, jede Iteration einzeln durchzuführen und beizubehalten serial: 4?

Aktualisieren:

Entschuldigung, mein letzter Test war mitreplace

Zum regulären Ausdruck hinzugefügt ^(danke @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']}}"

Im Bestand

[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-Konfiguration vor dem Ausführen:

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-Konfiguration nach dem Ausführen:

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

}

Erwartetes Ergebnis:

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

}

Wenn ich das Playbook mehrmals ausführe, werden 4 benötigte Hosts im Upstream deaktiviert.

Antwort1

Sie geben uns sehr wenig zum Arbeiten, aber im Allgemeinen ist es keine sehr gute Praxis, ein Muster durch etwas zu ersetzen, das eine Obermenge eines solchen Musters ist. Warum? Weil es bei aufeinanderfolgenden Durchläufen immer wieder übereinstimmt, da es das ursprüngliche Muster enthält. Also server {{ LAN }}wird aus #server {{ LAN }}, dann ##server {{ LAN }}, dann ###server {{ LAN }}und so weiter. Verwenden Sie ^oder ein anderes Muster, um das vorhergehende Muster anzugeben. Wenn Sie beispielsweise etwas wie verwenden

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

Es wird nur eine Übereinstimmung gefunden, wenn die Zeile mit beginnt server, d. h., ihr geht keins #voraus. Daher werden bei aufeinanderfolgenden Durchläufen keine weiteren #Zeichen davor eingefügt.

Antwort2

Die Lösung besteht in der Verwendung einesGaspedal

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

verwandte Informationen