告别手动操作:用 Ansible 统一管理你的 Ubuntu 服务器集群

Ansible 是一款开源的自动化运维工具,可用于配置管理、应用部署、任务自动化等。它基于 SSH 协议,无需在被控端安装客户端,非常适合轻量级、安全的批量操作。

本文将演示如何在 Ubuntu 主机(控制节点) 上使用 Ansible 对 另外两台 Ubuntu 主机(被控节点) 进行统一管理,共涉及 3 台机器

核心定义与架构
  • 开源属性 :由Michael DeHaan于2012年开发,2015年被Red Hat收购,是**无代理(Agentless)**的自动化工具,通过SSH/WinRM协议与受控节点通信。
  • 技术栈:基于Python开发,集成Puppet、Chef等工具优势,支持Linux、Windows、网络设备等多平台管理。
  • 架构特点
    • 控制节点(Control Node):执行Ansible命令或Playbook,需安装Python和Ansible软件。
    • 受控节点(Managed Nodes):无需安装客户端,仅需开启SSH服务并配置免密登录。
    • 模块化设计 :通过模块(如copyserviceyum)实现具体操作,支持自定义模块开发。
核心功能与场景
  • 批量操作
    • Ad-Hoc命令 :临时执行单条任务(如ansible all -m ping测试连通性)。
    • Playbook编排:通过YAML文件定义多任务流程(如部署Nginx、配置防火墙)。
  • 配置管理
    • 统一管理主机清单(Inventory),支持分组、变量定义(如[web] 192.168.1.10 http_port=80)。
    • 模板引擎(Jinja2)动态生成配置文件(如Nginx配置)。
  • 应用部署
    • 自动化安装软件包(如ansible web -m yum -a "name=nginx state=present")。
    • 服务启停与状态管理(如ansible db -m service -a "name=mysql state=started")。
  • 高级特性
    • Roles :模块化组织Playbook,实现代码复用(如roles/nginx/tasks/main.yml)。
    • Vault:加密敏感数据(如密码、API密钥)。
    • 动态Inventory:集成云平台(AWS、Azure)或CMDB自动生成主机列表。
安装与配置
  • 安装方式
    • Linux :通过包管理器(如yum install ansible)或pip安装。
    • Windows:使用WSL或直接安装,需配置PowerShell远程管理。
  • 关键配置
    • 主机清单/etc/ansible/hosts或自定义文件,定义主机分组与变量。
    • SSH免密 :通过ssh-keygen生成密钥,使用ssh-copy-id分发公钥。
    • 配置文件ansible.cfg调整并发数、超时时间、日志路径等参数。
对比SaltStack
  • 架构差异
    • Ansible:无代理架构,依赖SSH,适合中小规模或快速部署场景。
    • SaltStack:基于Minion代理,支持事件驱动,适合大规模高并发场景。
  • 学习曲线
    • Ansible的YAML Playbook更易上手,适合DevOps初学者。
    • SaltStack的Jinja模板和状态系统更灵活,适合复杂环境。

一、实验环境说明

主机角色 IP 地址 主机名 系统版本
控制节点 192.168.22.103 ansible Ubuntu 22.04
被控节点1 192.168.22.131 node1 Ubuntu 22.04
被控节点2 192.168.22.215 node2 Ubuntu 22.04

二、在控制节点安装 Ansible

  • 更新系统软件包:

    sudo apt update

  • 安装 Ansible:

    sudo apt install -y ansible

  • 验证安装:

    ansible --version

三、配置 SSH 免密登录

为实现自动化,控制节点需能无密码 SSH 登录到被控节点。

  • 在控制节点生成 SSH 密钥:

    ssh-keygen -t rsa -b 4096

复制代码

用户名为 xxx,请根据实际情况修改。

四、配置 Ansible Inventory

创建一个 inventory 文件来定义被控主机。

复制代码
mkdir ~/ansible-demo && cd ~/ansible-demo

创建文件 inventory.ini

