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 环境。
优缺点
优点:
部署简单,无需 Agent:不用在每台机器上装客户端,只要 SSH 能通就能管。新机器上线直接就能纳管,省去了大批量装客户端的麻烦。
上手快:语法是 YAML,比写 Shell 脚本直观得多。运维人员不用学编程语言就能写自动化脚本。
模块丰富:官方提供了几千个模块,覆盖系统管理、云平台、网络设备等各种场景。大部分日常操作都有现成的模块可以用。
安全可控:走 SSH 协议,可以利用现有的 SSH 认证体系。没有额外开放端口,安全部门更放心。
幂等性:同一套脚本反复跑不会出问题,Ansible 会自动判断"需要做才做"。线上操作敢反复执行,不怕搞乱系统。
轻量级维护:更新时只需在操作机上进行一次更新即可,不用分发到远程。
缺点:
大规模场景下性能吃紧:Ansible 走 SSH 连接,每台机器都要建立连接,机器多了速度会明显下降。一般建议 500 台以内比较顺手,再往上就需要调优或者考虑其他方案了。在规模较大的情况下可以考虑使用 ZeroMQ 连接方式来改善执行速度。
复杂逻辑写起来费劲:Ansible 擅长描述"最终状态",但复杂的条件判断、循环嵌套写多了,Playbook 会变得臃肿难维护。
没有状态追踪: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 的工作流程大致如下:
用户登录管理机器:通过 Ansible 剧本或者单行命令,针对业务机器组或单个机器部署任务。
管理机器读取部署任务:根据 hosts 文件中定义的业务机器组,查找对应的机器地址(IP 或域名)。
管理机下发任务:管理机通过 SSH 免密连接业务机器,下发任务。
业务机器执行任务。
业务机器将执行结果返回给 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 chrony4. 更新 APT 源并安装基础工具:
sudo apt update
sudo apt upgrade -y
sudo apt install -y software-properties-common sshpass5. 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 配置指定(最快)
方法 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 解决的核心问题是:你不用再记住每台机器上该怎么操作,只需要把"想要的结果"写在文件里,它会替你把结果做出来。 这件事听起来简单,但把它做牢靠、做可重复,就是自动化的全部价值所在。
Ansible 介绍及安装
本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
评论交流
欢迎留下你的想法