Ansible教程:Ad-hoc 命令用法-apt模块详解(适用Ubuntu)

介绍

apt模块是Ubuntu/Debian系专用包管理模块,具备幂等性(重复执行不会报错,已安装就不重复安装),底层封装apt,优于直接用shell/command模块执行apt install。

语法

被管理Ubuntu节点前置依赖:python3-apt,apt模块依赖此包,没有会报错

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,不更新源缓存
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. 一次性安装多个包

ansible all -m apt -a "name=vim,curl,htop,git state=present update_cache=yes" -b -i ansible_client.ini

3. 安装指定版本软件

ansible all -m apt -a "name=nginx=1.24.0-1ubuntu1 state=present" -b -i ansible_client.ini

4. 保持软件为最新版本

ansible all -m apt -a "name=nginx state=latest update_cache=yes" -b -i ansible_client.ini

5. 安装不附带推荐依赖(精简安装)

ansible all -m apt -a "name=nginx state=present install_recommends=no" -b -i ansible_client.ini

6. 缓存有效期控制

高频批量场景,减少apt update

# 缓存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

返回结果说明

执行后返回JSON:

  • changed: true:本次执行做了变更(新安装/升级)
  • changed: false:目标状态已满足,无修改(幂等生效)
  • cache_updated:是否执行了apt update

卸载例子

仅删除包,保留配置

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

全系统批量升级

ansible all -m apt -a "update_cache=yes upgrade=dist" -b

apt模块 vs shell/command模块

  1. apt模块(推荐):幂等、自动检测包状态、返回结构化json结果、不会重复安装;
  2. command/shell模块(不推荐用于包管理):
    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。