复制代码
[webservers]
node1 ansible_host=192.168.22.131 ansible_user=xxx
node2 ansible_host=192.168.22.215 ansible_user=xxx

[webservers] 是主机组名,可自定义

五、测试连通性

使用 ping 模块测试 Ansible 是否能连接到所有节点:

复制代码
ansible -i inventory.ini webservers -m ping

输出类似:

六、编写并运行 Playbook

创建一个简单的 Playbook,用于在所有被控节点上安装 nginx 并启动服务。

创建文件 install_nginx.yml

复制代码
---
- name: Install and start Nginx on webservers
  hosts: webservers
  become: yes
  tasks:
    - name: Update apt cache
      apt:
        update_cache: yes

    - name: Install nginx
      apt:
        name: nginx
        state: present

    - name: Ensure nginx is running
      service:
        name: nginx
        state: started
        enabled: yes

运行 Playbook:

复制代码
ansible-playbook -i inventory.ini install_nginx.yml

如果执行失败可能是权限问题,需要提权

✅ 解决方法(二选一)
✅ 方法一:【推荐】在 node1 和 node2 上为用户配置 免密 sudo

登录到 node1

复制代码
ssh xxx@192.168.22.131

执行(替换 xxx 为你的实际用户名):

复制代码
echo "xxx ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/xxx

同样操作 node2

复制代码
ssh xxx@192.168.22.215
echo "xxx ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/xxx

返回控制机,直接运行 playbook

复制代码
ansible-playbook -i inventory.ini install_nginx.yml
✅ 方法二:运行时手动输入 sudo 密码(临时用)

如果你不想改 sudo 配置 ,可以用 -K 参数:

复制代码
ansible-playbook -i inventory.ini install_nginx.yml -K

需要输入 node1 和 node2 上用户 xxx 的 sudo 密码

⚠️ 注意:此方法要求所有主机的 sudo 密码完全一致。如果密码不同,会有一台失败。

成功后,访问 http://192.168.22.131http://192.168.22.215 可以看到 Nginx 欢迎页。

七、扩展建议

  • 使用 group_varshost_vars 管理不同主机的变量。
  • 结合 Roles 实现更复杂的项目结构。
  • 使用 Vault 加密敏感信息。
  • 集成 CI/CD 工具实现自动化部署。

通过本次在 Ubuntu 环境中使用 Ansible 管理三台主机的实践,我们不仅完成了 SSH 免密登录配置、Inventory 编写、Playbook 编排等基础操作,还深入理解了 become 权限机制与常见错误的排查方法。自动化运维并非遥不可及------只需几步配置,就能告别重复的手动操作,让部署更高效、更可靠。

相关推荐
搞科研的小刘选手5 分钟前
【高届数传感机电会议】第十二届传感器、机电一体化和自动化系统国际学术研讨会(ISSMAS 2026)
运维·人工智能·自动化·控制·传感器·传感·机电
楼兰公子22 分钟前
读取rpi摄像头
linux·服务器·算法
李景琰27 分钟前
Debian12安装配置Mqtt之EMQX
linux·运维·服务器
SimLine芯见27 分钟前
专为空管环境打造的KVM切换器,满足主备自动化高速无缝切换需求
运维·自动化
不做无法实现的梦~34 分钟前
PX4 机载电脑 Linux 环境安装、串口、网络、ROS 完整配置
linux·运维·网络
嵌入式×边缘AI:打怪升级日志35 分钟前
嵌入式Linux开发(了解交叉编译工具链的组成)
java·linux·运维
IT界的老黄牛38 分钟前
停电后 Redis 集群两节点起不来:fix 完还报 Bad file format?多部分 AOF 修复的正确姿势
运维·redis·缓存
接着奏乐接着舞39 分钟前
3D Tiles tileset.jso 数据格式
运维·服务器·3d
李小白2020020241 分钟前
RK3568 linux6.1 死机
linux·运维·服务器
FreeGo~44 分钟前
Linux 系统编程 进程篇 (五)
java·linux·服务器