ansible不直接安装软件包,而是调用目标主机原生包管理器(如apt、dnf、yum等)完成操作;依赖ssh连通、python环境、path中含对应命令,按系统族选用专用模块,支持state控制状态、when条件判断、批量安装及版本指定,并默认具备幂等性。

Ansible 本身不直接安装软件包,而是调用目标主机上原生的包管理器(如 apt、dnf、yum 等)完成操作。整个过程无需在被控端安装代理,只依赖 SSH 连通、Python 环境和对应命令在 PATH 中。
选对模块:按系统类型匹配包管理器
不同发行版使用不同包管理器,Ansible 提供专用模块一一对应:
- Debian/Ubuntu:用 ansible.builtin.apt 模块,支持 APT 缓存更新、PPA 源、deb 包安装
- RHEL/CentOS 7 及更早:用 ansible.builtin.yum
- RHEL/CentOS 8+、Fedora:用 ansible.builtin.dnf(yum 模块在新版中已弃用)
- openSUSE/SLES:用 ansible.builtin.zypper
- Arch Linux:用 ansible.builtin.pacman
写清楚任务:state、name 和条件判断
Playbook 中定义安装逻辑时,关键字段不能省略:
- state: present —— 确保包已安装(不升级),适合稳定环境
- state: latest —— 强制升级到仓库中最新版本
-
name 支持单个字符串或列表:
name: ["nginx", "curl", "htop"] - 指定版本需写全:
name: nginx version: 1.24.0(前提是仓库有该版本) - 用 when 避免跨系统误执行:
when: ansible_os_family == "RedHat"或when: ansible_distribution == "Ubuntu"
确保执行前提就绪
模块能跑通,依赖以下几点已配置好:
- 被控主机已安装 Python(通常 2.7 或 3.6+),Ansible 通过它调用模块
- 包管理命令在 PATH 中(如
/usr/bin/apt),否则要显式加pkg_mgr: /path/to/apt - 若非 root 用户运行,必须设
become: yes,且该用户有无密码 sudo 权限(如%wheel ALL=(ALL) NOPASSWD: ALL) - 网络通畅,能访问软件源(例如 Ubuntu 默认源
http://archive.ubuntu.com,建议国内用户换阿里云镜像)
验证与幂等性利用
Ansible 默认保证幂等:重复运行同一任务,仅当状态不一致时才变更。
- 执行后返回
changed: false表示目标已满足,无需动作 - 可用
register捕获结果,后续任务用when: result.changed分支处理 - 建议加校验步骤,比如用
command模块运行nginx -v或检查服务是否运行











