
我有 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
...
運作前的上游配置:
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;
...
}
預期結果:
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']}}"