Ansible 介绍及安装(Ubuntu 24.04 适配版)

Ansible 到底是什么

Ansible 是一个基于 Python 开发的开源自动化工具,核心作用是把运维中的重复性工作写成文件,然后批量自动执行。它主要能干的事包括:批量系统配置、批量程序部署、批量运行命令等。

它的工作模式很简单:你在一台机器(叫 "控制节点")上装好 Ansible,写好指令(Playbook),然后 Ansible 通过 SSH 协议连到目标机器(叫 "受管节点"),把一个个小任务(叫 "模块")推送过去执行,执行完就把模块删掉。整个过程目标机器上不需要安装任何额外软件——这也是它和 Puppet、SaltStack 最大的不同。

控制节点:运行 Ansible 命令的机器,建议用 Linux 或 macOS,Windows 原生不支持做控制节点,但可以用 WSL。Python 3.8 以上就行。

受管节点:被管理的机器,Linux 走 SSH,Windows 走 WinRM。不需要装 Ansible,但一般得有 Python 环境。


优缺点

优点:

  1. 部署简单,无需 Agent:不用在每台机器上装客户端,只要 SSH 能通就能管。新机器上线直接就能纳管,省去了大批量装客户端的麻烦。

  2. 上手快:语法是 YAML,比写 Shell 脚本直观得多。运维人员不用学编程语言就能写自动化脚本。

  3. 模块丰富:官方提供了几千个模块,覆盖系统管理、云平台、网络设备等各种场景。大部分日常操作都有现成的模块可以用。

  4. 安全可控:走 SSH 协议,可以利用现有的 SSH 认证体系。没有额外开放端口,安全部门更放心。

  5. 幂等性:同一套脚本反复跑不会出问题,Ansible 会自动判断"需要做才做"。线上操作敢反复执行,不怕搞乱系统。

  6. 轻量级维护:更新时只需在操作机上进行一次更新即可,不用分发到远程。

缺点:

  1. 大规模场景下性能吃紧:Ansible 走 SSH 连接,每台机器都要建立连接,机器多了速度会明显下降。一般建议 500 台以内比较顺手,再往上就需要调优或者考虑其他方案了。在规模较大的情况下可以考虑使用 ZeroMQ 连接方式来改善执行速度。

  2. 复杂逻辑写起来费劲:Ansible 擅长描述"最终状态",但复杂的条件判断、循环嵌套写多了,Playbook 会变得臃肿难维护。

  3. 没有状态追踪:Ansible 不维护自己的状态数据库,每次执行都是重新收集信息再做判断。好处是简单,坏处是每次都要重新拉取信息,效率有损耗。


为什么大家都用它,不写 Shell 脚本了

1. 不用在目标机器上装任何东西:只要目标机能用 SSH 连上,Ansible 就能管理它。不需要预先装 agent 或客户端,省了维护成本。

2. 同一份指令跑多少次都不会出问题:Ansible 的设计是"只做需要做的事"。比如你让它"确保 Nginx 正在运行"——如果 Nginx 没启动,它就帮你启动;如果已经在跑了,它就什么都不做。

3. 配置写成文件,就是资产:Shell 脚本是面向过程的:你得把每一步的逻辑都写清楚。Ansible 是面向结果的:你只描述"最终要达到什么状态",具体的判断和执行交给它去处理。


最核心的四个概念

  • Inventory(主机清单):就是一个 IP 地址列表,告诉 Ansible 要操作哪些机器。可以按用途分组,比如 web 组、db 组。

  • Module(模块):Ansible 自带的各种"工具",每个工具做一件事。比如 copy 模块用来传文件,apt 模块(Ubuntu 下)用来装软件,service 模块用来管理服务。

  • Playbook(剧本):把多个模块组合在一起写成的文件,描述了完整的操作流程。剧本里写的是"步骤",但每个步骤描述的是"状态"而不是"过程"。

  • Connection Plugins(连接插件):Ansible 基于连接插件连接到各个主机上,负责和被管理节点实现通信。虽然默认使用 SSH,但也支持其他连接方式。

补充概念:

  • 变量:让剧本变得更灵活。同一个剧本,给不同的变量值,就能适配不同的场景。

  • 模板:用于生成配置文件,可以把模板文件里的占位符替换成实际的变量值。

  • Roles(角色):把一套完整的操作(任务、变量、模板、文件、默认配置)打成一个"包",方便复用。


Ansible 的运行原理

Ansible 的工作流程大致如下:

  1. 用户登录管理机器:通过 Ansible 剧本或者单行命令,针对业务机器组或单个机器部署任务。

  2. 管理机器读取部署任务:根据 hosts 文件中定义的业务机器组,查找对应的机器地址(IP 或域名)。

  3. 管理机下发任务:管理机通过 SSH 免密连接业务机器,下发任务。

  4. 业务机器执行任务。

  5. 业务机器将执行结果返回给 Ansible 管理机器。

