《吃透Ansible:核心源码剖析与项目实战》从Ansible的模块运行及Playbook的解析与执行两个方面全面、深入地剖析三个版本的Ansible源码,此外还会优化和改造用于部署Ceph集群的ceph-ansible项目。
《吃透Ansible:核心源码剖析与项目实战》共6章:第1章介绍Ansible 1.1的源码,重点剖析Ansible 1.1的底层通信机制和模块运行原理;第2章在第1章的基础上对Ansible 1.9.6的源码进行解析,重点比较Ansible 1.9.6与Ansible 1.1的源码有何不同,以及Ansible 1.9.6中Playbook的运行过程;第3章介绍Ansible 2.8中的部分核心模块及Playbook的常用语法;第4章介绍Ansible 2.8中的核心源码并完整跟踪模块运行的全过程;第5章以小版本的源码对比及GitHub上相关源码的Bug溯源两种方式探讨深入学习Ansible源码的方式;第6章介绍基于Ansible的Playbook项目ceph-ansible,并依据实际工作需求对其进行改造和深度优化,帮助读者理解Playbook项目的编写方法。
《吃透Ansible:核心源码剖析与项目实战》适合Python初中级程序员阅读,尤其适合Python运维开发工程师和Ansible爱好者阅读。对于Python程序员而言,本书能带领他们一窥Python项目的内部原理,并通过阅读开源项目的源码提高编程水平。
前华为核心系统部负责人吴文峰等3位大咖力荐;
中国电信天翼云高级运维开发工程师全方位、多角度剖析Ansible的核心源码;
详细介绍Ansible的常用模块和Playbook的底层执行逻辑;
讲解由浅入深,对Ansible的多个版本的源码进行详细解读;
通过大量的源码测试案例,帮助读者深入理解Ansible的源码细节;
深入剖析Ansible的模块运行原理和Playbook工程项目的运行逻辑;
带领读者系统地掌握剖析Python项目源码的方法。
Python是目前自动化运维领域应用多的语言之一,而基于Python开发的Ansible则是自动化运维管理的工具。对Python程序员来说,学习Ansible源码一方面能从中学到不少Python的高级用法,另一方面也能熟练掌握这款流行工具并可以随时对其进行深度改造和定制,这对他的个人成长至关重要。此外,Ansible源码中的很多函数与类均可以在简单改造后成为运维人员的常用脚本。
初识Ansible 2.8的源码时,笔者感受到了它的复杂与宏大。单纯地分析整个Ansible的源码及其所有细节并让Python初学者接受是一件非常困难的事情,笔者一开始也不打算这么做,直到有一天,笔者在Ansible的官方代码库中看到了早发布的Ansible 1.1,随后几天迅速阅读和调试完该版本的源码,终发现早期的Ansible 1.1与当前的Ansible 2.8有着共同的核心理念,即相同的模块运行机制及剧本集概念。Ansible 1.1只用非常少的代码就实现了一个在当时看来十分不错的运维工具,其核心设计思想一直延续至今,从未改变。笔者意识到,对于想要深入学习Ansible源码的运维人员而言,Ansible 1.1的源码是一份绝佳的入门材料。由浅入深是笔者喜欢用的研究源码的方式,这样的理念也促成了《吃透Ansible:核心源码剖析与项目实战》的形成。此外,为了帮助读者理解基于Ansible的Playbook项目,笔者精选了自动部署工具ceph-ansible作为实战对象,它也是笔者完成各种Playbook项目的参考。
《吃透Ansible:核心源码剖析与项目实战》融合了笔者在Ansible源码方面积累的一些学习心得,从小版本的Ansible源码,到当前流行的Ansible 2.8源码,乃至从模块运行原理,到Playbook的解析与执行,其间都有笔者总结的一些经验。
《吃透Ansible:核心源码剖析与项目实战》特色
本书的主要特色有:
按照由浅入深的方式剖析三个经典版本的Ansible源码,每个版本的源码剖析重点各不相同。
对Ansible 1和Ansible 2中的核心源码做了大量的测试与实践,从而辅助读者更好地理解相关知识。
通过完整对比小版本的Ansible源码及对GitHub上相关源码的Bug进行溯源两种方式,帮助读者深入学习相关知识,从而吃透Ansible。
完整剖析ceph-ansible项目并深入实践与改造,帮助读者更好地理解基于Ansible开发的Playbook项目。
《吃透Ansible:核心源码剖析与项目实战》内容
本书主要介绍Ansible的核心源码与Playbook项目实战,共分为6章。
第1章剖析Ansible 1.1的源码,重点分析Ansible 1.1的底层通信机制及其模块运行原理。
第2章剖析Ansible 1.9.6的源码,并对比它与Ansible 1.1源码的不同之处,另外还会重点分析Playbook的执行逻辑。
第3章介绍Ansible 2.8中部分核心模块的使用并剖析其源码,同时还会介绍Playbook的常用语法。
第4章剖析Ansible 2.8的核心源码。首先进行基础功能模块的源码分析,如常量值定义、inventory文件解析和模板渲染等,接着对Ansible 2.8中模块运行的全流程及剧本集的运行源码进行跟踪和分析。
第5章深入学习Ansible源码,主要通过小版本的源码对比和GitHub上相关源码的Bug溯源两种方式,帮助读者熟悉深入学习Ansible源码的方式。
第6章主要介绍基于Ansible的经典项目ceph-ansible,并对该项目进行改造和优化。
读者对象
开源项目的源码本身既复杂又难懂,想要掌握本书的内容,领会笔者的分析思路,读者需要具备一定的Python基础,同时要有坚持学习的信念。本书不是帮助Python初学者入门,而是深度剖析Python开源项目的源码,主要适合以下读者阅读:
拥有一定Python基础的运维人员;
熟练使用Ansible并想深入理解其核心源码的后端开发人员;
渴望进入开源世界,探索一个开源项目全貌的初、中级程序员;
高等院校的老师和学生;
相关培训机构的学员。
版本说明
在本书中,Ansible 1、Ansible 2和Ansible 2.8代表的是Ansible的几个大版本,但并非具体的发行版本,而Ansible 1.1、Ansible 1.9.6和Ansible 2.8.16分别是各大版本下的具体发行版本,笔者主要基于这三个发行版本剖析Ansible的源码,当然也会提及其他发行版本。
Ansible源码获取方式
《吃透Ansible:核心源码剖析与项目实战》涉及的所有源码均已开源,读者可以通过https://releases.ansible.com/ansible网站进行下载。也可以在华章公司的网站(www.hzbook.com)上搜索到本书,然后单击资料下载按钮,即可在本书页面上找到下载链接。
售后支持
Ansible从版本2开始已经变得庞大且臃肿,相关的小版本迭代也在飞速进行。尽管本书剖析的Ansible源码不是的2.10或者更高的版本,但其核心思想一直未曾改变,这是读者在学习Ansible源码时要重点把握的。笔者完成本书的主要资料正是Ansible各个版本的源码,许多关于Ansible的术语,如动作插件、通信插件等,都是直接翻译英文注释而来的,可能会有不当之处,加之笔者水平和精力所限,书中可能还存在一些疏漏与错误,敬请各位读者不吝指正。
致谢
首先感谢我的家人!没有父母和姐姐给我的鼓励与支持,就没有我的今天,我也不会有机会进入计算机行业,更不会有机会完成本书。
感谢我的女朋友黄宝宝!她花费了很多时间和精力帮我整理书稿,并改正书稿中的不当语句和错别字。
感谢天翼云科技有限公司的领导黄润怀副总经理和我的直接领导林洁琬组长!他们给我们组创造了一个难得的机会,让我们能全身心投入分布式存储领域的研发中。正是这次机会,让我接触了Ansible及部署分布式存储集群的开源工具ceph-deploy和ceph-ansible,从此踏上了Python工具的源码分析之旅。
感谢媒体存储小分队的黄鹄、陈涛、毛廷鸿、谭伟杰、吴文峰和杨佑!他们拥有的丰富的互联网产品研发经验给了我很多帮助,让本书的写作比预期顺利很多。
感谢本书的编辑欧振旭!他给了我出版本书的机会与动力,让我得以完成这本心中想了无数遍的书。
还要感谢为本书的出版提供过帮助的其他编辑和朋友!没有他们的大力支持,本书也很难与读者见面。
后感谢本书读者!你们的肯定与支持会激励笔者继续前行。
……
沈聪 毕业于武汉大学,获硕士学位。目前就职于天翼云科技有限公司,任高级后端开发工程师。曾经从事Java开发,后来转岗为Python运维开发,在公司的媒体存储项目中参与存储集群建设、集群部署及统一运维管理平台的开发工作。喜爱钻研Python相关工具的源码,曾经研究过Django、Ansible、SaltStack和Scrapy等热门框架的源码并做了大量的笔记。在慕课网上发布过Nginx、Django和Scrapy的相关课程。
第1章 Ansible 1.1源码剖析 1
1.1 Ansible 1.1的环境搭建 1
1.1.1 Ansible 1.1测试环境搭建 1
1.1.2 Ansible 1.1调试环境搭建 5
1.2 Ansible 1.1的基本使用 9
1.2.1 Ansible 1.1模块说明 9
1.2.2 Ansible 1.1的常用模块 10
1.2.3 编写Ansible 1.1的Playbook 29
1.2.4 小结 31
1.3 Ansible 1.1源码概览 31
1.3.1 非源码文件与目录 31
1.3.2 源码文件 32
1.3.3 小结 45
1.4 Ansible 1.1底层通信代码解析 46
1.4.1 本地连接插件 46
1.4.2 基于paramiko模块连接插件 53
1.4.3 基于SSH命令连接插件 61
1.4.4 小结 68
1.5 ping模块的执行流程 68
1.5.1 ansible命令 68
1.5.2 runner目录下的核心源码 71
1.5.3 ping模块的运行流程 84
1.6 copy模块的执行流程 94
1.6.1 copy模块的动作插件 94
1.6.2 copy模块遗留问题的解决 96
1.6.3 Ansible模块的核心步骤小结 99
1.7 本章小结 100
第2章 Ansible 1.9.6源码剖析 101
2.1 Ansible 1.1和Ansible 1.9.6源码对比 101
2.2 快速上手Ansible 1.9.6 102
2.2.1 搭建Ansible 1.9.6测试环境 102
2.2.2 Ansible 1.9.6中的部分模块剖析 103
2.2.3 Ansible 1.9.6中Playbook的常用语法 125
2.3 再探Ansible 1.9.6源码 134
2.3.1 cache模块 134
2.3.2 shell_plugins插件 138
2.3.3 filter_plugins插件 142
2.3.4 lookup_plugins插件 145
2.3.5 辅助模块代码 148
2.4 追踪Ansible 1.9.6的模块运行机制 155
2.4.1 inventory目录 155
2.4.2 Runner类及其方法 157
2.5 解析Playbook的运行逻辑 171
2.5.1 准备测试的Playbook项目 171
2.5.2 相关类基础 174
2.5.3 追踪ansible-playbook命令的运行流程 187
2.6 本章小结 200
第3章 Ansible 2常用模块与Playbook语法 201
3.1 快速上手Ansible 2 201
3.2 Ansible 2的命令行使用 203
3.2.1 Ansible 2支持的常见选项 203
3.2.2 Ansible 2中的常用模块及其源码解析 215
3.2.3 Ansible 2模块的学习建议 241
3.3 Ansible 2中的Playbook语法 243
3.3.1 变量 243
3.3.2 条件判断 248
3.3.3 循环语句 251
3.3.4 等待语句 256
3.4 本章小结 260
第4章 Ansible 2核心源码剖析 261
4.1 Ansible 2.8核心源码初探 261
4.1.1 日志打印 261
4.1.2 默认配置 262
4.1.3 inventory文件解析 270
4.1.4 模板渲染 289
4.1.5 插件 303
4.2 Ansible 2.8模块运行的核心流程分析 305
4.2.1 命令入口 306
4.2.2 核心运行模块 308
4.2.3 流程总结 354
4.3 Ansible 2.8中Playbook的执行流程追踪 355
4.3.1 Playbook命令执行入口 355
4.3.2 核心代码追踪 356
4.3.3 Playbook中部分语法的源码解析 363
4.4 本章小结 371
第5章 Ansible源码的演进跟踪 372
5.1 Ansible 1.1到Ansible 1.2的演进之路 372
5.2 Ansible 2.8中的部分Bug溯源 391
5.2.1 Ansible 2.8中的ChangeLog 391
5.2.2 Ansible 2.8中的Bug复现及其修复过程 394
5.3 如何更深入地学习Ansible源码 416
第6章 Playbook项目实战 417
6.1 ceph-ansible项目介绍 417
6.2 ceph-ansible实战 418
6.2.1 使用ceph-ansible部署Ceph集群 418
6.2.2 ceph-ansible的其他功能 425
6.3 一个真实场景的改造 429
6.3.1 业务需求 429
6.3.2 手工实现 430
6.3.3 改造ceph-ansible 433
6.4 ceph-ansible项目源码探索 446
6.4.1 追踪ceph-mon服务的搭建过程 446
6.4.2 在CentOS 7下部署Ceph集群的简化版Playbook 469
6.4.3 小结 479