告别手动操作:用 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 权限机制与常见错误的排查方法。自动化运维并非遥不可及------只需几步配置,就能告别重复的手动操作,让部署更高效、更可靠。

相关推荐
Trouvaille ~5 分钟前
【Linux】TCP Socket编程实战(一):API详解与单连接Echo Server
linux·运维·服务器·网络·c++·tcp/ip·socket
芷栀夏13 分钟前
深度解析 CANN 异构计算架构:基于 ACL API 的算子调用实战
运维·人工智能·开源·cann
全栈工程师修炼指南22 分钟前
Nginx | stream 四层反向代理:SSL、PREREAD 阶段模块指令浅析与实践
运维·网络·网络协议·nginx·ssl
威迪斯特1 小时前
CentOS图形化操作界面:理论解析与实践指南
linux·运维·centos·组件·图形化·桌面·xserver
一方热衷.1 小时前
在线安装对应版本NVIDIA驱动
linux·运维·服务器
独自归家的兔2 小时前
ubuntu系统安装dbswitch教程 - 备份本地数据到远程服务器
linux·运维·ubuntu
m0_694845572 小时前
tinylisp 是什么?超轻量 Lisp 解释器编译与运行教程
服务器·开发语言·云计算·github·lisp
ONE_SIX_MIX2 小时前
ubuntu 24.04 用rdp连接,桌面黑屏问题,解决
linux·运维·ubuntu
龙飞052 小时前
Systemd -systemctl - journalctl 速查表:服务管理 + 日志排障
linux·运维·前端·chrome·systemctl·journalctl
*小海豚*2 小时前
在linux服务器上DNS正常,但是java应用调用第三方解析域名报错
java·linux·服务器