Skip to content

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=root

4. 测试连接

测试所有主机的连通性:

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_name

4. 测试ansible-playbook

创建一个简单的测试Playbook来验证Ansible功能:

bash
vi test.yml
yaml
---
- hosts: web_servers
  tasks:
    - name: 显示主机名
      shell: hostname
      register: result

    - name: 打印结果
      debug:
        msg: "{{ result.stdout }}"

执行测试:

bash
ansible-playbook -i /etc/ansible/hosts test.yml

Ansible 核心命令一页通

功能命令示例参数说明
连通性测试ansible c -i hosts.ini -m pingc 对指定组执行命令
-i hosts.ini 指定主机清单文件
-m ping 使用 ping 模块
执行Shell命令ansible b -i hosts.ini -m shell -a "df -h | grep NAS"-m shell 使用 shell 模块
-a "..." 模块的参数,即要执行的命令
执行Playbookansible-playbook -i hosts.ini mount_nas.ymlansible-playbook 执行Playbook的专属程序
-i hosts.ini 指定主机清单文件
mount_nas.yml 要执行的Playbook文件

用心记录,持续学习 | CNB