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

相关推荐
百***67032 小时前
Nginx搭建负载均衡
运维·nginx·负载均衡
梁正雄2 小时前
17、grafana安装
运维·grafana·prometheus·监控
摘星|3 小时前
架设一台NFS服务器,并按照以下要求配置
linux·运维·服务器
做运维的阿瑞3 小时前
Linux环境变量持久化完全指南
linux·运维·服务器
天才奇男子4 小时前
从零开始搭建Linux Web服务器
linux·服务器·前端
Mr_Dwj4 小时前
【运维】GNU/Linux 入门笔记
linux·运维·gnu
SHIPKING3934 小时前
【Docker安装】Windows10专业版安装教程
运维·docker·容器
Wang's Blog5 小时前
MySQL: 服务器性能优化全面指南:参数配置与数据库设计的最佳实践
服务器·数据库·mysql
顾安r5 小时前
11.14 脚本网页 迷宫逃离
服务器·javascript·游戏·flask·html