自动化运维神器Ansible|编写Playbook一键部署Docker环境

前言

日常运维工作里,经常会面对一台甚至多台Linux服务器,每次新装机器都要手动一步步安装Docker组件,配置镜像加速、设置开机自启、调整系统内核参数。单台服务器尚且还好,一旦面对集群多节点环境,逐台登录服务器敲命令,不仅枯燥重复,还极易出现版本不一致、配置遗漏、手输命令出错等问题,耗费大量时间精力。

Ansible是当下非常流行的无Agent自动化运维工具,不需要在被管控服务器安装任何客户端,仅依靠SSH协议就可以完成远程管控。我们可以将Docker全套安装配置流程编写为Playbook剧本,把安装软件、修改配置、启动服务、优化系统参数等全部操作固化下来。

后续不管是单台机器调试,还是几十台服务器批量部署,只需要执行一条命令,就能全自动完成整套Docker环境搭建,保证所有服务器配置统一标准,极大减少重复手工操作,规避人为失误。 本文将围绕Ansible Playbook实战,手把手带你编写可直接运行的剧本文件,实现一键自动化部署Docker完整环境,帮你简化运维流程,提升服务器交付效率。

image-20260806160737677

1.为什么使用ansible?

Ansible是一款开源、无Agent架构的自动化运维工具,定位是服务器批量自动化管理工具,主打简单易用、无需安装客户端、Playbook剧本编排。

✨核心特点

  1. 部署架构与体验

    依托SSH协议完成远程管控,被管理服务器无需安装任何代理客户端,只要开启 SSH 服务即可使用;YAML格式Playbook剧本语法通俗易懂,阅读编写门槛低,便于团队维护。

  2. 配置标准化可复用

    把软件安装、目录创建、修改配置、服务启停等操作编写为Playbook剧本,一次编写,多次执行;单台调试、集群批量部署都可以复用,保证多台服务器配置完全一致。

  3. 丰富内置模块

    自带大量成熟运维模块,软件安装、文件同步、用户管理、服务管理都可以直接调用,不用编写复杂shell脚本逻辑,减少shell脚本的易错问题。

  4. 执行模式

    支持单机执行、多台主机批量执行;具备幂等特性,重复执行Playbook不会重复修改已经符合预期的环境,不用担心重复执行带来破坏。

🔴适用场景

  • 服务器初始化、批量部署Docker等运行环境
  • 集群多节点统一配置、分发配置文件
  • 软件批量安装升级、服务统一启停管理
  • 运维环境标准化交付,减少人工敲命令失误

📦技术栈

基于Python开发,远程通信依靠SSH;核心组件:Inventory主机清单、Playbook剧本、内置模块,推荐直接在控制节点安装Ansible进行管理。

和Shell脚本简单对比

  • Shell脚本:执行原始命令,逻辑需要自己手写,缺少幂等性,多机器批量执行需要额外处理,配置一致性需要人为保障。
  • Ansible Playbook:YAML可读性强,自带大量模块,天然支持幂等;原生支持批量主机;需要控制节点安装Ansible,被管控端仅需SSH。

2.在你的虚拟机上安装ansiable

2.1 什么是Ansible?

Ansible是一个开源的 自动化运维工具,由Red Hat赞助开发,用于实现:

  • 配置管理(Configuration Management)
  • 应用部署(Application Deployment)
  • 任务自动化(Task Automation)
  • IT编排(Orchestration)

它最大的特点是:简单、无代理、基于SSH、使用YAML语法。

2.2 Ansible的核心作用

  1. 批量执行命令

无需逐台登录服务器,一条命令可在成百上千台机器上同时运行:

  1. 统一配置管理

确保所有服务器的配置一致,比如:

  • 安装指定版本的软件(如 Node Exporter、Nginx)
  • 同步配置文件(如 /etc/hosts、prometheus.yml)
  • 创建用户、设置权限、管理服务状态
  • 自动化部署应用

通过 Playbook(YAML 文件)定义部署流程,一键完成复杂应用上线:

  1. 幂等性(Idempotency)

