Ansible 是一款开源、基于 Python 的自动化运维与配置管理工具,核心目标是简单、安全、无代理(Agentless),通过 SSH 协议在控制节点对被管节点执行批量任务,无需在被控端安装客户端。
一、Ansible的安装
我系统是Ubuntu 24.04 64位
1、使用Xshell远程连接工具登录服务器
2、# 先更新包列表
sudo apt update
#安装虚拟环境包
# 假设输出 Python 3.11,则安装:
sudo apt install python3.11-venv
# 创建虚拟环境
python3 -m venv ~/ansible-env
# 激活虚拟环境(每次都要执行)
source ~/ansible-env/bin/activate
# 安装 Ansible
pip install ansible
# 验证
ansible --version
三、SSH 免密登录配置(关键前置步骤)
Ansible 基于 SSH 通信,建议配置 SSH 密钥认证,避免每次执行都输入密码
# 1. 在控制节点生成 SSH 密钥(如果还没有)
ssh-keygen -t ed25519 -C "ansible@control-node" -f ~/.ssh/ansible_key
# 2. 将公钥复制到每台受管服务器
ssh-copy-id -i ~/.ssh/ansible_key.pub root@<目标服务器IP>
# 3. 测试 SSH 连接是否正常
ssh -i ~/.ssh/ansible_key root@<目标服务器IP>
使用 ssh-agent(推荐)
# 启动 ssh-agent 并添加私钥
eval $(ssh-agent)
ssh-add ~/.ssh/ansible_key
# 验证密钥已添加
ssh-add -l
四、编写 Inventory(主机清单)
Inventory 文件定义了你要管理哪些服务器。建议按业务角色分组,而不是把所有机器混在一起。
创建一个 inventory.ini 文件,内容如下:
ini
# 阿里云服务器组
[aliyun]
web-1 ansible_host=47.96.xxx.xxx ansible_user=root
web-2 ansible_host=120.96.xxx.xxx ansible_user=root
# 腾讯云服务器组
[tencent]
web-3 ansible_host=118.24.xxx.xxx ansible_user=ubuntu
# 定义公共变量(所有组生效)
[all:vars]
ansible_port=22
ansible_python_interpreter=/usr/bin/python3
# 定义生产环境组(包含所有服务器)
[production:children]
aliyun
tencent
验证 Inventory 是否配置正确:
bash
# 测试与所有服务器的连通性
ansible all -i inventory.ini -m ping
# 只测试阿里云服务器组
ansible aliyun -i inventory.ini -m ping
如果返回 "pong",说明连接正常,可以继续下一步。
五、编写第一个 Ansible Playbook
Playbook 用 YAML 格式编写,定义了在一组服务器上执行的一系列任务。它的一个核心特性是幂等性——无论执行多少次,最终状态都是一致的。
创建一个 deploy-nginx.yml 文件:
yaml
---
- name: 在 Web 服务器上安装和配置 Nginx
hosts: production # 目标服务器组
become: yes # 使用 sudo 提权
vars:
nginx_port: 80
tasks:
# 任务1:安装 Nginx
- name: 安装 Nginx (Ubuntu/Debian)
apt:
name: nginx
state: present
update_cache: yes
when: ansible_os_family == "Debian"
- name: 安装 Nginx (CentOS/RHEL)
yum:
name: nginx
state: present
when: ansible_os_family == "RedHat"
# 任务2:复制自定义 Nginx 配置文件(从模板渲染)
- name: 配置 Nginx 虚拟主机
template:
src: nginx.conf.j2 # 本地模板文件
dest: /etc/nginx/nginx.conf
mode: '0644'
notify: restart nginx # 配置文件变更时触发 handler
# 任务3:确保 Nginx 服务正在运行
- name: 启动 Nginx 服务
systemd:
name: nginx
state: started
enabled: yes # 设置开机自启
handlers:
# Handler:只在被 notify 时执行
- name: restart nginx
systemd:
name: nginx
state: restarted
执行 Playbook
bash
ansible-playbook -i inventory.ini deploy-nginx.yml
执行后,Ansible 会逐一在目标服务器上执行任务,并报告每个任务的结果:
ok:服务器已经处于期望状态(不需要变更)
changed:执行了变更操作
failed:执行失败
六、常用 ad-hoc 命令(快速操作)
对于一次性任务,可以直接使用 ad-hoc 命令,不需要写 Playbook:
bash
# 批量执行命令(查看系统版本)
ansible production -i inventory.ini -m shell -a "cat /etc/os-release"
# 批量查看磁盘使用情况
ansible aliyun -i inventory.ini -m shell -a "df -h"
# 批量重启服务
ansible tencent -i inventory.ini -m systemd -a "name=nginx state=restarted"
七、进阶配置建议
7.1 创建项目级配置文件 ansible.cfg
在项目目录下创建 ansible.cfg,可以统一管理连接参数,避免每次指定 -i 参数:
ini
[defaults]
inventory = ./inventory.ini
private_key_file = ~/.ssh/ansible_key
remote_user = root
host_key_checking = False
forks = 20 # 并行执行的进程数,可根据服务器数量调整
retry_files_enabled = False
[privilege_escalation]
become = True
become_method = sudo
become_user = root
become_ask_pass = False
7.2 使用 Ansible Vault 加密敏感信息
不要在 Inventory 或 Playbook 中明文存放密码。可以使用 Ansible Vault 加密敏感变量文件:
bash
# 创建加密的变量文件
ansible-vault create vars/secret.yml
# 编辑加密文件
ansible-vault edit vars/secret.yml
# 执行 Playbook 时输入密码
ansible-playbook -i inventory.ini deploy.yml --ask-vault-pass
八、总结
阶段 操作
安装 在控制节点安装 Ansible(Ubuntu 用 apt install ansible,CentOS 用 dnf install ansible)
SSH 配置 配置控制节点到所有目标服务器的 SSH 免密登录
编写 Inventory 定义目标服务器分组(按阿里/腾讯或业务角色分组)
编写 Playbook 定义自动化任务(安装软件、配置文件、启动服务等)
执行部署 ansible-playbook -i inventory.ini deploy.yml
这套从零开始的 Ansible 操作流程,能够支撑你的混合云(阿里+腾讯)部署需求。接下来可以先用 ping 模块验证连通性,再逐步扩展 Playbook,把之前讨论的镜像拉取、容器启动等步骤纳入自动化管理中。