
Ich habe Nginx Upstream mit mehreren Backends. Ich verwende pre_tasks
ein 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']}}"