重复执行同一个 Playbook,结果始终一致——没装的会装,已装的不会重复操作,安全可靠。

  1. 无需安装客户端(Agentless)

Ansible通过SSH 与目标主机通信,只需控制机安装Ansible,被控机只要有Python 和SSH即可。

  1. 支持云和容器编排

可管理AWS、Azure、阿里云等云资源,也能操作Docker、Kubernetes。

2.3 安装ansiale

我这里是ubuntu系统,如果想使用centos可以看这边文章:别再手动操作了!我用Ansible+cpolar给飞牛OS装了个“遥控器” – cpolar 极点云官网

登录到 Ubuntu系统,并在APT命令下运行以应用更新:

sudo apt update
sudo apt upgrade -y

安装最新版本的Ansible:

apt install -y ansible

b22459cbd77b782b0540844e877693c0

安装完成后,验证ansiable版本:

ansible --version

5728544c3e02fe61e823691627fe54e0

我们查看一下,有没有启动文件:

ls /etc/ansible

我发现我这里没有,那我们手动配一下,创建ansiable文件:

mkdir -p /etc/ansible

编写hosts文件:

cat > /etc/ansible/hosts <<EOF
[local]
localhost ansible_connection=local
EOF

编写ansiable.cfg文件:

cat > /etc/ansible/ansible.cfg <<EOF
[defaults]
inventory = /etc/ansible/hosts
host_key_checking = False
remote_user = root
stdout_callback = yaml
EOF

验证是否成功:

ansible localhost -m ping

f1dff617f524f088860e1b8183ad3a93

3.配置ansiable文件搞定其他主机docker部署

3.1 编写hosts文件

确保你在playbook所在目录(假设是 /etc/ansible):

cd /etc/ansible

提前填写需要部署 Docker 的服务器 IP,支持多台机器批量部署(在hosts文件中):

  • [dbservers]
  • 方括号 [] 定义主机组名称,组名叫 dbservers,字面含义:数据库服务器组。
[dbservers]
192.168.42.146 ansible_user=root ansible_port=22 ansible_password=*****

image-20260806152842140

3.2 编写安装docker运行脚本

编写运行脚本deploy_docker.yml:

  • playbook 里写 hosts: dbservers,代表:对这个分组下面所有IP执行剧本任务
---
- name: Ansible一键部署Docker环境
  hosts: docker_group
  become: true
  tasks:
    - name: 安装yum工具依赖
      yum:
        name: yum-utils
        state: present

    - name: 添加Docker yum软件源
      yum_repository:
        name: docker-ce
        description: Docker CE stable repo
        baseurl: https://download.docker.com/linux/centos/$releasever/$basearch/stable
        gpgcheck: yes
        gpgkey: https://download.docker.com/linux/centos/gpg

    - name: 安装Docker全套组件
      yum:
        name:
          - docker-ce
          - docker-ce-cli
          - containerd.io
        state: present

    - name: 启动docker服务并设置开机自启
      systemd:
        name: docker
        state: started
        enabled: yes

    - name: 将登录用户加入docker组,免sudo操作docker
      user:
        name: "{{ ansible_user }}"
        groups: docker
        append: true

image-20260806153100270

3.3 执行Playbook命令

ansible-playbook -i hosts deploy_docker.yml

image-20260806153044481

3.4 验证是否成功

在被控机器执行:

docker -v
systemctl status docker

看到版本号、服务状态为active(running)即为部署完成。

image-20260806153509519

借助Ansible Playbook,读取hosts清单里dbservers主机组服务器,批量完成Docker环境部署、服务开机自启与权限配置;同时自动安装cpolar内网穿透,无需公网IP,即可把内网中Docker运行的各类容器服务对外暴露,实现外网远程访问内网Docker业务,把重复部署和外网访问打通全部交给自动化剧本完成。

4.安装cpolar实现随时随地开发

cpolar 可以将你本地电脑中的服务(如 SSH、Web、数据库)映射到公网。即使你在家里或外出时,也可以通过公网地址连接回本地运行的开发环境。

