Ansible lineinfile模块批量禁用Nginx上游后端服务器时替换不生效的问题求助
Ansible lineinfile模块批量禁用Nginx上游后端服务器时替换不生效的问题求助
大家好,我现在遇到一个Ansible部署时的棘手问题,想请教下各位大佬。
我用Ansible部署应用时设置了serial: 4,每次同时处理4台应用服务器。部署前的预任务是要把这4台服务器在Nginx的upstream配置里禁用掉(给对应行加注释),但现在执行下来只有一台被成功禁用,完全达不到预期效果。
先给大家看下我的相关配置:
Inventory 配置
[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 ...
Playbook 代码
- 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 Upstream 配置变化
执行前的上游配置:
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; ... }
执行后的实际结果(仅1台被注释):
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台目标应用服务器:
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; ... }
我自己猜测是因为serial:4让4台应用服务器同时执行这个预任务,每个任务都会去Nginx服务器上修改同一个upstream文件,多个进程同时读写文件导致了冲突,最后只有一个修改能成功生效。
想请教下,有没有办法既能保持serial:4的设置,又能让这4个禁用操作依次在Nginx服务器上执行,而不是并发?这样每个注释操作都能正确生效。
备注:内容来源于stack exchange,提问作者artful
相关产品推荐
相关产品推荐

