Ansible是近年来急速发展的开源配置管理工具。在Ansible之前,行业中已经有很多开源配置管理工具了,特别是大名鼎鼎的Puppet,简直是配置管理工具中的超级巨星。然而,Ansible依靠它的简单易用、“零依赖”以及弱抽象获得了无数开发者和运维工程师的青睐。遗憾的是,除了官方文档外,Ansible相关的优秀文档凤毛麟角,而本书恰恰就是为了缓解这一问题而编写的。作者在本书中演示了如何使用Ansible管理接近真实生产环境的案例。既展现了Ansible的强大功能,又能够帮助读者快速入门与上手,本书非常适合作为官方文档的补充或者搭配阅读。特别值得一提的是,本书第2版还增加了管理Windows服务器和网络设备方面的章节,并重新编写了Docker相关章节,及时地对第1版中的不足进行了改进。
Lorin Hochstein 从小在魁北克蒙特利尔长大,除了偶尔会说“闭上灯”这种话之外,从他的口音中你绝对猜不出他是加拿大人。他正在回归学术界:他已经在内布拉斯加林肯大学作为终身教职计算机科学与应用的副教授任教2 年。此外,他还曾作为计算机科学家在南加州大学信息科学院工作4 年。他在麦吉尔大学取得了计算机工程学学士学位,在波士顿大学取得了电子工程学的硕士学位,并在马里兰大学帕克分校取得了计算机科学的博士学位。他现在在Netflix 的Chaos 工程团队任职高级软件工程师。RenéMoser 与妻子和三个孩子一起定居在瑞士。他获得了IT 专业的高等教育文凭。在IT 领域中,他喜欢以简单的方式实现需求并不断扩展。他沉浸于开源社区已超过15 年,他是Ansible 核心贡献者和40 多个Ansible 模块的作者,以及Apache CloudStack 项目管理委员会成员及Committer。他目前在SWISS TXT 任职系统工程师。
主译人员曾于新浪任职技术总监,负责私有云平台研发与运维并支撑新浪微博从零至上市高速发展的过程。后于华为任职技术专家,致力于提升华为公有云运维能力。2016年加入贝壳找房前身链家网,并一直致力于打造基于ansible的自动化平台。
序. .................................... xxiii
第 2版前言. .......................... xxv
第 1版前言. ........................ xxvii
第 1章 简介........................... 1
关于版本的说明 .................... 2
Ansible的优势 ...................... 2
Ansible如何运作 .................. 3
Ansible的精妙设计赏析 ....... 4
易读的语法.................... 4
远程主机无须安装依赖 . 5
基于推送模式 ................ 5
使用 Ansible管理小规模环境 ................................... 6
内置模块 ....................... 6
非常轻量的抽象层 ........ 7
Ansible太过于简单了吗 ....... 8
需要哪些基础知识 ................ 8
哪些内容不会涉及 ................ 9
安装 Ansible ....................... 10
建立一台用于测试的服务器 ........................................... 11
使用 Vagrant来创建测试服务器 ............................. 11
将测试服务器的信息配置在 Ansible中 .................. 14
使用 ansible.cfg文件来简化配置 ............................ 16
展望 .................................... 19
第 2章 playbook:一切的开始. 20
一些准备工作 ..................... 20
一个简单的 playbook .......... 21
定义 Nginx的配置文件 ........................................... 23
创建一个定制的首页 ... 24
创建一个 webservers群组 ....................................... 25
运行这个 playbook .............. 25
YAML格式的 playbook ...... 27
文件起始 ..................... 27
注释 ............................. 27
字符串 ......................... 27
布尔型 ......................... 28
列表 ............................. 28
字典 ............................. 28
分行 ............................. 29
剖析 playbook ..................... 30
play.............................. 31
task .............................. 32
模块 ............................. 33
将它们整合在一起 ...... 34
执行 Ansible后发生变化了吗?跟踪主机状态 .............. 35
来点更酷炫的:添加 TLS支持 ...................................... 35
生成 TLS证书 ............. 36
变量 ............................. 37
生成 Nginx配置模板 .. 39
handler ......................... 41
运行 playbook.............. 42
第 3章 使用 inventory描述你的服务器................................... 44
inventory文件..................... 44
准备工作:创建多台 Vagrant虚拟机 ............................. 45
inventory 行为参数 ............. 48
ansible_connection ...... 49
ansible_shell_type ....... 49
ansible_python_interpreter ....................................... 49
ansible_*_interpreter ... 49
改变行为参数的默认值 ........................................... 50
群组 .................................... 50
范例:部署一个 Django应用.................................. 51
别名和端口.................. 54
群组的群组.................. 54
为主机编号(宠物还是公牛 ) ................................. 55
在 inventory内部的主机和组变量 .................................. 55
在各自文件中的主机和组变量 ....................................... 57
动态 inventory..................... 59
动态 inventory脚本接口 ......................................... 60
编写动态 inventory脚本 ......................................... 61
预装 inventory脚本 ..... 65
将 inventory分割到多个文件 ......................................... 65
使用 add_host和 group_by在运行时添加条目 ............... 65
add_host ...................... 65
group_by ..................... 67
第 4章 变量与 fact................ 69
在 playbook中定义变量 ..... 69
检查变量的值 ..................... 70
registering 变量 ................... 70
fact ...................................... 74
查看与某台服务器关联的所有 fact ......................... 75
查看 fact子集 .............. 75
任何模块都可以返回 fact ........................................ 77
本地 fact ...................... 77
使用 set_fact定义新变量 .... 79
内置变量 ............................. 79
hostvars ....................... 80
inventory_hostname ..... 80
groups .......................... 81
在命令行设置变量 .............. 81
优先级 ................................. 82
第 5章 引入测试应用:Mezzanine. ....................................... 84
为什么向生产环境部署软件是一件复杂的事 ................. 84
PostgreSQL:数据库 ... 88
Gunicorn:应用服务器 ........................................... 88
Nginx:Web服务器 .... 89
Supervisor:进程管理器 ......................................... 90
第 6章 使用 Ansible部署 Mezzanine....................................91
列出 playbook中的 task...... 91
组织要部署的文件 .............. 92
变量和秘密变量 .................. 93
使用迭代(with_items)安装多个软件包 ...................... 95
向任务中添加 Become语句 96
更新 apt缓存 ...................... 97
使用 Git获取项目源码 ....... 98
将 Mezzanine和其他软件包安装到 virtualenv中 ......... 100
任务中的复杂参数:稍微跑个题 .................................. 103
配置数据库 ....................... 106
从模板生成 local_settings.py文件 ................................ 107
运行 django-manage命令 . 110
在应用环境中运行定制的 Python脚本 ..........................111
设置服务配置文件 .... 114
启用 Nginx配置文件 ........ 117
安装 TLS证书 .................. 117
安装 Twitter计划任务....... 119
playbook全文 ................... 119
在 Vagrant虚拟机上运行 playbook ............................... 123
故障排查 ........................... 124
无法拉取 Git仓库代码 .......................................... 124
192.168.33.10.xip.io地址不可达 ........................... 124
错误的请求(400) .... 125
将 Mezzanine部署到多台主机 ..................................... 125
第 7章 role:扩展你的 playbook........................................126
role的基本构成 ................ 126
范例: database和 mezzanine role ................................ 127
在你的 playbook中使用 role ........................................ 127
pre-tasks和 post-tasks ....... 129
用于部署数据库的 database role ................................... 130
用于部署 Mezzanine的 mezzanine role ........................ 132
使用 ansible-galaxy创建 role文件与目录 .................... 137
从属 role ........................... 138
Ansible Galaxy.................. 139
Web界面 ................... 139
命令行工具................ 139
将你自己的 role发布到 Galaxy............................. 140
第 8章 复杂的 playbook....... 141
处理不良行为的命令: changed_when和 failed_when . 141
过滤器 ............................... 145
默认过滤器................ 145
用于注册变量的过滤器 ......................................... 145
应用于文件路径的过滤器 ..................................... 146
编写你自己的过滤器 . 147
lookup ............................... 148
file ............................. 149
pipe............................ 150
env ............................. 150
password.................... 150
template ..................... 151
csvfile ........................ 151
dnstxt ......................... 152
redis_kv ..................... 153
etcd ............................ 154
编写你自己的 lookup插件 .................................... 155
更复杂的循环 ................... 155
with_lines .................. 156
with_fileglob ............. 156
with_dict .................... 157
将循环结构用作 lookup插件 ................................ 158
循环控制 ........................... 158
设置变量名称 ............ 158
为输出增加标签 ........ 160
include .............................. 161
动态引用 ................... 162
role include ................ 162
block ................................. 164
利用 block进行异常处理 .. 164
使用 Vault加密敏感数据 .. 168
第 9章 自定义host、run和 handler. ...................................170
通过模式匹配指定主机..... 170
限制运行的主机 ................ 171
在控制主机上运行 task ..... 171
在涉及的主机以外的机器上运行 task .......................... 172
逐台主机运行 ................... 173
一次运行一批主机 ............ 174
只执行一次 ....................... 175
运行策略 ........................... 175
linear策略 ................. 176
free策略 .................... 177
高级 handler...................... 179
Pre和 Post task中的 handler ................................. 179
flush handler .............. 180
handlers listen ............ 182
手动采集 fact .................... 188
从主机获取 IP地址 .......... 189
第 10章 回调插件. ................ 191
stdout插件 ........................ 191
actionable 插件 .......... 192
debug插件 ................ 192
dense插件 ................. 193
json插件 ................... 193
minimal插件 ............. 194
oneline插件 .............. 195
selective 插件 ............ 195
skippy插件................ 195
其他插件 ........................... 195
foreman插件 ............. 196
hipchat插件 .............. 196
jabber插件 ................ 197
junit插件 ................... 197
log_plays插件 ........... 198
logentries插件........... 198
logstash插件 ............. 198
mail插件 ................... 199
osx_say插件 ............. 199
profile_tasks插件 ...... 199
slack插件 .................. 200
timer插件 .................. 200
第 11章 让 Ansible快到飞起..201
SSH多路复用以及长连接保持 ..................................... 201
手动启动 SSH多路复用 ........................................ 202
Ansible中的 SSH多路复用配置........................... 203
流水线 ............................... 205
启用流水线................ 205
将主机配置为支持流水线 ..................................... 205
fact缓存............................ 207
JSON文件作为 fact缓存后端 ............................... 208
Redis作为 fact缓存后端 ...................................... 209
Memcached作为 fact缓存后端 ............................. 209
并行 .................................. 210
异步执行并发任务 ............ 211
第 12章 自定制模块..............213
范例:检测远程服务器是否可达 .................................. 213
使用 script模块而不是自己写模块 ............................... 213
实现 can_reach模块.......... 214
在哪里放置自定制模块..... 214
Ansible如何调用模块 ....... 215
用参数生成一个独立的 Python脚本(只限于 Python模块) ............................ 215
将模块复制到服务器 . 215
在服务器上创建一个参数文件(只限于非 Python模块) ................................. 215
调用模块 ................... 216
期望输出 ........................... 216
Ansible的输出变量 ... 217
用 Python实现模块 .......... 217
解析参数 ................... 219
获取参数的值 ............ 220
导入 AnsibleModule辅助类 .................................. 220
参数选项 ................... 221
AnsibleModule的初始化参数 ............................... 223
返回成功或失败 ........ 227
调用外部命令 ............ 227
检查模式 (演习模式 ) ........................................... 229
文档化你的模块 ................ 230
调试模块 ........................... 231
使用 Bash实现模块 .......... 233
指定 Bash的解释器路径... 234
示例模块 ........................... 235
第 13章 Vagrant................236
Vagrant的便捷配置选项 ... 236
端口转发和私有 IP地址 ....................................... 236
代理转发 ................... 238
Ansible置备器 .................. 238
置备器何时运行 ................ 239
由 Vagrant生成 inventory . 239
并行配置 ........................... 240
指定群组 ........................... 241
Ansible本地置备器 .......... 242
第 14章 Amazon.EC2. ........244
术语 .................................. 246
实例 ........................... 246
Amazon 系统镜像 ..... 246
标签 ........................... 247
指定认证凭据 ................... 247
环境变量 ................... 248
配置文件 ................... 248
必要条件: Boto Python 库 ........................................... 249
动态 inventory................... 249
inventory 缓存 ........... 251
其他配置项................ 252
自动生成群组 ............ 252
使用标签定义动态群组..... 253
把标签应用到现有资源 ......................................... 253
更好听的群组名 ........ 254
EC2 Virtual Private Cloud和 EC2 Classic ..................... 255
配置 ansible.cfg 支持使用 EC2 ..................................... 256
启动新的实例 ................... 256
EC2 密钥对 ....................... 258
创建新的密钥 ............ 258
上传已有密钥 ............ 260
安全组 ............................... 260
允许的 IP 地址 .......... 261
安全组端口................ 262
获取最新的 AMI ............... 262
向群组中添加一个新的实例 ......................................... 264
等待服务器启动 ................ 266
创建实例的幂等性方法..... 267
全部加在一起 ................... 267
指定 Virtual Private Cloud 270
动态 inventory和 VPC .......................................... 274
构建 AMI .......................... 274
使用 ec2_ami模块 .... 274
使用 Packer ............... 275
其他模块 ........................... 279
第 15章 Docker.................280
Docker与 Ansible配合案例 ......................................... 281
Docker应用的生命周期 .... 282
样例应用: Ghost .............. 283
连接到 Docker Daemon..... 283
在本地机器上运行容器..... 283
从 Dockerfile 构建镜像 ..... 284
在本机上对多个容器进行编排 ..................................... 286
推送镜像到 Docker registry .......................................... 287
查询本地镜像 ................... 289
部署 Docker化的应用 ...... 291
后端: Postgres .......... 291
前端 ........................... 292
前端: Ghost .............. 293
前端: Nginx ............. 293
清除容器 ................... 294
直连容器 ................... 294
Ansible Container .............. 296
Conductor .................. 296
创建 Docker镜像 ...... 297
本地运行 ................... 301
发布镜像到 registry ... 302
将容器部署到生产环境 ......................................... 303
第 16章 调试 Ansible.playbook. ........................................304
人类可读的错误信息 ........ 304
调试 SSH问题 .................. 305
debug模块 ........................ 307
playbook调试器 ............... 307
assert模块 ......................... 309
在执行前检查你的 playbook ......................................... 311
语法检查 ................... 311
列出 host ................... 311
列出 task .................... 312
检测模式 ................... 312
显示文件变化 ............ 313
限制指定的 task运行 ........ 313
step ............................ 313
start-at-task ................ 314
tags ............................ 314
第 17章 管理 Windows主机..316
连接到 Windows ............... 316
PowerShell ........................ 317
Windows 模块 ................... 320
第一个 playbook ............... 320
升级 Windows ................... 321
添加本地用户 ................... 323
结论 .................................. 326
第 18章 使用 Ansible管理网络设备......................................327
网络模块现状 ................... 327
所支持的网络供应商列表 . 328
网络设备的准备工作 ........ 328
支持 SSH身份验证 ... 329
模块如何工作 ................... 331
我们的第一个 playbook .... 332
网络模块中的 inventory和变量.................................... 333
本地连接 ................... 335
连接配置 ................... 335
身份验证变量 ............ 336
保存配置 ................... 336
使用文件中的配置 ............ 338
模板,模板,模板 ............ 341
收集 fact ............................ 344
结论 .................................. 345
第 19章 Ansible.Tower:Ansible企业版. ............................346
订阅模式 ........................... 347
试用 Ansible Tower ... 347
Ansible Tower能解决什么问题 .................................... 348
访问控制 ................... 348
项目管理 ................... 349
inventory管理 ........... 350
按作业模板运行作业 . 351
RESTful API ..................... 354
Ansible Tower的命令行 ... 354
安装 ........................... 355
创建用户 ................... 355
运行作业 ................... 357
以终为始 ........................... 358
附录A SSH.......................359
附录B 在 EC2认证中使用 IAM.role.....................................369
术语表................................373
参考文献..............................379