
Eu tenho nginx upstream com vários back-ends. Eu uso pre_tasks
no 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']}}"