文章目录
  1. 1. 增加并行进程数
  2. 2. 异步
  3. 3. Pull模式
  4. 4. 多级调度
  5. 5. 其他参考资料

Ansible是一个配置管理工具,可以用脚本批量操作多台机器。它的特点是非常简洁,基于SSH,不需要安装代理。但它的缺点也很明显:效率较低,容易挂起,不那么适合大规模环境(如500台以上)。本文介绍了使用ansible管理大规模集群的几种方法。

增加并行进程数

Ansible提供一个forks的属性,可以设置运行并行进程数。这个值默认比较保守,只有5个并行进程。我们可以根据自己的机器性能以及网络情况来设定,很多人使用50,也有用500以上的。如果有很多机器要管理的话,可以尝试先增加这个值,看看效果。有三个地方可以设置forks的数量:

  • 环境变量:export ANSIBLE_FORKS=100
  • ansible.cfg这个配置文件里设置:forks=100
  • 运行ansible命令时增加参数:-f 100

当机器数量比较大的时候,难免会有几台机器不能正常执行。这时候ansible会有提示to retry, use: --limit @/xxx/xxx.retry,把它增加到上个命令的后面就好了。

异步

有时候执行某个任务可能需要很长的时间,在集群规模较大的情况下慢得让人无法忍受。这时可以考虑使用异步模式。在tasks里增加async的属性,设成某个数字,比如60,意思就是这个任务最大运行时间不能超过60秒。也可以设成0,意思是不管任务运行多久,一直等待即可。如果没有指定async,则默认为同步模式。还可以设定poll,默认值为10,意思就是每隔10秒轮询查看结果。如果不需要查看结果,设为0就好了。还可以通过registerasync_status设定暂时不查看结果,等需要的时候再查看。具体做法可以参考上面的异步模式官网文档,也可以看翻译的中文文档

Pull模式

有些配置管理工具比如ChefPuppet,是基于拉模式的。所谓拉模式,是酱紫的:

  • 管理员写脚本
  • 管理员上传脚本
  • agent定时取脚本(例如每隔1分钟)
  • agent运行新脚本

Ansible是没有agent的,它默认基于推模式,也就是说:

  • 管理员写脚本
  • 管理员运行脚本
  • ansible连接各主机运行脚本

一般来说,拉模式能轻松应付大规模集群,因为每台机器都是自己去拉取脚本来完成任务。不过也有人用ansible的推模式管理着上千台机器。Ansible提供了ansible-pull的工具,能把它变成拉模式。官方资料不多,这篇文章写得比较详细。大致思路是新建一个git的仓库,每台机器运行一个cron定时任务(扮演者agent的角色)每隔一段时间去仓库取最新脚本,然后运行之。在ansible 2.0ansible-pull也有若干改进。

多级调度

还有一种想法是:如果一台主机的性能只能撑100forks,那么10台主机应该就能撑1000台机器。将这1000台机器分区,比如A区到J区。所以由一台主机分发命令给10台主机,让它们各自运行ansible-playbook,而每台主机根据不同的inventory或者是不同的limit方式来控制不同区的机器并返回结果。理论上这样的多级调度是能够撑起大规模集群的,就是脚本写起来比较麻烦,需要考虑一级主机和二级主机。

其他参考资料

说到底,如果运行得快,那么集群规模大一点也可以。这篇文章介绍了一些ansible性能调优的方法。
Mackerel是一个监控平台。这篇日文文章介绍了使用Ansible和Mackerel API管理1000台规模集群的方法。Ansible tower也提供了类似的可视化管理页面,官方出品,是不是更靠谱呢。

文章目录
  1. 1. 增加并行进程数
  2. 2. 异步
  3. 3. Pull模式
  4. 4. 多级调度
  5. 5. 其他参考资料