Ansible教程:Ad-hoc 命令用法-apt模块详解(适用Ubuntu) 作者:马育民 • 2026-09-25 16:49 • 阅读:10005 # 介绍 **apt模块是Ubuntu/Debian系专用包管理模块**,具备**幂等性**(重复执行不会报错,已安装就不重复安装),底层封装`apt`,优于直接用shell/command模块执行`apt install`。 # 语法 被管理Ubuntu节点前置依赖:**python3-apt**,apt模块依赖此包,没有会报错 ```bash ansible all -m apt -a "name=python3-apt state=present" -b ``` # 参数 | 参数 | 说明 | |---|---| | `name` | 包名;多个包逗号分隔;指定版本 `name=nginx=1.24.0-1ubuntu1` | | `state` | `present`:安装(存在就不操作);`latest`:安装并升级到最新;`absent`:卸载 | | `update_cache` | yes/no,执行前执行`apt update`刷新源缓存,等价`apt update` | | `cache_valid_time` | 缓存有效期(秒),例如`3600`,1小时内不再重复update,减少耗时 | | `purge` | yes/no,卸载时彻底删除配置文件(state=absent时生效) | | `autoremove` | yes/no,操作后自动清理无用依赖包 | | `install_recommends` | yes/no,是否安装推荐依赖,`no`等价`--no-install-recommends` | | `upgrade` | `dist`:dist-upgrade;`safe`:安全升级;`full`:完整升级;`no`默认不升级 | # 安装例子 ### 1. 安装单个软件(幂等,推荐) ##### 安装nginx,不更新源缓存 ```bash ansible all -m apt -a "name=nginx state=present" -b -i ansible_client.ini ``` ##### 安装前先apt update ``` ansible all -m apt -a "name=nginx state=present update_cache=yes" -b -i ansible_client.ini ``` ### 2. 一次性安装多个包 ```bash ansible all -m apt -a "name=vim,curl,htop,git state=present update_cache=yes" -b -i ansible_client.ini ``` ### 3. 安装指定版本软件 ```bash ansible all -m apt -a "name=nginx=1.24.0-1ubuntu1 state=present" -b -i ansible_client.ini ``` ### 4. 保持软件为最新版本 ```bash ansible all -m apt -a "name=nginx state=latest update_cache=yes" -b -i ansible_client.ini ``` ### 5. 安装不附带推荐依赖(精简安装) ```bash ansible all -m apt -a "name=nginx state=present install_recommends=no" -b -i ansible_client.ini ``` ### 6. 缓存有效期控制 高频批量场景,减少apt update ```bash # 缓存1小时内有效,1小时内多次执行不会重复apt update ansible all -m apt -a "name=nginx state=present update_cache=yes cache_valid_time=3600" -b -i ansible_client.ini ``` # 返回结果说明 [](https://www.malaoshi.top/upload/0/3/1GW476yRlJSN.png) 执行后返回JSON: - `changed: true`:本次执行做了变更(新安装/升级) - `changed: false`:目标状态已满足,无修改(幂等生效) - `cache_updated`:是否执行了apt update # 卸载例子 ### 仅删除包,保留配置 ```bash ansible all -m apt -a "name=nginx state=absent" -b -i ansible_client.ini ``` ### 彻底删除包+配置文件 ``` ansible all -m apt -a "name=nginx state=absent purge=yes" -b -i ansible_client.ini ``` ### 卸载并自动清理无用依赖 ``` ansible all -m apt -a "name=nginx state=absent purge=yes autoremove=yes" -b -i ansible_client.ini ``` # 全系统批量升级 ```bash ansible all -m apt -a "update_cache=yes upgrade=dist" -b ``` # apt模块 vs shell/command模块 1. **apt模块(推荐)**:幂等、自动检测包状态、返回结构化json结果、不会重复安装; 2. **command/shell模块(不推荐用于包管理)**: ```bash ansible all -a "apt install -y nginx" -b ``` **缺点:** **不幂等**,多次执行会重复执行apt命令;输出是原始文本,无法识别包状态。 # 常见坑 1. **忘记加 `-b`**:apt安装需要root权限,不加直接报错; 2. **缺少python3-apt**:Ubuntu最小化系统默认不带,apt模块执行失败; 3. **update_cache=yes频繁执行**:大批量服务器循环执行时,用`cache_valid_time`减少源刷新; 4. **版本号写法**:`name=pkg=version`,不是`name=pkg-version`; 5. 跨系统:apt模块**只能Ubuntu/Debian**,CentOS/RHEL要用yum模块,通用跨平台模块 `-m package`。 原文出处:/show_1GW476yZpueP.html