自动化运维工具 Ansible:集中化管理服务器完全指南
一、Ansible 概述和运行机制
1.1 Ansible 是什么?
Ansible 是一款面向类 Unix 系统的自由开源配置和自动化工具,使用 Python 编写。与 SaltStack、Puppet、Chef 等工具类似,但具备以下独特优势:
- 无需客户端:被管理节点无需安装额外软件
- 基于 SSH:通过 SSH 协议进行通信,安全可靠
- YAML + Jinja2:使用简洁的 YAML 配置文件和 Jinja2 模板语言
行业背景:
- 2015 年 10 月,红帽(Red Hat)以约 1-1.5 亿美元收购 Ansible
- 成立于 2013 年,总部位于北卡罗来纳州达勒姆
1.2 Ansible 核心特点
- 部署简单:只需在管理端安装,被控端零配置
- SSH 协议:默认使用 SSH 管理设备
- 集中化管理:支持主从管理模式
- 配置简洁:功能强大且扩展性高
- 支持 API:可通过 Python 自定义模块
- Playbook:实现复杂任务配置和状态管理
- 云平台支持:对云计算和大数据平台支持良好
1.3 Ansible 工作机制
Ansible 通过 SSH 将模块推送到被管理节点执行,执行完毕后自动删除。核心组件包括:
- Host Inventory:主机清单
- Playbooks:任务剧本
- Core Modules:核心模块
- Custom Modules:自定义模块
- Plugins:插件系统(邮件、日志等)
1.4 Ansible 核心架构
核心组成:
- Ansible:核心引擎
- Modules:内置核心模块和自定义模块
- Plugins:功能补充插件
- Playbooks:定义多任务操作
- Inventory:主机清单管理
1.5 Ansible 角色(Role)
随着环境复杂化,Playbook 可能变得庞大难维护。Role 提供了模块化管理方案:
- 将任务组织为独立、可复用的单元
- 支持外部加载任务、处理程序和变量
- 可关联静态文件和模板
- 严格的目标结构要求,便于复用
二、Ansible 环境安装部署
2.1 环境准备示例
类型 | IP地址 |
---|---|
管理端 | 192.168.10.23 |
被管理端 | 192.168.10.14 |
被管理端 | 192.168.10.15 |
2.2 管理端安装步骤
bash
# 安装 EPEL 源
yum install -y epel-release
# 安装 Ansible
yum install -y ansible
2.3 目录结构说明
/etc/ansible/
├── ansible.cfg # 配置文件(一般无需修改)
├── hosts # 主机清单文件
└── roles/ # 公共角色目录
2.4 配置主机清单
编辑 /etc/ansible/hosts
:
ini
[webservers]
192.168.10.14
[dbservers]
192.168.10.15
2.5 配置 SSH 免密登录
bash
# 生成密钥对
ssh-keygen -t rsa
# 复制公钥到被管理端
sshpass -p '123456' ssh-copy-id root@192.168.10.14
sshpass -p '123456' ssh-copy-id root@192.168.10.15
三、Ansible 基础命令及模块操作
3.1 命令基本格式
bash
ansible <组名> -m <模块名> -a <参数>
3.2 常用模块详解
3.2.1 command 模块
远程执行命令(不支持管道/重定向)
bash
ansible-doc -s command # 查看模块说明
ansible webservers -m command -a 'date' # 执行 date 命令
ansible all -m command -a 'ls /' # 所有主机执行 ls
常用参数:
chdir
:执行前切换目录creates
:文件存在则不执行removes
:文件存在则执行
3.2.2 shell 模块
支持管道和 shell 特性
bash
ansible observers -m shell -a 'echo 123456 | passwd --stdin test'
3.2.3 cron 模块
管理计划任务
bash
# 添加计划任务
ansible webservers -m cron -a 'minute="*/1" job="/bin/echo helloworld" name="test crontab"'
# 移除计划任务
ansible webservers -m cron -a 'name="test crontab" state=absent'
3.2.4 user 模块
用户管理
bash
# 创建用户
ansible observers -m user -a 'name="test01"'
# 删除用户
ansible observers -m user -a 'name="test01" state=absent'
3.2.5 group 模块
用户组管理
bash
# 创建组
ansible observers -m group -a 'name=mysql gid=306 system=yes'
# 用户加组
ansible observers -m user -a 'name=test01 uid=306 system=yes group=mysql'
3.2.6 copy 模块
文件复制
bash
# 复制文件
ansible observers -m copy -a 'src=/etc/fstab dest=/opt/fstab.bak owner=root mode=640'
# 写入内容
ansible observers -m copy -a 'content="helloworld" dest=/opt/hello.txt'
3.2.7 file 模块
文件属性管理
bash
# 修改属性
ansible observers -m file -a 'owner=test01 group=mysql mode=644 path=/opt/fstab.bak'
# 创建链接
ansible observers -m file -a 'path=/opt/fstab.link src=/opt/fstab.bak state=link'
# 创建文件
ansible observers -m file -a "path=/opt/abc.txt state=touch"
3.2.8 hostname 模块
修改主机名
bash
ansible observers -m hostname -a "name=mysql01"
3.2.9 ping 模块
连通性测试
bash
ansible all -m ping
3.2.10 yum 模块
软件包管理
bash
# 安装软件
ansible webservers -m yum -a 'name=httpd'
# 卸载软件
ansible webservers -m yum -a 'name=httpd state=absent'
3.2.11 service 模块
服务管理
bash
# 启动服务并设置开机自启
ansible webservers -m service -a 'enabled=true name=httpd state=started'
3.2.12 script 模块
执行本地脚本
bash
# 编写测试脚本
vim test.sh
#!/bin/bash
echo "hello ansible from script" > /opt/script.txt
# 执行脚本
ansible webservers -m script -a 'test.sh'
3.2.13 setup 模块
收集节点信息
bash
# 获取所有信息
ansible webservers -m setup
# 筛选特定信息
ansible observers -m setup -a 'filter=*ipv4'
四、Inventory 主机清单与变量配置
4.1 主机分组配置
ini
[webservers]
192.168.10.14:2222 # 自定义 SSH 端口
192.168.10.1[2:5] # 范围匹配
[dbservers]
db-[a:f].example.org # 模式匹配
4.2 常用 Inventory 变量
变量名 | 含义 |
---|---|
ansible_host |
节点 IP |
ansible_port |
SSH 端口(默认 22) |
ansible_user |
SSH 用户 |
ansible_password |
SSH 密码 |
ansible_ssh_private_key_file |
私钥文件路径 |
ansible_become |
是否提升权限 |
ansible_become_method |
提升方式(sudo/su/runas) |
ansible_become_user |
提升为目标用户 |
ansible_become_password |
提升密码 |
4.3 变量配置示例
主机变量
ini
[webservers]
192.168.10.14 ansible_port=22 ansible_user=root ansible_password=abc1234
组变量
ini
[webservers:vars]
ansible_user=root
ansible_password=abc1234
[all:vars]
ansible_port=22
组嵌套
ini
[nginx]
192.168.10.20
192.168.10.21
[apache]
192.168.10.30
192.168.10.31
[webs:children]
nginx
apache
总结
Ansible 作为一款轻量级、功能强大的自动化运维工具,通过 SSH 协议和 YAML 配置语言,实现了对服务器的集中化管理和自动化操作。本文详细介绍了 Ansible 的基础概念、安装配置、常用模块和主机清单管理,为初学者提供了完整的学习路径。
掌握 Ansible 可以帮助运维人员提高工作效率,实现基础设施的代码化管理,是现代 DevOps 实践中不可或缺的重要工具。