运维圈有个老梗:装个监控agent,结果agent先挂了,监控了个寂寞。2012年Ansible出生时就赌了一手——零agent,纯SSH走天下。十三年过去,这手牌成了基础设施自动化的默认打法。现在它把API彻底免费开放,相当于把赌场筹码撒了一桌,谁都能上桌。

1. 一条pip命令,把服务器变成遥控玩具

1. 一条pip命令,把服务器变成遥控玩具

安装Ansible只需要一行:pip install ansible。没有守护进程,没有后台服务,你的笔记本电脑就是控制中心。这设计像极了老式电视机——遥控器不需要和电视"配对",红外信号过去,电视就得响应。

核心就两样东西:inventory(主机清单)和playbook(剧本)。inventory.ini里分组写IP,web组放两台机器,db组放一台,变量统一挂all:vars下面。playbook用YAML写,缩进就是语法,人类可读性直接拉满。

一个典型场景:给web组装Nginx。三行任务——装包、拷配置、启服务。配置改了?handler自动触发重启。整个流程像外卖下单:选地址、选菜品、确认送达,系统自己跑腿

执行也简单:ansible-playbook -i inventory.ini deploy.yaml。SSH密钥一配,几百台机器同时开工。早年在某电商公司见过更野的用法:双十一前夜,运维把笔记本往工位一插,去楼下抽了根烟,回来扩容完成了。

2. 幂等性:重复执行不会炸的魔法

2. 幂等性:重复执行不会炸的魔法

Ansible最被低估的特性是幂等(idempotent)。这个词听着玄乎,道理很糙:跑一百遍和跑一遍,结果一样。Nginx已安装?跳过。配置已是最新?不动。服务已在运行?不重启。

对比Puppet、Chef那代工具,它们早期版本跑两遍可能装出两个实例,或者把配置文件覆盖成乱码。Ansible从设计层面堵死了这条路——每个模块先查状态,再决定动不动作。这省了多少凌晨三点的故障电话,只有老运维懂。

YAML的代价是缩进地狱。少一个空格,报错信息能把你绕晕。但换个角度,它强迫你写得像清单一样整齐。代码审查时,一眼能看出任务顺序有没有毛病。某云厂商的SRE团队内部规定:playbook超过50行必须拆role,就是为了可读性。

3. Role和Galaxy:把重复劳动打包成乐高

3. Role和Galaxy:把重复劳动打包成乐高

项目大了,playbook会膨胀成面条代码。Ansible的解法是role——把任务、变量、模板、文件按目录结构封装。ansible-galaxy init roles/webserver一键生成骨架,main.yaml里写核心逻辑,defaults放默认配置,templates放Jinja2模板。

Galaxy是官方集市,三千多个role随便下。装MySQL?有人写好了。配防火墙?有人踩过坑了。这生态像极了早期npm,重复造轮子是技术人员的原罪,直接抄作业才是生产力

但Galaxy也有烂货。某次调研发现,排名靠前的Nginx role里,三分之一还在用废弃的yum模块。开源社区的信任成本在这儿:星星多不代表代码新,下载前得看一眼最后更新时间。企业级用法通常是fork到私有仓库,自己维护版本。

4. Vault:把密码塞进代码,但锁起来

4. Vault:把密码塞进代码,但锁起来

自动化绕不开secrets。数据库密码、API密钥、TLS证书,往哪放都是雷。Ansible Vault的做法是加密变量文件,运行时解密ansible-vault create secrets.yaml生成加密文件,内容只有持有密码的人才能看。

执行时加--ask-vault-pass手动输密码,或者配vault密码文件走CI/CD。这设计不算完美——密码文件本身又成了新攻击面——但在2014年那个语境下,比明文写死在Git里强太多了。

更现代的用法是和HashiCorp Vault、AWS Secrets Manager集成。Ansible 2.10后内置了lookup插件,能动态拉取外部密钥。某金融科技公司的流水线:Git里只存引用ID,真实密钥每次部署时从Vault临时申请,过期作废。

5. 3000+模块:从虚拟机到Kubernetes的全覆盖

5. 3000+模块:从虚拟机到Kubernetes的全覆盖

Ansible的模块库已经膨胀到三千多个。AWS、Azure、GCP的API封装,Docker、K8s的容器编排,Cisco、Juniper的网络设备配置,甚至Windows域控管理,全部能用YAML描述。

这让它成了异构环境的粘合剂。传统机房有物理机,云上跑着EC2,容器平台用EKS,网络设备来自三家厂商——Ansible像万能转接头,一头插你的意图,一头插各种API

但模块多也有副作用。aws_ec2模块和amazon.aws.ec2_instance模块功能重叠,文档分散在不同版本。新手常犯的错误:抄了篇三年前的博客,用的模块早已废弃。官方文档的version_added字段得养成习惯扫一眼。

Red Hat 2015年收购Ansible后,商业化路线是Tower(现叫AAP)。免费版功能受限,但核心引擎永远开源。这次API彻底免费开放,相当于把Tower的REST API能力下沉到社区版——你能用Python直接调Ansible,不用装那个沉重的Java后台了

某DevOps工程师在GitHub issue里吐槽:终于不用为了API调个playbook,去维护一个AAP实例了。这条评论收获了四百多个赞。

开放API的直接影响:CI/CD集成更轻量。Jenkins、GitLab CI、GitHub Actions里直接起Python容器,pip装ansible,HTTP触发playbook执行。日志结构化输出,失败节点自动重试,全部代码可控。

但SSH的瓶颈也在大规模场景暴露。五千台机器同时建连接,SSH握手能把控制节点CPU打满。解决方案是分批执行(serial参数)或上 Mitogen 插件走持久连接。Ansible 2.15实验性的"无控制节点"模式,让目标机器互相拉取任务,彻底解耦中心节点。

技术选型永远有trade-off。Terraform声明式、状态文件驱动,适合云资源;Ansible命令式、无状态,适合配置漂移修复。两者不是替代关系,是组合拳。某SaaS公司的实践:Terraform管基础设施生命周期,Ansible管机器内部细节,边界划在操作系统启动之后。

Agentless的代价是依赖SSH可用性。网络分区时,Ansible无能为力。Puppet、Salt的agent模式反而能缓存状态,等网络恢复后同步。这是架构层面的取舍,没有银弹。

这次API开放,Red Hat的算盘很明显:降低试用门槛,培养社区习惯,企业级支持自然转化。但社区版的功能已经足够硬核——三千模块、Vault加密、Role复用、幂等执行,小团队能用到公司上市

有个细节值得玩味:Ansible的logo是太空船,设计灵感来自《银河系漫游指南》。那本小说里,超级计算机Deep Thought算了750万年,给出终极答案是42。Ansible的哲学倒过来——别追求终极答案,先把眼前这堆服务器管明白

你现在用Ansible还是Terraform?或者已经切到Pulumi写Python了?