❤️以下是安装cpolar步骤:

官网在此:https://www.cpolar.com

使用一键脚本安装命令:

sudo curl https://get.cpolar.sh | sh

image-20250725104019896

安装完成后,执行下方命令查看cpolar服务状态:(如图所示即为正常启动)

sudo systemctl status cpolar

22e5adfaf290a17fc3384bb296055259

Cpolar安装和成功启动服务后,在浏览器上输入虚拟机主机IP加9200端口即:【http://ip:9200】访问Cpolar管理界面,使用Cpolar官网注册的账号登录,登录后即可看到cpolar web 配置界面,接下来在web 界面配置即可:

打开浏览器访问本地9200端口,使用cpolar账户密码登录即可,登录后即可对隧道进行管理。

8a6698b1bf26d64ba3645827fbfb1c29

5.配置公网地址

通过配置,你可以在本地 WSL 或 Linux 系统上运行 SSH 服务,并通过 Cpolar 将其映射到公网,从而实现从任意设备远程连接开发环境的目的。

  • 隧道名称:可自定义,本例使用了:ssh,注意不要与已有的隧道名称重复
  • 协议:tcp
  • 本地地址:22
  • 端口类型:随机临时TCP端口
  • 地区:China Top

image-20260806155646531

创建成功后,打开左侧在线隧道列表,可以看到刚刚通过创建隧道生成了公网地址,接下来就可以在其他电脑或者移动端设备(异地)上,使用任意一个地址在终端中访问即可。

  • tcp 表示使用的协议类型

  • 2.tcp.cpolar.top是 Cpolar 提供的域名

  • 15197是随机分配的公网端口号

image-20260806155804171

通过 Cpolar 提供的公网地址和端口,就可以使用ansible进行远程部署啦!

接下来我们操作一下。

修改hosts配置文件:

[dbservers]
2.tcp.cpolar.top ansible_user=root ansible_port=15197 ansible_password=***

image-20260806160126792

接下来我们执行配置文件:

ansible-playbook -i hosts deploy_docker.yml

执行成功,我们去对应主机查看docker项目是否安装成功:

image-20260806160319337

我们可以看见,目标主机已经成功安装~

6.保留固定TCP公网地址

使用cpolar为其配置TCP地址,该地址为固定地址,不会随机变化。

image-20251210160529622

选择区域和描述:有一个下拉菜单,当前选择的是“China VIP”。
右侧输入框,用于填写描述信息。
保留按钮:在右侧有一个橙色的“保留”按钮,点击该按钮可以保留所选的TCP地址。
列表中显示了一条已保留的TCP地址记录。

  • 地区:显示为“China VIP”。

  • 地址:显示为“15.tcp.cpolar.top:13633”。

    image-20251210160555284

登录cpolar web UI管理界面,点击左侧仪表盘的隧道管理——隧道列表,找到所要配置的隧道ssh,点击右侧的编辑

image-20251210160639397

修改隧道信息,将保留成功的TCP端口配置到隧道中。

  • 端口类型:选择固定TCP端口
  • 预留的TCP地址:填写保留成功的TCP地址

点击更新

image-20251210160618660

创建完成后,打开在线隧道列表,此时可以看到随机的公网地址已经发生变化,地址名称也变成了保留和固定的TCP地址。

image-20251210160652740

这样我们的ansible操作就没有任何的阻碍啦!

总结

本文主要介绍使用Ansible编写Playbook剧本批量部署Docker环境,通过主机清单定义dbservers服务器分组,可对多台主机执行自动化部署;自动配置软件源、安装Docker组件、设置服务开机自启,还可以结合cpolar内网穿透,在无公网IP条件下,将内网Docker容器服务映射到公网,实现外网远程访问,把重复的手工部署工作交给剧本执行,降低人为操作失误,有效提升运维工作效率。

感谢您对本篇文章的喜爱,有任何问题欢迎留言交流。cpolar官网-安全的内网穿透工具 | 无需公网ip | 远程访问 | 搭建网站

Share:

发表回复

目录

On Key

推荐文章