线上部分服务的机器数量有限,不能同时变更,否则会造成服务中断。
ansible 中默认的并发数为 5 ,若机器数量小于 5 台的服务在升级期间,服务状态会异常,进而造成业务使用异常。
为此,有以下需求:
- 变更涉及的设备,并发数设为 1
- 其他设备,并发数仍设为 5
而 ansible 是按照以下顺序读取配置文件的,使用第一个寻找到的配置文件的配置,其他的则忽略
- ANSIBLE_CONFIG (设置好的环境变量)
- ansible.cfg (位于当前目录)
- ~/.ansible.cfg (位于用户家目录)
- /etc/ansible/ansible.cfg
因此,可以指定不同的配置文件,并设置不同的并发数来解决。
更改默认并发数
控制并发数的参数为 forks
, 该选项设置与主机通信时的默认并行进程数,位于 defaults
配置区块。因此,只需修改该值即可。
在变更设备的 inventory 所在目录,新建 ansible.cfg ,贴入以下内容:
[defaults]
forks = 1
如果想保留原有的其他配置,可复制一份 ansible.cfg ,之后修改 forks
为 5 即可。
cat /etc/ansible/ansible.cfg |grep -Ev '^#' |sed '/^\s*$/d' |sed -r '/forks/s/(.*)=(.*)/\1= 1/g' > /path/to/yout/inventory_dir/ansible.cfg
修改前后执行时间对比
选取十台设备,运行 for i in $(seq 1 1 2);do echo ${i};sleep 1;done
命令测试所用时间。
测试命令: time ansible -i upgrade_hosts all -m shell -a " for i in \$(seq 1 1 2);do echo \${i};sleep 1;done "
$ 需要转义
- 修改前(并发数为5)
real 0m6.548s
user 0m1.584s
sys 0m0.432s
- 修改后(并发数为1)
real 0m23.008s
user 0m1.528s
sys 0m0.892s
理论所需时长(s) | 串行时所用时长(s) | 并发数为 5 时所用时长(s) |
---|---|---|
20 | 23.008 | 6.548 |
串行执行时所用时长是并发执行时的4倍。