转载自:http://blog.csdn.net/lilyjoke/article/details/51814513
Ansible
ansible基于Python研发,其本身没有批量部署的能力,真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:
1. 连接插件connection plugins:负责和被监控端实现通信;
2. hostinventory:指定操作的主机,是一个配置文件里面定义监控的主机;
3. 各种模块核心模块、command模块、自定义模块;
4. 借助于插件完成记录日志邮件等功能;
5. playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。
特性
1. 不需要在被管控主机上安装任何客户端,同时无服务器端,使用时直接运行命令即可,但是操作命令的服务器python版本要大于2.6;
2. 基于模块工作,可使用任意语言开发模块;
3. 使用yaml语言定制剧本playbook;
4. 基于SSH工作;
5. 可实现多级指挥;
SaltStack
简介
SaltStack是一个服务器基础架构集中化管理平台,具备配置管理、远程执行、监控等功能。SaltStack基于Python语言实现,结合轻量级消息队列(ZeroMQ)与Python第三方模块(Pyzmq、PyCrypto、Pyjinjia2、python-msgpack和PyYAML等)构建。通过部署SaltStack环境,可以在实现:在成千上万台服务器上做到批量执行命令;根据不同业务特性进行配置集中化管理、分发文件、采集服务器数据、操作系统基础及软件包管理等。
特性
1. 部署简单、方便, 支持大部分UNIX/Linux及Windows环境 , python版本需要大于2.63;
2. 主从集中化管理、配置简单、功能强大、扩展性强;
3. 主控端(master)和被控端(minion)基于证书认证,安全可靠,其中被控端可以通过Salt-ssh部署,比较方便;
4. 支持API及自定义模块,可通过Python轻松扩展。
5. Saltstack使用消息队列zeroMQ传输数据,速度较快:
Puppet
简介
puppet是一种linux、Unix平台的集中配置管理系统,基于C / S架构,使用ruby语言,可管理配置文件、用户、cron任务、软件包、系统服务等。puppet把这些系统实体称之为资源,puppet的设计目标是简化对这些资源的管理以及妥善处理资源间的依赖关系。
特性
Puppet是一个C/S架构的配置管理工具,在中央服务器上安装puppet-server软件包(Puppet master)。在需要管理的目标主机上安装puppet客户端软件(Puppet Client)。当客户端连接上Puppet master后,定义在Puppet master上的配置文件会被编译,然后在客户端上运行。每个客户端默认每半个小时和服务器进行一次通信,确认配置信息的更新情况。如果有新的配置信息或者配置信息已经改变,配置将会被重新编译并发布到各客户端执行。也可以在服务器上主动触发一个配置信息的更新,强制各客户端进行配置。如果客户端的配置信息被改变了,它可以从服务器获得原始配置进行校正。
比较结果
下表是三个自动化运维工具的比较要点:
自动化运维工具 |
Ansible |
SaltStack |
Puppet
|
语言 |
Python |
Python |
Ruby,语法较为复杂 |
所需功能是否满足 |
满足 |
满足 |
满足,但是批量执行命令这个功能,需要写个配置文件用于操作,略复杂 |
传输数据协议 |
基于SSH协议传输数据 |
基于消息队列zeroMQ传输数据 |
基于SSL(https)协议传输数据 |
是否需要在服务器安装客户端 |
不需要 但是需要服务器 python版本满足2.6+ |
需要 可以用Salt-ssh直接部署 |
需要 |
文档是否全面 |
是 |
相对于Ansible来说比较少 |
是 |
存在的问题 |
ssh存在误操作,有可能产生ssh登录被误操作锁住的问题。 |
在第一个sub阶段,客户端未能及时返回或未响应的话,playbook执行阶段可能会直接漏掉这部分机器而没有任何提示 |
当需要批量执行命令时,需要写个配置文件,操作比较复杂 |
结论
根据上文的选型要素,比较了上述三种框架:
1. 语言的选择,python源码相对于ruby,语法简单,便于二次开发,因此排除puppet.
2. 使用便利程度的选择,ansible在使用中不需要安装客户端,去中心化的思路显得更为灵活,便利。
3. 速度的选择,基于消息队列zeroMQ传输数据的saltstack无疑在共享数据,发送命令是速度更快,但是我们考虑更多的是操作的稳定性和便利性。
综上所述,将会选择ansible,用于运维框架的开发。