执行结果的反馈颜色含义:

  • 绿色:未发生变化

  • 黄色:更改生效

  • 红色:执行错误


安装前的准备工作(Ubuntu 24.04)

在安装 Ansible 之前,建议先完成以下准备工作:

1. 主机名解析:在 /etc/hosts 中配置好所有机器的主机名和 IP 映射(所有节点均需操作)。

2. 防火墙配置(Ubuntu 默认使用 ufw):

如果你不需要防火墙,可以关闭(测试环境常用):

 sudo ufw disable

如果只想放行 SSH(生产环境推荐),则保持防火墙开启并允许 SSH:

 sudo ufw allow ssh
 sudo ufw enable

注意:Ubuntu 默认没有 SELinux,而是使用 AppArmor。一般无需关闭,若遇到权限问题可临时调整,但不建议完全禁用。

3. 时间同步:配置时间同步服务(推荐使用 systemd-timesyncd 或 chrony)。

使用 systemd-timesyncd(Ubuntu 默认):

 sudo timedatectl set-timezone Asia/Shanghai
 sudo timedatectl set-ntp true
 sudo timedatectl status

或安装 chrony 并配置阿里云 NTP 服务器:

 sudo apt update
 sudo apt install -y chrony
 sudo sed -i 's/pool.*/pool ntp.aliyun.com iburst/g' /etc/chrony/chrony.conf
 sudo systemctl restart chrony
 sudo systemctl enable chrony

4. 更新 APT 源并安装基础工具:

 sudo apt update
 sudo apt upgrade -y
 sudo apt install -y software-properties-common sshpass

5. SSH 免密登录(最关键的一步):管理端生成密钥对,把公钥拷到每台目标机器上。

在控制节点执行:

 ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -N ""

然后使用 ssh-copy-id 将公钥复制到各受管节点(替换为实际 IP):

 ssh-copy-id -o StrictHostKeyChecking=no root@目标机器IP
 ​
 # 可能存在远程机器禁止 root 登录 (管控节点设置)
 sudo vim /etc/ssh/sshd_config
 ​
 # 找到这两行
 #PasswordAuthentication yes
 #PermitRootLogin prohibit-password
 ​
 # 修改为 并去除 #
 PasswordAuthentication yes
 PermitRootLogin yes
 ​
 # 重启 SSH 服务让新设置生效
 sudo systemctl restart ssh

如果不想交互式输入密码,可以借助 sshpass(上面已安装):

 sshpass -p "你的密码" ssh-copy-id -o StrictHostKeyChecking=no -i ~/.ssh/id_rsa.pub root@目标IP

生产环境建议使用密钥认证而非明文密码。


安装 Ansible(Ubuntu 24.04)

Ansible 只需要装在控制节点上。

系统包管理器安装(推荐,省事)

Ubuntu 24.04 官方源中已包含 Ansible,但版本可能较旧。推荐使用 Ansible 官方 PPA 获取最新版本:

 sudo apt update
 sudo apt install -y software-properties-common
 sudo add-apt-repository --yes --update ppa:ansible/ansible
 sudo apt install -y ansible
 ​
 # 验证安装
 ansible --version

配置与测试

1. 配置主机清单(Inventory)

编辑 /etc/ansible/hosts 文件(或用用户目录下的自定义清单),添加要管理的机器:

 [group1]
 192.168.7.21

高级配置示例:

 # 使用 IP 范围
 [nginx]
 apache[1:10].aaa.com        # apache1.aaa.com 到 apache10.aaa.com
 nginx[a:z].aaa.com          # nginx a-z 共26台
 10.1.1.[11:15]              # 10.1.1.11 到 10.1.1.15
 ​
 # 指定非标准 SSH 端口
 10.1.1.13:2222
 ​
 # 指定别名、端口、用户名、密码(未做免密时使用)
 nginx1 ansible_ssh_host=10.1.1.13 ansible_ssh_port=2222 ansible_ssh_user=root ansible_ssh_pass="123456"

2. 测试连通性

测试单个机器:

 ansible -m ping 192.168.7.21

测试整个分组:

 ansible -m ping group1

返回 "ping": "pong" 就说明通了。


指令操作:

 '执行命令'
 # 查看主机名
 ansible 192.168.7.21 -m command -a "hostname"
 ​
 # 查看系统信息
 ansible 192.168.7.21 -m command -a "uname -a"
 ​
 # 查看内存
 ansible 192.168.7.21 -m command -a "free -h"
 ​
 # 查看磁盘
 ansible 192.168.7.21 -m command -a "df -h"
 ​
 '使用 Shell 模块'
 # 执行复杂命令(支持管道、重定向等)
 ansible 192.168.7.21 -m shell -a "ps aux | grep ssh"
 ​
 # 查看当前用户
 ansible 192.168.7.21 -m shell -a "whoami"
 ​
 '文件操作'
 # 创建目录
 ansible 192.168.7.21 -m file -a "path=/tmp/test state=directory"
 ​
 # 复制文件
 ansible 192.168.7.21 -m copy -a "src=/etc/hosts dest=/tmp/hosts"
 ​
 # 查看文件
 ansible 192.168.7.21 -m command -a "cat /tmp/hosts"
 ​
 '软件包管理'
 # 安装软件(Ubuntu/Debian)
 ansible 192.168.7.21 -m apt -a "name=curl state=present"
 ​
 # 更新软件包
 ansible 192.168.7.21 -m apt -a "update_cache=yes"

