这是一篇纯安利文章, 不会涉及任何的教程。关于教程, 官方已经有非常系统的文档了. 不过这里我推荐有条件的话可以看一下Ansible: Up and Running, 2nd Edition
这本书作为起步教程, 对于日常的使用,你可以只看第1-9章基础知识和最佳实践相关内容,如果希望开发相关插件或者希望跟虚拟化技术结合起来, 再看剩下的相关章节即可。
What:
首先简单一下Ansible是什么, 可以用来做什么:
- 配置管理工具, 他们的特点但是基于状态的操作,是幂等操作。举个例子,很多时候我们会需要保证某个配置始终是最新版本,当然我可以暴力覆盖的方式每次都重新拉取,但这样带了一个问题就是如果文件很大或者很多这种操作非常低效。如果用Ansible来做的话它会检查当前文件是否与目标文件相同, 如果相同, 那么直接跳过该文件。如果不是, 那么就拉取最新的版本。
- 部署工具,举个例子:我希望为我新申请的100台Linux目前安装了MySQL, 我肯定不想一台台的去操作。 其实这个操作用Ansible实现非常简单, 你只需要把希望操作的机器信息全部写到inventory文件里面(就是被管理的机器的hostname或者IP),然后再定义一下具体的task(task定义非常简单,如果是Redhat可以直接用yum模块来操作)
- 编排工具,比如你希望你的测试在数据库,web服务器起来之后再运行的, 这时你就可以预定义一个task去探测服务器和数据库的状态, 等一切ok以后再开始做测试工作。
- 使用Yaml格式定义具体的工作,支持基于Jinja2的template引擎。
Why:
市面上类似的Chef, Puppet等工具很多, 而Ansible的优势主要体现在如下方面:
简洁易读的语法, 使用yaml定义任务形成playbook; 一个playbook定义了需要配置的主机以及一系列顺序的任务.
被控主机几乎无需安装, 基于ssh和python2.5+版本, 大部分Linux系统已经默认安装.
基于推送的配置管理, 无需agent进程, 方便控制变更生效时机.
生态丰富, 我特地去官方的modules目录下面差了一下模块数量, 截止写作时已有3387个, 而且这个数字还在持续增长, 可见社区的活跃度非常高; 同时拓展模块也很容易.
使用Jinja2作为模板引擎, 提供灵活的模板化配置功能.
支持基于条件和状态的幂等操作, 不会执行无效操作.
天然支持规模化管理, 包括新增主机, 批量操作等;
更轻量级的抽象层, 方便用户快速上手;
How:
最后大致说明一下Ansible是如何完成这些工作的. 假定我们需要在主机A、 B、 C上执行任务1、2、3,那么大致的流程如下:
- 控制主机基于playbook中各模块生成对应的python脚本;
- 将脚本拷贝到主机A, B, C上;
- 主机A,B,C执行脚本依次完成任务1,2,3;
- 待所有主机完成所有任务(任务失败则也视为完成)后退出