Ansible自动化部署配置完整指南
概述
Ansible是一款基于Python开发的自动化运维工具,通过SSH协议实现远程主机管理,具有无客户端、简单易用、可扩展性强等特点。本文档详细介绍Ansible的安装配置和核心使用方法。
前提条件
系统要求
- 控制端:Linux系统(CentOS/Ubuntu等)
- 被控端:已配置SSH服务的Linux系统
- 网络:控制端到所有被控端的网络连通性
安装Ansible
bash
# 安装Ansible(CentOS/RHEL)
yum install ansible -y
# 安装Ansible(Ubuntu/Debian)
apt install ansible -y操作步骤
1. 配置SSH免密登录
生成密钥对:
bash
ssh-keygen -t rsa -b 4096将公钥复制到目标服务器:
bash
ssh-copy-id user@192.18.22.1
ssh-copy-id user@192.18.22.2原理说明:SSH密钥认证基于非对称加密,私钥保留在本地,公钥分发到远程服务器。相比密码认证,密钥认证更安全且适合自动化场景。
2. 配置Ansible配置文件
创建并编辑配置文件:
bash
vi ~/.ansible.cfg配置内容:
ini
[defaults]
inventory = /etc/ansible/hosts # 指定主机清单文件路径
host_key_checking = False # 禁用主机密钥检查(生产环境建议启用)
log_path = /var/log/ansible.log # 指定日志文件路径
retry_files_enabled = False # 禁用重试文件生成3. 配置主机清单
创建目录和文件:
bash
mkdir -p /etc/ansible
vi /etc/ansible/hosts配置主机分组:
ini
[web_servers]
172.18.22.1 ansible_port=22 ansible_user=root
172.18.22.2 ansible_port=22 ansible_user=root
[database]
172.18.22.3 ansible_port=22 ansible_user=root4. 测试连接
测试所有主机的连通性:
bash
ansible all -m ping预期输出:
json
172.18.22.1 | SUCCESS => {
"changed": false,
"ping": "pong"
}
172.18.22.2 | SUCCESS => {
"changed": false,
"ping": "pong"
}核心命令详解
1. 连通性测试
bash
# 测试指定主机组
ansible web_servers -i hosts.ini -m ping
# 参数说明:
# -i: 指定inventory文件
# -m: 指定模块(ping模块用于连通性测试)2. 执行Shell命令
bash
# 在远程主机执行命令(支持管道符)
ansible web_servers -i hosts.ini -m shell -a "df -h | grep '/dev/sda1'"
# 参数说明:
# -a: 模块参数,即要执行的命令3. 执行Playbook
bash
# 执行完整的自动化任务剧本
ansible-playbook -i hosts.ini deploy_app.yml
# 参数说明:
# deploy_app.yml: 预定义的Playbook文件常用模块说明
| 模块名称 | 功能描述 | 使用场景 |
|---|---|---|
ping | 测试主机连通性 | 连通性检查 |
shell | 执行shell命令 | 复杂命令操作 |
command | 执行简单命令 | 不支持管道符 |
copy | 复制文件到远程主机 | 文件分发 |
template | 基于模板生成配置文件 | 配置管理 |
yum/apt | 包管理 | 软件安装 |
service | 服务管理 | 服务启停 |
user | 用户管理 | 用户创建/删除 |
Playbook示例
创建简单的应用部署Playbook:
yaml
---
- hosts: web_servers
become: yes
tasks:
- name: 安装Nginx
yum:
name: nginx
state: present
- name: 启动并启用Nginx服务
service:
name: nginx
state: started
enabled: yes
- name: 复制配置文件
copy:
src: ./nginx.conf
dest: /etc/nginx/nginx.conf
notify: restart nginx
handlers:
- name: restart nginx
service:
name: nginx
state: restarted执行Playbook:
bash
ansible-playbook -i hosts.ini deploy_nginx.yml注意事项
⚠️ 安全提醒:
- 生产环境中建议启用主机密钥检查
- 使用Ansible Vault加密敏感数据
- 限制sudo权限,遵循最小权限原则
⚠️ 性能优化:
- 使用
forks参数控制并发数(默认5)- 启用SSH连接复用(ControlPersist)
- 对大规模部署使用分批执行模式
故障排查
常见错误及解决方案
错误1:SSH连接失败
bash
# 解决方案:检查SSH配置
ansible all -m raw -a "systemctl status sshd"错误2:权限不足
bash
# 解决方案:检查sudo配置
ansible all -m shell -a "whoami"错误3:模块未找到
bash
# 解决方案:检查Ansible版本和模块路径
ansible --version
ansible-doc -l | grep module_name4. 测试ansible-playbook
创建一个简单的测试Playbook来验证Ansible功能:
bash
vi test.ymlyaml
---
- hosts: web_servers
tasks:
- name: 显示主机名
shell: hostname
register: result
- name: 打印结果
debug:
msg: "{{ result.stdout }}"执行测试:
bash
ansible-playbook -i /etc/ansible/hosts test.ymlAnsible 核心命令一页通
| 功能 | 命令示例 | 参数说明 |
|---|---|---|
| 连通性测试 | ansible c -i hosts.ini -m ping | c 对指定组执行命令-i hosts.ini 指定主机清单文件-m ping 使用 ping 模块 |
| 执行Shell命令 | ansible b -i hosts.ini -m shell -a "df -h | grep NAS" | -m shell 使用 shell 模块-a "..." 模块的参数,即要执行的命令 |
| 执行Playbook | ansible-playbook -i hosts.ini mount_nas.yml | ansible-playbook 执行Playbook的专属程序-i hosts.ini 指定主机清单文件mount_nas.yml 要执行的Playbook文件 |