自动化运维工具Ansible介绍
字数 2160 2025-08-18 11:37:57
Ansible自动化运维工具详解
一、Ansible基础介绍
1. 简介
Ansible是一款基于Python开发的自动化运维工具,集合了多种运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了以下功能:
- 批量系统配置
- 批量程序部署
- 批量运行命令
Ansible基于模块工作,本身没有批量部署能力,真正实现批量部署的是Ansible运行的模块。Ansible主要提供框架,包括:
- 连接插件(connection plugins):负责和被监控端实现通信
- 主机清单(host inventory):指定操作的主机,是一个定义监控主机的配置文件
- 各种模块:核心模块、command模块、自定义模块
- 插件:完成记录日志邮件等功能
- playbook:剧本,执行多个任务时使用,非必需但可以让节点一次性运行多个任务
2. 总体架构
Ansible采用无代理架构,通过SSH协议与远程主机通信,主要组件包括:
- 控制节点(Control Node):运行Ansible命令的主机
- 受管节点(Managed Nodes):被Ansible管理的主机
- 清单文件(Inventory):定义受管节点
- 模块(Modules):执行特定任务的代码单元
- 插件(Plugins):扩展Ansible核心功能
3. 特性
- 无代理(no agents):不需要在被管控主机上安装任何客户端
- 无服务器端(no server):使用时直接运行命令即可
- 多语言模块(modules in any languages):可使用任何语言开发模块
- YAML配置(yam1, not code):使用YAML语言定制剧本playbook
- 基于SSH(ssh by default):默认使用SSH工作
- 强大的多层解决方案(strong multi-tier solution):可实现多级指挥
4. 优点
- 轻量级:无需在客户端安装agent,更新时只需在操作机上进行一次更新
- 高效:批量任务可以写成脚本,且不用分发到远程就可以执行
- 易维护:使用Python编写,相比Ruby语法更简单
- 支持sudo:可以方便地执行需要特权权限的操作
二、Ansible基础安装与配置
1. Ansible基础安装
(1) Python 2.7安装
Ansible基于Python开发,需要Python 2.7环境:
# 将python头文件拷贝到标准目录,以避免编译ansible时找不到所需的头文件
cd /usr/local/include/python2.7/
cp -a ./* /usr/local/include/
# 备份旧版的python,并符号链接新版的python
# 修改yum脚本,使其指向旧版本的python,以避免其无法运行
vi /usr/bin/yum
# 将 #!/usr/bin/python 改为 #!/usr/bin/python2.6
(2) 安装必要模块
# setuptools模块安装
# pycrypto模块安装
# PyYAML模块安装
# Jinja2模块安装
# paramiko模块安装
# simplejson模块安装
(3) Ansible安装
# 使用pip安装Ansible
pip install ansible
# 或从源码安装
# 下载源码包后执行
python setup.py install
2. Ansible配置
(1) SSH免密钥登录设置
Ansible默认使用SSH连接远程主机,配置免密登录可提高效率:
# 生成公钥私钥
ssh-keygen -t rsa
# 将公钥分发到其他服务器
ssh-copy-id user@remote_host
# 或在所有服务器上执行以下指令将公钥内容添加到~/.ssh/authorized_keys
cat /root/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
三、Ansible核心概念
1. 主机清单(Inventory)
Inventory文件定义了Ansible管理的主机,默认位置为/etc/ansible/hosts,格式如下:
[webservers]
web1.example.com
web2.example.com
[dbservers]
db1.example.com
db2.example.com
[production:children]
webservers
dbservers
2. 模块(Modules)
Ansible通过模块执行具体任务,常用模块包括:
- command/shell:执行命令
- copy:复制文件
- file:管理文件和目录
- yum/apt:包管理
- service:管理服务
- user/group:用户和组管理
3. Playbook
Playbook是Ansible的配置、部署和编排语言,使用YAML格式编写:
---
- hosts: webservers
become: yes
tasks:
- name: Ensure Apache is installed
yum:
name: httpd
state: present
- name: Ensure Apache is running
service:
name: httpd
state: started
enabled: yes
四、Ansible使用示例
1. 基本命令
# 测试所有主机的连通性
ansible all -m ping
# 在所有主机上执行命令
ansible all -a "/bin/echo hello"
# 使用特定模块
ansible webservers -m yum -a "name=httpd state=present"
# 使用sudo权限
ansible dbservers -b -m yum -a "name=mysql-server state=present"
2. Playbook执行
# 运行playbook
ansible-playbook site.yml
# 检查playbook语法
ansible-playbook --syntax-check site.yml
# 列出playbook中所有任务
ansible-playbook --list-tasks site.yml
五、Ansible高级特性
1. 变量和Facts
Ansible支持多种变量定义方式:
- Inventory变量
- Playbook变量
- 注册变量
- Facts变量(系统自动收集的信息)
- hosts: all
vars:
http_port: 80
tasks:
- name: Print variable
debug:
msg: "The port is {{ http_port }}"
2. 模板(Templates)
使用Jinja2模板引擎动态生成配置文件:
# httpd.conf.j2
Listen {{ http_port }}
ServerName {{ ansible_fqdn }}
- name: Configure Apache
template:
src: httpd.conf.j2
dest: /etc/httpd/conf/httpd.conf
3. 角色(Roles)
Roles是组织Playbook的高级方式,目录结构如下:
roles/
common/
tasks/
handlers/
files/
templates/
vars/
defaults/
meta/
webservers/
tasks/
defaults/
...
六、Ansible最佳实践
- 版本控制:将Playbook和Roles纳入版本控制系统(如Git)
- 环境分离:为开发、测试和生产环境使用不同的Inventory文件
- 变量管理:敏感信息使用Ansible Vault加密
- 模块化:尽量使用官方模块而非shell命令
- 幂等性:确保Playbook可以安全地多次运行
七、Ansible Vault
用于加密敏感数据:
# 创建加密文件
ansible-vault create secret.yml
# 编辑加密文件
ansible-vault edit secret.yml
# 运行使用加密变量的Playbook
ansible-playbook --ask-vault-pass site.yml
八、Ansible Galaxy
Ansible Galaxy是一个共享Roles的社区平台:
# 搜索可用Roles
ansible-galaxy search 'nginx'
# 安装Role
ansible-galaxy install geerlingguy.nginx
# 初始化新Role
ansible-galaxy init my_role
九、Ansible Tower/AWX
Ansible Tower是Red Hat提供的企业级Ansible管理平台,AWX是其开源版本,提供:
- 基于Web的用户界面
- 任务调度
- 可视化仪表盘
- 访问控制
- 审计日志
十、Ansible与云平台集成
Ansible提供模块支持主流云平台:
- AWS (ec2, s3, rds等模块)
- Azure (azure_rm模块系列)
- Google Cloud (gcp模块系列)
- OpenStack (os模块系列)
- name: Create EC2 instance
ec2:
key_name: mykey
instance_type: t2.micro
image: ami-123456
wait: yes
count: 3
vpc_subnet_id: subnet-29e63245
assign_public_ip: yes
总结
Ansible作为一款现代化的自动化运维工具,以其简单易用、无代理架构和强大的功能在DevOps领域广受欢迎。通过掌握Ansible的核心概念、Playbook编写和高级特性,可以显著提高IT基础设施的管理效率和可靠性。