Ansible 自动化入门笔记
本文系统介绍了Ansible配置管理工具的核心知识点,包括其无代理架构、YAML语法优势和广泛应用场景。重点讲解了Inventory管理(静态/动态)、配置文件优化、Playbook编写与执行、模块选择等核心内容,并分享了多Play实施和特权提升的最佳实践。文章还总结了常见易错点,如配置优先级、YAML缩进规范等。后续将深入变量、角色等高级功能,帮助读者掌握这一强大自动化工具。
Ansible 作为当前主流的配置管理工具,无代理、幂等性强、易上手,用它来管理几十上百台服务器真的能省下大量重复工作。
这篇博客把课程前两章的核心知识点系统整理了一下,。后面章节会继续分享变量、角色、故障排除等内容,感兴趣的可以关注后续更新。
目录
-
Ansible 简介与发展背景
-
Ansible 架构与核心优势
-
Ansible Inventory 管理(静态与动态)
-
Ansible 配置文件详解
-
编写与执行 Playbook 基础
-
多 Play 实施与特权提升
-
模块选择与文档查看技巧
-
核心知识点汇总与易错点分析
-
总结与实践建议
1. Ansible 简介与发展背景
Ansible 是由 Michael DeHaan 在 2012 年创建的开源自动化工具,后来被 Red Hat 收购并发展成企业级产品(Red Hat Ansible Automation Platform)。它最初的目标就是简化 IT 自动化,让运维人员用简单的 YAML 文件描述基础设施状态,而不是写复杂的脚本。
相比 Puppet、Chef 等传统配置管理工具,Ansible 的最大特点是无代理架构:只需要在控制节点安装 Ansible,受控节点只需开通 SSH(或 WinRM for Windows)即可,不需要在每台服务器上装 agent。这大大降低了部署复杂度,尤其适合异构环境。
现在 Ansible 已经广泛用于:
-
Linux/Windows 服务器配置管理
-
网络设备自动化(Cisco、Juniper 等)
-
云资源编排(AWS、OpenStack)
-
容器与 Kubernetes 部署
Red Hat 将 Ansible 包装成 Ansible Automation Platform(AAP),增加了执行环境、内容集合、分析报告等企业特性,但核心 ansible-core 仍是开源免费的。
个人体会:在生产环境里,Ansible 最吸引我的就是“声明式”编程——你描述“最终状态应该是什么样”,Ansible 自动帮你收敛到这个状态,多次运行也不会产生副作用(幂等性)。
2. Ansible 架构与核心优势
Ansible 的架构非常简洁:
-
控制节点(Control Node):安装 ansible-navigator 或 ansible-core,运行 Playbook 的地方。
-
受控节点(Managed Nodes):被管理的服务器,只需 SSH 可达 + Python(大部分模块需要)。
-
Inventory:定义管理哪些主机及其分组。
-
Playbook:YAML 格式的自动化脚本,描述任务序列。
-
模块(Modules):Ansible 实际执行单元,打包在内容集合(Collections)中。
-
执行环境(Execution Environment):容器化运行环境(推荐使用),隔离依赖。
核心优势:
-
无代理:部署快,资源占用低
-
幂等性:安全多次执行
-
YAML 语法:人类可读,便于版本控制
-
Push 模式:控制节点主动推送任务,实时性强
-
支持 Windows、网络设备、云平台
3. Ansible Inventory 管理(静态与动态)
Inventory 是 Ansible 知道“管哪些机器”的清单文件。
3.1 静态 Inventory(INI/YAML 格式)
推荐放在项目目录下的 inventory.ini:
[webservers]
web1.example.com
web2.example.com ansible_host=192.168.1.10
[dbservers]
db1.example.com
[servers:children] # 组的组
webservers
dbservers
[all:vars] # 全局变量
ansible_user=admin
ansible_ssh_private_key_file=~/.ssh/id_rsa
范围简化写法(非常实用):
web[01:10].example.com # web01 到 web10
192.168.1.[1:100] # 192.168.1.1 到 192.168.1.100
验证 Inventory:
ansible-navigator inventory -i inventory.ini --graph # 查看组结构
ansible-navigator inventory -i inventory.ini --list # 列出所有主机
3.2 动态 Inventory
适合云环境(AWS、OpenStack),Ansible 自带动态脚本,或用社区插件。课程中提到但不深入,实际生产常用 amazon.aws 集合。
实战建议:小规模先用静态 Inventory,机器上百后考虑动态或 CMDB 集成。
4. Ansible 配置文件详解
项目目录下创建 ansible.cfg 覆盖默认设置:
[defaults]
inventory = ./inventory.ini
remote_user = admin
ask_pass = false # 如果用密码登录设为 true
become = true # 默认启用提权
become_method = sudo
become_ask_pass = false
[privilege_escalation]
become = true
become_user = root
ansible-navigator 专用配置 ansible-navigator.yml:
---
ansible-navigator:
execution-environment:
image: quay.io/ansible/creator-ee:latest
pull:
policy: missing
playbook-artifact:
enable: false # 密码登录时必须禁用
查看当前生效配置:
ansible-navigator config
易错点:配置优先级复杂(环境变量 > 项目目录 > 用户目录 > /etc/ansible),建议每个项目都带自己的 ansible.cfg,避免全局污染。
5. 编写与执行 Playbook 基础
Playbook 是 YAML 文件,扩展名通常 .yml。
简单示例 site.yml:
---
- name: 配置 Web 服务器基础环境
hosts: webservers
become: true
tasks:
- name: 确保 httpd 已安装
ansible.builtin.dnf:
name: httpd
state: present
- name: 确保 httpd 服务启动并开机自启
ansible.builtin.service:
name: httpd
state: started
enabled: true
执行:
ansible-navigator run site.yml -m stdout # 标准输出模式
ansible-navigator run site.yml --check # 干跑模式(不实际修改)
ansible-navigator run site.yml --syntax-check # 语法检查
关键点:
-
使用 FQCN(完全限定集合名称)如
ansible.builtin.dnf,避免未来冲突 -
给 play 和 task 加
name,运行时输出更清晰 -
大部分模块幂等,多次运行只有第一次会 changed
6. 多 Play 实施与特权提升
一个 Playbook 可包含多个 Play,分别针对不同主机组:
---
- name: 配置所有服务器通用设置
hosts: all
become: true
tasks:
- name: 更新所有软件包
ansible.builtin.dnf:
name: "*"
state: latest
- name: 配置数据库服务器
hosts: dbservers
remote_user: dbadmin
become: true
become_user: root
tasks:
- name: 安装 mariadb
ansible.builtin.dnf:
name: mariadb-server
state: present
特权提升建议:不要全局 become=true,按需在 play 或 task 级别设置,更安全。
7. 模块选择与文档查看技巧
查看可用模块:
ansible-navigator collections # 浏览所有集合
ansible-navigator doc -l # 列出模块
ansible-navigator doc ansible.builtin.dnf # 查看具体文档
ansible-navigator doc -t module dnf # 搜索模块
常用任意命令模块(慎用,非幂等):
- name: 执行重启(仅在需要时)
ansible.builtin.command: /sbin/reboot
when: update_result.changed
优先使用专用模块(如 dnf、service),再考虑 command/shell。
8. 核心知识点汇总与易错点分析
| 知识点 | 核心作用与应用场景 | 易错点与建议 |
|---|---|---|
| 无代理架构 | 控制节点 Push 任务到受控节点 | 受控节点必须 SSH 可达 + Python |
| Inventory | 定义管理主机与分组 | 忘记指定 -i 时用默认 /etc/ansible/hosts |
| ansible.cfg | 覆盖默认行为 | 配置冲突时用 ansible-navigator config 查看生效配置 |
| Playbook YAML 缩进 | 严格空格缩进(不能用 Tab) | vim 中设置 set expandtab |
| 模块 FQCN | 避免命名冲突 | 新 Playbook 必须用 ansible.builtin.xxx |
| become 特权提升 | 按需提权到 root | 全局开启不安全,建议 play 级别控制 |
| ansible-navigator | 现代执行工具,支持执行环境 | 密码登录时必须禁用 playbook-artifact |
9. 总结
Ansible 的魅力在于“简单却强大”:用几行 YAML 就能管理整个机房。
后续会继续分享变量、事实、任务控制、角色等高级内容。欢迎留言交流你在用 Ansible 时遇到的坑,或者分享你的自动化脚本~
(完)
更多推荐
所有评论(0)