Python 版本不一致会怎样?

1. 控制节点 vs 受管节点

在 Ansible 架构中,有两个角色:

角色

说明

Python 作用

控制节点

你执行 ansible 命令的机器(你的 Ubuntu)

运行 Ansible 自身,需要 Python 3.8+

受管节点

被管理的目标主机(192.168.7.21)

执行模块代码,需要 Python 2.7 或 3.5+

Python 版本不一致导致的问题速查表

问题类型

一句话解释

Python 3 写法

Python 2 写法

后果

语法不兼容 (最致命)

新版本的语法在旧版本上不识别,直接报错

print(f"Hello {name}")

print("Hello {}".format(name))

❌ 任务直接失败,报 SyntaxError

模块缺失

新版本自带的模块,旧版本没有

import importlib.metadata

❌ 没有此模块

❌ 报 ModuleNotFoundError,任务失败

行为差异

同一段代码,执行结果不同

5 / 2 = 2.5(浮点数除法)

5 / 2 = 2(整数除法)

⚠️ 不报错,但结果与预期不符(更难排查)

保证版本一致的四大层级

层级

方案

难度

适用场景

🟢 第一层

Ansible 配置指定解释器路径

⭐ 简单

快速消除警告,临时解决

🟡 第二层

主机清单中逐台指定

⭐⭐ 中等

混合环境,不同节点用不同版本

🟠 第三层

使用 Playbook 统一安装

⭐⭐⭐ 较复杂

新环境初始化,彻底解决

🔴 第四层

容器化 + 镜像标准化

⭐⭐⭐⭐ 复杂

大规模生产环境

第一层:Ansible 配置指定(最快)

方法 1:全局配置文件(推荐)

优点:一行配置,全局生效

缺点:要求所有节点 Python 路径相同

 # /etc/ansible/ansible.cfg 或 ~/ansible.cfg
 [defaults]
 # 强制所有受管节点使用 Python 3.12
 interpreter_python = /usr/bin/python3.12

方法 2:命令行临时指定

优点:临时测试很方便

缺点:容易忘记,每次都要写

 # 每次执行时指定
 ansible 192.168.7.21 -e 'ansible_python_interpreter=/usr/bin/python3.12' -m ping
 ​
 # 或设置环境变量(当前终端有效)
 export ANSIBLE_PYTHON_INTERPRETER=/usr/bin/python3.12
 ansible 192.168.7.21 -m ping

第二层:主机清单指定(更灵活)

优点:精细控制,不同组不同版本

缺点:维护成本略高

按主机指定

 # inventory/hosts
 [webservers]
 192.168.7.21 ansible_python_interpreter=/usr/bin/python3.12
 192.168.7.22 ansible_python_interpreter=/usr/bin/python3.11
 192.168.7.23 ansible_python_interpreter=/usr/bin/python3.10

按主机组指定

 # inventory/hosts
 [webservers]
 192.168.7.21
 192.168.7.22
 ​
 [webservers:vars]
 ansible_python_interpreter=/usr/bin/python3.12
 ​
 [old_servers]
 192.168.7.23
 ​
 [old_servers:vars]
 ansible_python_interpreter=/usr/bin/python2.7

三层及四层方案可百度查资料了解及使用方法

几个需要知道的常识

  • 控制节点建议用 Linux:Ansible 虽然有 Windows 版,但功能受限,主流做法是在 Linux 机器上跑。Ubuntu 24.04 是完全受支持的控制节点系统。

  • 临时命令 vs 剧本:临时的、一次性操作,直接在命令行用 ansible 加参数执行就行;反复用、正式走流程的操作,一定要写成 Playbook。

  • 先试跑再真跑:ansible-playbook --check 可以模拟执行,只告诉你"会做什么改动",不会实际修改。线上操作前跑一遍检查,能避免很多低级错误。

  • Python 环境注意:Ubuntu 24.04 默认 Python 版本为 3.12,Ansible 对 3.12 支持良好。若受管节点为较旧系统,可能需要安装 Python 2 或 3,但现代 Ansible 通常要求 Python 3.6+。


一句话总结

Ansible 解决的核心问题是:你不用再记住每台机器上该怎么操作,只需要把"想要的结果"写在文件里,它会替你把结果做出来。 这件事听起来简单,但把它做牢靠、做可重复,就是自动化的全部价值所在。