我有带有多个后端的 nginx 上游。我pre_tasks
在部署期间在 playbook 中使用它来禁用上游配置中的后端:
- 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']}}"