
여러 백엔드가 있는 nginx 업스트림이 있습니다. pre_tasks
배포 중에 업스트림 구성에서 백엔드를 비활성화하기 위해 플레이북에서 사용합니다 .
- 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']}}"
...
작동하지만 항상 올바른 것은 아닙니다. 때로는 4개의 호스트(직렬: 4)를 모두 비활성화하지 않는 경우도 있습니다. 동시에 4개의 라인을 교체하려고 하기 때문에 발생하는 것 같습니다.
각 반복을 하나씩 수행하고 유지할 수 있습니까 serial: 4
?
업데이트:
죄송합니다. 마지막 테스트는 에서 했어요replace
정규 표현식이 추가되었습니다 ^
(@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']}}"
재고 있음
[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
...
실행 전 업스트림 conf:
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;
...
}
실행 후 업스트림 conf:
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 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;
...
}
플레이북을 여러 번 실행하면 업스트림에서 필요한 호스트 4개가 비활성화됩니다.
답변1
작업할 수 있는 작업은 거의 없지만 일반적으로 패턴을 해당 패턴의 상위 집합인 것으로 바꾸는 것은 그리 좋은 방법이 아닙니다. 왜? 연속 실행에서는 원래 패턴을 포함하므로 계속해서 일치하기 때문입니다. 그래서 , 다음 , , 등등이 server {{ LAN }}
됩니다 . 이전 패턴을 나타내려면 또는 다른 패턴을 사용하세요 . 예를 들어, 다음과 같은 것을 사용한다면#server {{ LAN }}
##server {{ LAN }}
###server {{ LAN }}
^
regexp: '^server {{ LAN }}:'
줄이 로 시작하는 경우에만 일치합니다 server
. 즉, 선행하는 줄이 없으므로 연속 실행 시 줄 앞에 #
더 이상 문자를 넣지 않습니다 .#
답변2
해결책은조절판
- 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']}}"