🚀 30+款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度
在实际运维工作中,手工登录服务器、执行重复命令、部署应用、管理配置不仅效率低下,而且极易出错。随着服务器规模从几台扩展到几十上百台,这种“人肉运维”模式将变得不可持续。自动化运维正是为了解决这一痛点,其核心思想是“一次编写,处处执行”,将运维操作代码化、流程化。Ansible 和 Docker 是构建现代自动化运维体系的两大基石:Ansible 负责编排和执行任务,实现配置管理、应用部署;Docker 则通过容器化技术,将应用及其依赖打包成标准单元,实现环境一致性。
本文面向希望从零开始构建自动化运维能力的运维工程师和开发者。我们将完成一个完整的实战闭环:首先在控制节点安装和配置 Ansible,然后在被管节点上通过 Ansible 自动化安装 Docker,最后使用 Ansible 部署一个简单的容器化应用。通过这个流程,你将掌握 Ansible 的核心概念、Inventory 管理、Playbook 编写,以及如何将 Ansible 与 Docker 结合,实现从基础设施准备到应用上线的全流程自动化。学完后,你可以将此模式扩展到更复杂的场景,如多环境部署、服务编排和持续集成。
1. 理解自动化运维的核心:Ansible 与 Docker 的角色
在深入安装和操作之前,必须先厘清 Ansible 和 Docker 在自动化运维体系中各自扮演的角色以及它们如何协同工作。混淆两者的职责是初学者常见的误区。
1.1 Ansible:无代理的配置管理与任务编排器
Ansible 的核心价值在于“简单”和“无代理”。它通过 SSH(Linux/Unix)或 WinRM(Windows)协议连接到目标主机,将模块(Module)推送到远端执行,无需在目标主机上安装额外的客户端守护进程。一个 Ansible 控制节点可以管理成千上万台主机。
它的主要工作模式包括:
- Ad-Hoc 命令:用于执行一次性任务,例如检查一组服务器的磁盘使用情况:
ansible all -m shell -a "df -h"。 - Playbook:Ansible 的脚本,使用 YAML 格式编写。它将一系列任务(Task)组织成剧本(Play),描述在哪些主机(Hosts)上以什么身份(become)执行什么操作。Playbook 是实现复杂、可重复自动化流程的标准方式。
在本文的上下文中,Ansible 将承担两个核心职责:第一,作为“安装器”,在所有目标服务器上自动化安装 Docker 引擎;第二,作为“部署器”,在已经安装了 Docker 的服务器上,执行docker run等命令来部署和管理容器。
1.2 Docker:应用容器化与运行时环境
Docker 解决了“在我的机器上能跑,为什么到服务器上就不行”的环境一致性问题。它将应用代码、运行时、系统工具、系统库和设置打包成一个轻量级、可移植的容器镜像。这个镜像可以在任何安装了 Docker 引擎的环境中运行,保证环境完全一致。
在自动化运维流程中,Docker 通常处于 Ansible 的下游:
- 环境准备阶段:Ansible 确保所有目标服务器都安装了正确版本的 Docker 引擎。
- 应用部署阶段:Ansible 从镜像仓库拉取指定的 Docker 镜像,并以定义的参数(端口、卷、环境变量等)运行容器。
1.3 协同工作流:从零到容器化应用上线
两者的协作构成了一个清晰的自动化流水线,下图展示了从零开始到应用上线的核心步骤与工具分工:
flowchart TD A[准备控制节点与主机清单] --> B[Ansible: 通过SSH连接被管节点] B --> C[Ansible Playbook<br>执行系统初始化任务] C --> D[Ansible Playbook<br>在所有节点安装Docker] D --> E[被管节点环境就绪<br>具备Docker运行时] E --> F[Ansible Playbook<br>拉取镜像并运行容器] F --> G[完成<br>容器化应用上线]这个流程体现了基础设施即代码(IaC)的思想,所有步骤都可以通过版本控制的 Ansible Playbook 来管理和重复执行。
2. 环境准备与规划
在开始编写任何自动化脚本之前,规划好实验环境是成功的第一步。一个清晰的环境规划能避免后续的许多网络和权限问题。
2.1 实验环境架构
我们假设一个最简单的实验环境,包含1台控制节点和2台被管节点(可以是虚拟机或云服务器)。
- 控制节点:需要安装 Ansible 的机器。它将是我们的“指挥中心”。
- 系统:Ubuntu 22.04 / CentOS 8 / Rocky Linux 8(任选其一)
- 主机名:
ansible-ctrl - IP:
192.168.1.10
- 被管节点1:我们将通过 Ansible 管理的第一台服务器。
- 系统:Ubuntu 22.04
- 主机名:
web-server-01 - IP:
192.168.1.11
- 被管节点2:我们将通过 Ansible 管理的第二台服务器。
- 系统:CentOS 8
- 主机名:
db-server-01 - IP:
192.168.1.12
注意:在实际操作中,请将 IP 地址替换为你自己环境的真实地址。确保所有机器之间网络互通,并且控制节点可以通过 SSH 连接到被管节点。
2.2 前置条件检查清单
在控制节点上执行以下检查,确保基础环境就绪:
- Python 环境:Ansible 本身由 Python 编写,控制节点需要 Python 3.8 或更高版本。
# 在控制节点上检查 python3 --version - SSH 互通:这是 Ansible 工作的基础。确保从控制节点可以免密 SSH 登录到所有被管节点。
- 在控制节点生成 SSH 密钥对(如果还没有):
ssh-keygen -t rsa -b 4096 -C “ansible-control” # 一路回车即可 - 将公钥分发到每一台被管节点:
ssh-copy-id root@192.168.1.11 # 输入被管节点密码 ssh-copy-id root@192.168.1.12 # 输入被管节点密码 - 测试免密登录:
ssh root@192.168.1.11 “hostname” # 应返回 web-server-01 ssh root@192.168.1.12 “hostname” # 应返回 db-server-01
- 在控制节点生成 SSH 密钥对(如果还没有):
- 权限:本文示例使用
root用户进行 SSH 连接和提权操作,这简化了学习过程。在生产环境中,强烈建议创建一个具有sudo权限的专用运维账户,并在 Ansible 中配置become方法来提权,遵循最小权限原则。
3. 在控制节点安装与配置 Ansible
Ansible 的安装非常简单,特别是在基于 RPM 或 DEB 包管理的系统上。
3.1 在 Ubuntu/Debian 控制节点上安装
对于 Ubuntu 22.04,可以通过系统的apt包管理器安装。
# 更新软件包索引 sudo apt update # 安装软件属性通用包(为添加PPA可能需要) sudo apt install -y software-properties-common # 添加Ansible官方PPA(可选,但通常能获得较新版本) sudo add-apt-repository --yes --update ppa:ansible/ansible # 安装Ansible sudo apt install -y ansible3.2 在 CentOS/RHEL/Rocky Linux 控制节点上安装
对于 CentOS 8 或 Rocky Linux 8,需要先启用 EPEL 仓库,然后通过dnf安装。
# 安装EPEL仓库 sudo dnf install -y epel-release # 更新元数据缓存 sudo dnf makecache # 安装Ansible sudo dnf install -y ansible3.3 验证安装与基础配置
安装完成后,进行基本验证和配置。
验证安装:
ansible --version此命令会输出 Ansible 的版本、可执行文件路径和配置路径。确认版本在 2.9 以上即可。
理解 Ansible 配置文件: Ansible 的配置文件查找顺序为:
ANSIBLE_CONFIG环境变量指定的文件./ansible.cfg(当前目录)~/.ansible.cfg(用户家目录)/etc/ansible/ansible.cfg(系统全局) 我们创建一个项目专用的配置文件,这样不会影响系统全局设置。
# 创建一个项目目录 mkdir ~/ansible-docker-demo && cd ~/ansible-docker-demo # 创建并编辑ansible.cfg cat > ansible.cfg << ‘EOF‘ [defaults] # 指定默认的Inventory文件路径 inventory = ./inventory # 禁用首次连接时的主机密钥检查(仅限实验环境!) host_key_checking = False # 设置远程用户,根据你的环境修改 remote_user = root # 设置默认的become(提权)方式为sudo become = True become_method = sudo # become_user = root # 默认就是root,可省略 # 设置SSH连接超时和重试 timeout = 30 retries = 3 EOF生产环境警告:
host_key_checking = False会跳过 SSH 主机密钥验证,存在安全风险,仅用于实验或受信内网环境。生产环境应设置为True并妥善管理已知主机密钥。配置 Inventory(主机清单): Inventory 文件定义了 Ansible 管理哪些主机,以及如何将它们分组。创建
inventory文件:# ~/ansible-docker-demo/inventory # 定义被管节点,使用IP或域名,并指定连接变量 [web_servers] 192.168.1.11 ansible_user=root [db_servers] 192.168.1.12 ansible_user=root # 定义一个总组,包含所有服务器 [all_servers:children] web_servers db_servers # 为所有主机设置通用变量(可选) [all_servers:vars] # ansible_connection=ssh # 默认就是ssh # 可以在这里设置时区、yum/apt源等通用配置这个清单将我们的两台服务器分别归入
web_servers和db_servers组,并创建了一个父组all_servers。测试连接: 使用
ping模块测试 Ansible 是否能与被管节点正常通信。# 测试所有主机 ansible all -m ping # 测试web_servers组 ansible web_servers -m ping # 测试单台主机 ansible 192.168.1.11 -m ping如果一切正常,你会看到类似以下的成功输出,其中
“ping”: “pong”是关键:192.168.1.11 | SUCCESS => { “changed”: false, “ping”: “pong” } 192.168.1.12 | SUCCESS => { “changed”: false, “ping”: “pong” }
4. 编写 Playbook 自动化安装 Docker
现在,我们将使用 Ansible Playbook 这个强大的工具,来自动化地在所有被管节点上安装 Docker。我们将编写一个名为install_docker.yml的 Playbook。
4.1 Playbook 结构解析
一个 Playbook 包含一个或多个“Play”。每个 Play 针对一组主机,执行一系列“Task”。每个 Task 调用一个 Ansible 模块。
创建install_docker.yml文件:
# ~/ansible-docker-demo/install_docker.yml --- - name: 在所有服务器上安装并配置 Docker hosts: all_servers # 目标主机组,对应inventory中的定义 become: yes # 告诉Ansible以sudo权限运行任务 vars: # 定义变量,使Playbook更灵活 docker_users: [] # 可以添加需要加入docker组的用户,例如 [‘appuser‘] tasks: # 任务列表开始 - name: 为Ubuntu系统安装依赖包 apt: name: - apt-transport-https - ca-certificates - curl - software-properties-common - gnupg - lsb-release state: present update_cache: yes when: ansible_os_family == “Debian“ # 仅当系统是Debian/Ubuntu时执行 - name: 为CentOS/RHEL系统安装依赖包 yum: name: - yum-utils - device-mapper-persistent-data - lvm2 state: present when: ansible_os_family == “RedHat“ # 仅当系统是RedHat/CentOS/Rocky时执行 - name: 为Ubuntu添加Docker官方GPG密钥 apt_key: url: https://download.docker.com/linux/ubuntu/gpg state: present when: ansible_os_family == “Debian“ - name: 为Ubuntu添加Docker稳定版仓库 apt_repository: repo: “deb [arch=amd64] https://download.docker.com/linux/ubuntu {{ ansible_distribution_release }} stable“ state: present update_cache: yes when: ansible_os_family == “Debian“ - name: 为CentOS/RHEL添加Docker官方仓库 yum_repository: name: docker-ce-stable description: “Docker CE Stable“ baseurl: https://download.docker.com/linux/centos/$releasever/$basearch/stable gpgcheck: yes gpgkey: https://download.docker.com/linux/centos/gpg enabled: yes when: ansible_os_family == “RedHat“ - name: 安装Docker引擎、客户端及容器运行时 package: name: - docker-ce - docker-ce-cli - containerd.io - docker-compose-plugin # Docker Compose V2 (作为插件) state: present # 注意:对于RedHat系,包名可能略有不同,但docker-ce是通用的。 - name: 确保Docker服务已启动并开机自启 systemd: name: docker state: started enabled: yes - name: 将指定用户加入docker组(避免每次使用sudo) user: name: “{{ item }}“ groups: docker append: yes loop: “{{ docker_users }}“ # 如果docker_users变量为空列表,此任务将被跳过 # 生产环境建议创建一个专用用户并加入docker组 - name: 验证Docker安装 command: docker --version register: docker_version_result # 将命令输出注册到一个变量中 changed_when: false # 此命令不会改变系统状态,所以changed状态设为false - name: 打印Docker版本信息 debug: msg: “Docker installed successfully: {{ docker_version_result.stdout }}“4.2 关键模块与参数详解
apt/yum/package模块:用于管理软件包。state: present确保安装。update_cache: yes在操作前更新仓库缓存(类似apt update或yum makecache)。apt_key与apt_repository模块:Ubuntu 系统专用,用于管理 APT 仓库的 GPG 密钥和仓库源。yum_repository模块:RedHat 系统专用,用于管理 YUM/DNF 仓库。systemd模块:管理系统服务。state: started确保服务运行,enabled: yes确保开机自启。when语句:这是 Playbook 的条件判断,让任务只在满足条件的主机上执行。ansible_os_family是一个 Ansible 收集的系统信息事实(Fact),非常有用。register与debug:register将一个任务的输出保存到变量中,debug模块可以打印变量或自定义信息,用于调试和输出结果。loop:用于循环执行任务。这里循环遍历docker_users变量列表中的每个用户。
4.3 执行 Playbook 并验证
在控制节点的项目目录下运行 Playbook:
cd ~/ansible-docker-demo # 使用 -v 参数可以输出更详细的信息,-vvv 更详细 ansible-playbook install_docker.yml执行过程会显示每个任务的执行状态(ok,changed,failed)。如果一切顺利,最后会看到PLAY RECAP,所有任务都应该是ok=数字 changed=数字 unreachable=0 failed=0。
手动验证 Docker 是否安装成功:
# 使用Ad-Hoc命令在所有被管节点上运行 docker --version ansible all_servers -m command -a “docker --version“ # 或者检查Docker服务状态 ansible all_servers -m systemd -a “name=docker state=started“5. 使用 Ansible 部署容器化应用
Docker 环境就绪后,我们就可以用 Ansible 来部署应用了。这里以一个最基础的 Nginx 容器为例,演示如何拉取镜像、运行容器并暴露端口。
5.1 编写应用部署 Playbook
创建deploy_nginx.yml文件:
# ~/ansible-docker-demo/deploy_nginx.yml --- - name: 在Web服务器组部署Nginx容器 hosts: web_servers # 这次只针对web服务器组 become: yes vars: nginx_container_name: “my-nginx“ nginx_host_port: 8080 # 映射到宿主机的端口 nginx_container_port: 80 # 容器内部的端口 tasks: - name: 从Docker Hub拉取最新的Nginx镜像 docker_image: name: nginx tag: latest source: pull # docker_image模块用于管理镜像 - name: 确保Nginx容器正在运行 docker_container: name: “{{ nginx_container_name }}“ image: “nginx:latest“ state: started # started 表示运行,absent 表示删除,stopped 表示停止 restart_policy: unless-stopped # 重启策略,除非手动停止,否则总是重启 ports: - “{{ nginx_host_port }}:{{ nginx_container_port }}“ # 端口映射 宿主机端口:容器端口 volumes: - “/etc/localtime:/etc/localtime:ro“ # 挂载宿主机时间,保持容器时间一致 # 还可以定义 environment, networks 等参数 register: container_result - name: 打印容器运行信息 debug: msg: “Nginx container ‘{{ nginx_container_name }}‘ is running on port {{ nginx_host_port }}.“5.2 核心模块:docker_container
docker_container模块是 Ansible 管理 Docker 容器的核心,它封装了docker run,docker stop,docker rm等命令的功能。
state: started:这是幂等性操作的关键。如果容器不存在,则创建并启动它;如果容器存在但已停止,则启动它;如果容器已在运行,则不做任何改变。这符合自动化运维的期望。restart_policy:建议设置为unless-stopped或always,确保容器在宿主机重启后能自动恢复。ports:定义端口映射列表。格式为“HOST_PORT:CONTAINER_PORT”或“HOST_IP:HOST_PORT:CONTAINER_PORT”。volumes:定义数据卷或目录挂载列表。格式为“HOST_PATH:CONTAINER_PATH:MODE”。上例中:ro表示只读。
5.3 执行部署与访问验证
运行部署 Playbook:
ansible-playbook deploy_nginx.yml验证容器是否运行:
# 在控制节点上检查web服务器上的容器 ansible web_servers -m shell -a “docker ps | grep nginx“ # 或者直接访问Nginx服务 # 使用curl命令测试(假设web服务器IP是192.168.1.11) curl -I http://192.168.1.11:8080如果看到返回HTTP/1.1 200 OK,说明 Nginx 容器已经成功部署并通过 Ansible 对外提供服务。
6. 进阶:编写通用角色与变量管理
上面的 Playbook 已经可以工作,但为了更好的可维护性和复用性,Ansible 推荐使用“角色”(Role)来组织代码。角色是一种将 Playbook 按功能(如安装 Docker、部署 Nginx)拆分为独立、可复用组件的方式。
6.1 创建角色目录结构
Ansible 提供了命令来初始化标准角色结构:
cd ~/ansible-docker-demo # 创建名为common和nginx的角色 ansible-galaxy init roles/common ansible-galaxy init roles/nginx这会创建如下目录结构:
roles/ ├── common/ │ ├── defaults/ # 角色默认变量 (低优先级) │ ├── files/ # 静态文件 │ ├── handlers/ # 处理器 (用于重启服务等) │ ├── meta/ # 角色依赖信息 │ ├── tasks/ # 主任务文件 │ ├── templates/ # Jinja2模板文件 │ └── vars/ # 角色变量 (高优先级) └── nginx/ └── ... (类似结构)6.2 重构 Docker 安装任务为角色
将install_docker.yml中的任务移动到角色中。
- 定义角色变量(
roles/common/defaults/main.yml):# 角色默认变量,可以被playbook中的变量覆盖 docker_users: [] docker_version: “latest“ # 可以指定版本,如 “20.10“ docker_compose_version: “v2“ # 使用docker-compose-plugin - 编写角色任务(
roles/common/tasks/main.yml):# 将之前install_docker.yml中的tasks部分拆分并优化后放在这里 - name: 安装系统依赖 (Ubuntu) apt: pkg: - apt-transport-https - ca-certificates - curl - software-properties-common - gnupg - lsb-release state: present update_cache: yes when: ansible_os_family == “Debian“ tags: docker_install - name: 安装系统依赖 (CentOS) yum: name: - yum-utils - device-mapper-persistent-data - lvm2 state: present when: ansible_os_family == “RedHat“ tags: docker_install # ... 后续任务(添加仓库、安装包、启动服务等)也移入此文件,并使用变量 {{ docker_version }} 等 - 创建使用角色的 Playbook(
site.yml):
现在,要执行完整的自动化流程,只需要运行:# ~/ansible-docker-demo/site.yml --- - name: 为所有服务器配置基础环境并安装Docker hosts: all_servers become: yes roles: - role: common vars: docker_users: [‘deploy-user‘] # 覆盖角色默认变量 - name: 在Web服务器部署应用 hosts: web_servers become: yes roles: - nginx # 调用nginx角色,其任务在roles/nginx/tasks/main.yml中定义ansible-playbook site.yml
6.3 使用变量文件分离配置
对于不同环境(开发、测试、生产),配置(如端口、镜像版本)可能不同。可以将变量定义在外部 YAML 文件中。
- 创建
group_vars/和host_vars/目录:mkdir -p ~/ansible-docker-demo/group_vars mkdir -p ~/ansible-docker-demo/host_vars - 为
web_servers组创建变量文件 (group_vars/web_servers.yml):# 这些变量会自动应用到web_servers组的所有主机 nginx_container_name: “prod-nginx“ nginx_host_port: 80 # 生产环境用80端口 nginx_image_tag: “1.23-alpine“ # 使用特定版本和更小的Alpine镜像 - 在
roles/nginx/tasks/main.yml中,直接引用这些变量,如{{ nginx_host_port }}。Ansible 会自动加载对应组的变量。
7. 常见问题与排查路径
即使按照步骤操作,也可能遇到问题。以下是基于此实战场景的常见问题排查清单。
| 问题现象 | 可能原因 | 检查与解决步骤 |
|---|---|---|
Ansibleping模块失败,提示UNREACHABLE | 1. 网络不通或防火墙阻断 SSH。 2. SSH 免密登录未配置成功。 3. Inventory 中主机 IP 或用户名错误。 4. 控制节点无法解析主机名。 | 1. 使用ping命令测试网络连通性。2. 手动 SSH 登录测试: ssh <user>@<host>。3. 检查 ~/.ssh/authorized_keys文件权限(应为600)。4. 检查 Inventory 文件语法和变量。 |
Ansibleping模块失败,提示FAILED,错误信息与 Python 相关 | 目标主机上没有安装 Python,或者 Python 路径不对。 | 1. 在被管节点上安装 Python:apt install python3或yum install python3。2. 在 Inventory 中为该主机设置 ansible_python_interpreter=/usr/bin/python3。 |
| 执行 Playbook 时任务卡住或超时 | 1. 网络慢,下载包超时。 2. 被管节点需要交互式输入(如 apt/yum 确认)。 3. 任务本身执行时间长。 | 1. 在ansible.cfg中增加timeout值。2. 在 apt/yum 任务中添加 -y参数(Ansible 模块通常自动处理)。3. 使用 -T参数为单个 Playbook 运行设置超时:ansible-playbook -T 300 playbook.yml。 |
| Docker 安装任务在 CentOS 上失败,提示找不到包 | 1. EPEL 仓库未启用或 Docker CE 仓库未正确添加。 2. 系统版本与仓库不匹配(如 CentOS 8 已停止维护)。 | 1. 检查yum_repository任务是否成功执行,查看/etc/yum.repos.d/下是否有docker-ce.repo。2. 对于 CentOS 8,可能需要切换源或使用 Podman。考虑使用 Rocky Linux 8 替代。 |
docker_container任务失败,提示Error: No such image | docker_image拉取镜像失败或尚未执行。 | 1. 确保网络可以访问 Docker Hub 或配置的镜像仓库。 2. 检查 docker_image任务的name和tag是否正确。3. 为 docker_image任务添加ignore_errors: yes并配合failed_when进行更精细的错误处理。 |
| 容器启动后无法通过宿主机 IP 和端口访问 | 1. 宿主机防火墙未开放端口。 2. Docker 容器端口映射错误。 3. 容器内应用未监听正确端口。 | 1. 在宿主机上运行sudo firewall-cmd --list-ports(firewalld) 或sudo iptables -L -n检查。2. 运行 docker ps查看端口映射列(PORTS)。3. 进入容器检查应用日志: docker logs <container_name>。 |
| Playbook 执行成功,但实际状态未改变(非幂等) | 任务设计有缺陷,未使用 Ansible 的幂等模块或command/shell模块未正确处理。 | 1. 优先使用yum,apt,systemd,docker_container(state: started) 等声明式、幂等的模块。2. 如果必须用 command/shell,使用creates或removes参数,或通过register和changed_when手动控制状态判断。 |
通用排查命令:
- 增加输出详细程度:
ansible-playbook -v playbook.yml(-vvv输出最详细)。 - 检查 Ansible 收集的事实:
ansible all -m setup,查看ansible_os_family,ansible_distribution等信息是否正确。 - 在特定主机上执行 Ad-Hoc 命令调试:
ansible <host> -m shell -a “<your_command>”。 - 查看 Docker 相关日志:在被管节点上运行
sudo journalctl -u docker或docker logs <container_id>。
8. 生产环境最佳实践与扩展方向
将实验环境中的模式应用到生产环境,需要考虑更多关于安全、稳定性和可维护性的因素。
8.1 安全加固清单
- 使用专用运维账户:不要使用
root用户直接 SSH。创建一个如ansible或deploy的专用账户,赋予其必要的sudo权限(通过/etc/sudoers.d/精细控制),并在 Inventory 中配置ansible_user和ansible_become_password(建议使用 Ansible Vault 加密密码)。 - 启用 SSH 密钥验证并禁用密码登录:确保所有被管节点 SSH 配置中
PasswordAuthentication设置为no。 - 管理敏感数据:使用Ansible Vault加密密码、API 密钥等敏感变量。
# 加密一个变量文件 ansible-vault encrypt secrets.yml # 运行Playbook时提供密码 ansible-playbook site.yml --ask-vault-pass # 或通过密码文件 ansible-playbook site.yml --vault-password-file .vault_pass.txt - 限制 Docker 权限:避免将非必要用户加入
docker组,因为该组权限等同于root。考虑使用sudo来运行特定的 Docker 命令。 - 使用私有镜像仓库:生产环境应从私有仓库(如 Harbor, Nexus)拉取镜像,而非 Docker Hub,以便进行安全扫描和版本控制。
8.2 可维护性与效率提升
- 使用动态 Inventory:当服务器数量多或频繁变动时,手动维护静态 Inventory 文件效率低下。可以编写脚本从云平台 API、CMDB 或数据库中动态获取主机列表。Ansible 支持从脚本输出的 JSON 格式中读取 Inventory。
- 利用 Tags 控制执行流程:为 Playbook 中的任务打上标签,可以只运行特定部分。
运行:tasks: - name: 安装包 yum: name=httpd state=present tags: install - name: 启动服务 systemd: name=httpd state=started tags: config,serviceansible-playbook site.yml --tags “install”或--skip-tags “config”。 - 配置回调与通知:使用
handlers来处理任务结果。例如,只有在配置文件真正被修改后,才触发重启服务的 Handler。 - 集成 CI/CD 流水线:将 Ansible Playbook 放入 Git 仓库,通过 Jenkins、GitLab CI 或 GitHub Actions 等工具,在代码推送后自动执行测试环境的部署。
8.3 扩展方向
掌握了 Ansible + Docker 的基础自动化后,可以进一步探索以下方向,构建更强大的运维体系:
- 容器编排:当需要管理多个相互关联的容器时,Docker Compose 或 Kubernetes 是更佳选择。Ansible 同样可以用于部署和配置 Kubernetes 集群(如使用
kubespray项目),或通过k8s模块管理 Kubernetes 资源。 - 配置管理复杂化:对于更复杂的配置(如 Nginx 虚拟主机、MySQL 配置文件),使用
template模块配合 Jinja2 模板,根据变量动态生成配置文件。 - 监控与日志集成:在 Playbook 中部署 Prometheus Node Exporter、cAdvisor(用于容器监控)和 ELK/EFK 栈的客户端,实现基础设施和应用的监控与日志集中收集。
- 网络设备自动化:虽然本文聚焦服务器,但 Ansible 也支持通过
network_cli等连接插件管理网络设备(交换机、路由器)。这与服务器自动化理念相通,但模块和连接方式不同。
自动化运维是一个持续迭代的过程。从用 Ansible 执行一条 Ad-Hoc 命令开始,到编写一个完整的 Playbook 管理一类服务,再到用角色和变量管理复杂的多环境部署,每一步都在提升效率与规范性。本次实战提供了一个坚实的起点,关键在于将学到的模式应用到实际工作中,并持续优化你的“基础设施即代码”仓库。
🚀 30+款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度