Ansible-模块
ping 模块
ping 模块是 Ansible 中最基础的连接测试模块,用于检查与目标主机的 SSH 连接是否正常以及 Python 环境是否可用。它不执行真正的 ICMP ping,而是通过建立 SSH 连接并执行简单 Python 脚本来验证主机可管理性。
语法结构
# 基础语法
ansible <主机组> -m ping
# 带参数语法
ansible <主机组> -m ping -a "<参数>"参数说明
| 参数 | 必选 | 默认值 | 说明 |
|---|---|---|---|
data | 否 | pong | 自定义返回的测试数据 |
timeout | 否 | 超时设置 | 连接超时时间(秒) |
port | 否 | 22 | SSH 端口号 |
user | 否 | 当前用户 | SSH 连接用户名 |
经典案例
基础连接测试
# 测试所有主机连接性
ansible all -m ping
# 测试指定主机组
ansible webservers -m ping带自定义返回数据
# 修改返回的测试数据
ansible db_servers -m ping -a "data=test_response"指定连接参数
# 使用特定用户测试
ansible all -m ping -a "user=admin"
# 指定非标准SSH端口
ansible gateway -m ping -a "port=2222"超时控制
# 设置5秒超时
ansible remote_hosts -m ping -a "timeout=5"结合主机选择模式
# 测试192.168.1网段主机
ansible '192.168.1.*' -m ping
# 测试在webservers组但不在production组的主机
ansible 'webservers:!production' -m ping输出格式化
# 单行简洁输出
ansible all -m ping -o
# 详细JSON输出
ansible all -m ping --verbose权限提升测试
# 测试sudo权限
ansible all -m ping --becomecommand 模块
基本特性
- 直接执行命令,不通过
/bin/sh或任何其他 shell - 因此不支持 shell 特性如变量扩展(
$HOME)、管道(|)、重定向(>)等 - 比
shell模块更安全,因为不受 shell 注入攻击影响 - 适合执行可信的命令
语法结构
ansible webservers -m command -a 'date'参数
| 参数 | 说明 |
|---|---|
argv | 命令参数列表(替代位置参数) |
chdir | 执行命令前切换到的目录 |
creates | 如果指定路径的文件已存在,则不执行命令 |
removes | 如果指定路径的文件不存在,则不执行命令 |
stdin | 设置命令的标准输入 |
stdin_add_newline | 是否在 stdin 后添加换行符(默认true) |
strip_empty_ends | 是否去除空行(默认true) |
shell 模块
shell 模块是 Ansible 中用于执行 shell 命令的核心模块,它支持通过系统的 shell(默认为 /bin/sh)执行命令。
shell 模块是 Ansible 中用于在远程主机上执行 shell 命令的核心模块,支持完整的 shell 功能(管道、重定向、变量替换等)。相比 command 模块更强大但安全性较低,适合需要 shell 特性的复杂命令场景。
语法结构
# 基础语法
ansible <主机组> -m shell -a "<命令> [参数]"
# 完整语法
ansible <主机组> -m shell -a "<键>=<值> <键>=<值> ..."参数
| 参数 | 必选 | 默认值 | 说明 |
|---|---|---|---|
cmd | 否 | - | 要执行的 shell 命令(可直接写命令,无需此参数) |
argv | 否 | - | 将命令分解为参数列表,避免 shell 解析 |
chdir | 否 | - | 执行命令前切换工作目录 |
creates | 否 | - | 当指定文件不存在时执行 |
removes | 否 | - | 当指定文件存在时执行 |
executable | 否 | /bin/sh | 指定 shell 解释器路径 |
stdin | 否 | - | 设置命令的标准输入 |
stdin_add_newline | 否 | true | 是否在 stdin 后添加换行符 |
warn | 否 | true | 是否显示 shell 警告 |
经典案例
基础命令执行
# 查看系统负载
ansible webservers -m shell -a "uptime"
# 检查磁盘空间(带管道)
ansible all -m shell -a "df -h | grep -v tmpfs"目录操作
# 在指定目录执行 git 操作
ansible app_servers -m shell -a "git pull chdir=/opt/myapp"
# 递归查找大文件
ansible all -m shell -a "find /var/log -type f -size +50M"幂等性控制
# 仅当文件不存在时解压
ansible all -m shell -a "tar -xzf /tmp/backup.tar.gz creates=/opt/backup"
# 仅当文件存在时删除
ansible all -m shell -a "rm /tmp/lock.file removes=/tmp/lock.file"带环境变量
# 使用环境变量
ansible db_servers -m shell -a "JAVA_HOME=/usr/lib/jvm/java-11-openjdk /opt/start-db.sh"
# 输出环境变量
ansible all -m shell -a "echo '当前用户: $USER,家目录: $HOME'"危险操作(需谨慎)
# 使用 root 权限重启服务
ansible webservers -m shell -a "systemctl restart nginx" --become
# 多命令组合(使用 && 确保顺序执行)
ansible all -m shell -a "make clean && make && make install chdir=/opt/src"输出处理
# 统计 Nginx 进程数
ansible webservers -m shell -a "ps aux | grep nginx | grep -v grep | wc -l"
# 检查错误日志
ansible webservers -m shell -a "tail -100 /var/log/nginx/error.log | grep -i error"条件安装
# 检查并安装软件(Debian系)
ansible debian_servers -m shell -a "dpkg -s docker-ce || apt-get install -y docker-ce"
# 检查并安装软件(RHEL系)
ansible centos_servers -m shell -a "rpm -q docker-ce || yum install -y docker-ce"script 模块
script 模块是 Ansible 中用于将本地脚本传输到远程主机执行的核心模块,适合需要复杂逻辑但不想在 Playbook 中直接编写 shell 命令的场景。与 shell/command 模块不同,它先拷贝脚本再执行,支持幂等性控制。
语法结构
# 基础语法
ansible <主机组> -m script -a "<脚本路径> [参数]"
# 完整参数格式
ansible <主机组> -m script -a "path=<> [creates=<> removes=<> ...]"参数
| 参数 | 必选 | 默认值 | 说明 |
|---|---|---|---|
creates | 否 | - | 当远程主机指定路径不存在时执行 |
removes | 否 | - | 当远程主机指定路径存在时执行 |
chdir | 否 | - | 在远程主机上执行脚本前切换工作目录 |
executable | 否 | - | 指定远程执行脚本的解释器(如 /bin/python) |
decrypt | 否 | yes | 是否解密源文件(配合 ansible-vault 使用) |
argv | 否 | - | 传递给脚本的参数列表(需脚本内解析 $1 $2) |
经典案例
基础脚本执行
# 执行本地脚本(自动传输到远程临时目录执行)
ansible webservers -m script -a "/opt/scripts/deploy_web.sh"
# 执行并传递参数(脚本内通过 $1 $2 获取)
ansible all -m script -a "/opt/scripts/health_check.sh --verbose --timeout=30"幂等性控制
# 仅当锁文件不存在时执行初始化脚本
ansible new_nodes -m script -a "/opt/scripts/init_system.sh removes=/tmp/.initialized"
# 仅当未安装软件时执行安装脚本
ansible app_servers -m script -a "/opt/scripts/install_deps.sh creates=/usr/local/bin/required_tool"指定执行环境
# 使用 Python3 执行脚本
ansible all -m script -a "/opt/scripts/data_processor.py executable=/usr/bin/python3"
# 在指定目录执行(脚本输出的相对路径基于此目录)
ansible dbservers -m script -a "/opt/scripts/backup_db.sh chdir=/var/lib/postgresql"复杂参数传递
# 通过 argv 传递参数列表(避免 shell 解析)
ansible all -m script -a 'argv=["/opt/scripts/setup.sh", "--debug", "input.txt"]'
# 带环境变量的执行
ansible prod -m script -a "/opt/scripts/start_service.sh" -e "JAVA_HOME=/usr/lib/jvm/java-11"加密脚本执行
# 执行 ansible-vault 加密的脚本(自动解密)
ansible all -m script -a "/opt/secret_scripts/encrypted.sh decrypt=yes"多主机差异化执行
# 根据主机组执行不同脚本
ansible "webservers:dbservers" -m script -a "/opt/scripts/{{ 'web' if 'webservers' in group_names else 'db' }}_config.sh"copy 模块
copy 模块是 Ansible 中用于将文件从控制节点复制到远程主机的核心模块,支持文件权限控制、变量替换和幂等性检查,是配置分发的关键工具。
语法结构
# 基础语法
ansible <主机组> -m copy -a "src=<源路径> dest=<目标路径> [参数]"
# 完整参数格式
ansible <主机组> -m copy -a "src=<> dest=<> owner=<> group=<> mode=<> backup=<>"参数
| 参数 | 必选 | 默认值 | 说明 |
|---|---|---|---|
src | 是 | - | 控制节点上的源文件路径(可以是绝对或相对路径) |
dest | 是 | - | 远程主机上的目标路径(必须是绝对路径) |
owner | 否 | - | 文件属主(如 root) |
group | 否 | - | 文件属组(如 www-data) |
mode | 否 | - | 文件权限(如 0644 或 u=rw,g=r,o=r) |
backup | 否 | no | 覆盖前是否备份原文件(yes/no) |
force | 否 | yes | 目标存在时是否强制覆盖 |
content | 否 | - | 直接写入内容(替代src) |
remote_src | 否 | no | 是否从远程主机复制(yes/no) |
validate | 否 | - | 复制前执行验证命令(如 /usr/sbin/apache2ctl -t %s) |
经典案例
基础文件复制
# 复制本地文件到远程主机
ansible webservers -m copy -a "src=/etc/nginx/nginx.conf dest=/etc/nginx/nginx.conf"
# 复制并修改权限(属主root,权限644)
ansible all -m copy -a "src=/opt/scripts/backup.sh dest=/usr/local/bin/backup.sh owner=root mode=0755"目录复制
# 生成测试文件
dd if=/dev/zero of=50mb_file bs=1M count=50
# 递归复制整个目录
ansible app_servers -m copy -a "src=/opt/myapp/config/ dest=/opt/myapp/config/"
# 带备份的目录复制
ansible all -m copy -a "src=/etc/security/ dest=/etc/security/ backup=yes"内容直接写入
# 直接写入内容到文件
ansible all -m copy -a "content='Hello World\n' dest=/tmp/greeting.txt"
# 多行内容写入(使用换行符转义)
ansible dbservers -m copy -a "content='DB_HOST=127.0.0.1\nDB_PORT=3306' dest=/opt/app/.env"条件复制
# 仅当目标文件不存在时复制
ansible new_servers -m copy -a "src=/etc/skel/.bashrc dest=/home/devuser/.bashrc force=no"
# 复制前验证配置有效性(适用于服务配置文件)
ansible webservers -m copy -a "src=/tmp/sshd_config dest=/etc/ssh/sshd_config validate='/usr/sbin/sshd -t -f %s'"高级权限控制
# 设置属主和属组(Apache示例)
ansible webservers -m copy -a "src=/var/www/index.html dest=/var/www/html/ owner=www-data group=www-data mode=0644"
# 特殊权限设置(setuid)
ansible all -m copy -a "src=/opt/bin/special_cmd dest=/usr/local/bin/special_cmd mode=4755"远程主机间复制
# 从远程主机A复制到其他主机(需设置remote_src)
ansible cluster_nodes -m copy -a "remote_src=yes src=/data/shared/config.yaml dest=/etc/app/config.yaml"raw 模块
raw 模块是 Ansible 中用于在未配置 Python 环境的远程主机上直接执行低级别命令的模块,通过 SSH 通道直接发送原始命令字符串,完全不依赖远程主机的 Python 环境。
语法结构
# 基础语法
ansible <主机组> -m raw -a "<原始命令>"
# 带参数语法
ansible <主机组> -m raw -a "<命令> [可执行路径=<>] [环境变量=<>]"参数说明
| 参数 | 必选 | 默认值 | 说明 |
|---|---|---|---|
free_form | 是 | - | 直接传递原始命令字符串 |
executable | 否 | /bin/sh | 指定命令解释器路径 |
environment | 否 | - | 设置环境变量(格式:{"PATH":"/custom/path"}) |
stdin | 否 | - | 传递标准输入内容 |
经典案例
基础命令执行
# 在未安装Python的主机上执行命令
ansible legacy_servers -m raw -a "ls -l /tmp"
# 检查系统版本
ansible new_servers -m raw -a "cat /etc/os-release"环境初始化
# 安装Python(为后续Ansible使用做准备)
ansible all -m raw -a "yum install -y python3 || apt-get install -y python3"
# 设置PATH变量
ansible all -m raw -a "echo \$PATH" -e '{"environment":{"PATH":"/usr/local/bin:/usr/bin"}}'复杂命令组合
# 多命令组合(使用分号分隔)
ansible all -m raw -a "date; whoami; uname -a"
# 带管道的命令(需指定解释器)
ansible all -m raw -a "ps aux | grep sshd" executable=/bin/bash系统服务管理
# 重启服务(需提权)
ansible webservers -m raw -a "/usr/sbin/service nginx restart" --become
# 强制终止进程
ansible all -m raw -a "kill -9 $(ps -ef | grep bad_process | grep -v grep | awk '{print $2}')"文件操作
# 直接编辑文件(危险操作需谨慎)
ansible all -m raw -a "sed -i 's/old/new/g' /etc/config.conf"
# 递归修改权限
ansible all -m raw -a "chmod -R 755 /opt/app && chown -R appuser:appgroup /opt/app" --become网络诊断
# 检查网络连接
ansible gateway -m raw -a "netstat -tulnp | grep 22"
# 测试外网连通性
ansible all -m raw -a "curl -Is http://example.com | head -n1"带输入的命令
# 传递标准输入(如密码交互)
ansible db_servers -m raw -a "mysql -u root -p" stdin="P@ssw0rd\nshow databases;\n"fetch 模块
fetch 模块是 Ansible 中用于从远程主机拉取文件到控制节点的专用模块,支持文件完整性校验和目录结构保留,常用于日志收集和配置备份场景。
语法结构
# 基础语法
ansible <主机组> -m fetch -a "src=<远程文件> dest=<本地目录> [参数]"
# 完整参数格式
ansible <主机组> -m fetch -a "src=<> dest=<> flat=<> validate_checksum=<>"参数说明
| 参数 | 必选 | 默认值 | 说明 |
|---|---|---|---|
src | 是 | - | 远程主机上的绝对路径源文件 |
dest | 是 | - | 控制节点上的目标目录(会自动创建主机子目录) |
flat | 否 | no | 是否忽略主机子目录结构(yes/no) |
validate_checksum | 否 | yes | 是否校验文件完整性(MD5校验) |
fail_on_missing | 否 | yes | 源文件不存在时是否报错 |
checksum | 否 | - | 指定预期校验值(验证文件一致性) |
经典案例
基础文件拉取
# 拉取远程日志文件(保留主机目录结构)
ansible webservers -m fetch -a "src=/var/log/nginx/error.log dest=/backup/logs/"结果路径:/backup/logs/web1.example.com/var/log/nginx/error.log
扁平化存储
# 拉取配置并忽略主机目录结构(所有文件存同一目录)
ansible all -m fetch -a "src=/etc/nginx/nginx.conf dest=/backup/nginx/ flat=yes"结果路径:/backup/nginx/nginx.conf(多主机时会覆盖)
批量拉取验证
# 拉取SSH密钥并校验(文件被修改则报错)
ansible all -m fetch -a "src=/etc/ssh/ssh_host_rsa_key dest=/backup/ssh/ validate_checksum=yes"条件拉取
# 仅拉取最近修改的文件(结合shell模块)
ansible all -m shell -a "find /var/log -type f -mtime -1 -printf '%p\n'" | while read file; do
ansible all -m fetch -a "src=$file dest=/backup/recent_logs/"
done带校验值的拉取
# 验证远程文件是否匹配特定MD5值
ansible db_servers -m fetch -a "src=/opt/db/schema.sql dest=/backup/db/ checksum=md5:d41d8cd98f00b204e9800998ecf8427e"忽略缺失文
# 尝试拉取可能不存在的临时文件
ansible all -m fetch -a "src=/tmp/session_data.bin dest=/backup/tmp/ fail_on_missing=no"大文件分片拉取
# 分片拉取大日志文件(结合split)
ansible logserver -m shell -a "split -b 100M /var/log/app.log /tmp/app_log_part_"
ansible logserver -m fetch -a "src=/tmp/app_log_part_* dest=/backup/splitted_logs/"setup 模块
setup 模块是 Ansible 的核心信息收集模块,用于自动获取远程主机的系统信息(称为 Facts),包括硬件配置、网络设置、操作系统详情等,这些数据会以 JSON 格式返回并可用于 Playbook 的条件判断和变量引用。
语法结构
# 基础语法
ansible <主机组> -m setup
# 带过滤语法
ansible <主机组> -m setup -a "filter=<表达式> [gather_subset=<>]"参数说明
| 参数 | 必选 | 默认值 | 说明 |
|---|---|---|---|
filter | 否 | - | 使用 shell 通配符过滤返回的 Facts(如 ansible_*_mb) |
gather_subset | 否 | all | 指定收集的信息子集(如 network,hardware) |
fact_path | 否 | /etc/ansible/facts.d | 自定义本地 Facts 目录路径 |
gather_timeout | 否 | 10 | 收集超时时间(秒) |
gather_network_resources | 否 | - | 收集网络设备资源信息 |
经典案例
获取全部系统信息
# 显示所有 Facts(JSON 格式)
ansible webservers -m setup
# 简洁输出(摘要信息)
ansible all -m setup --tree /tmp/facts使用过滤器获取特定信息
# 获取内存信息
ansible all -m setup -a "filter=ansible_*_mb"
# 检查磁盘设备
ansible storage -m setup -a "filter=ansible_devices"
# 获取 IPv4 地址
ansible all -m setup -a "filter=ansible_default_ipv4"按子集收集信息
# 仅收集网络和硬件信息
ansible all -m setup -a "gather_subset=network,hardware"
# 排除系统服务信息
ansible all -m setup -a "gather_subset=!services"自定义 Facts 收集
# 收集自定义本地 Facts(需提前在远程主机创建)
ansible all -m setup -a "fact_path=/etc/company/facts.d"
# 示例自定义 Fact 文件(/etc/company/facts.d/appinfo.fact):
# [app]
# version=1.2.3网络设备专项收集
# 收集网络接口详情(需平台支持)
ansible routers -m setup -a "gather_network_resources=interfaces"超时控制
# 设置 20 秒超时(适用于慢速设备)
ansible iot_devices -m setup -a "gather_timeout=20"结合 jq 处理输出
# 提取所有主机的主机名和 CPU 核心数
ansible all -m setup | jq '.ansible_facts.hostname, .ansible_facts.ansible_processor_vcpus'cron 模块
cron 模块是 Ansible 中用于管理计划任务(Cron Jobs)的核心模块,支持创建、修改和删除 crontab 条目,可精确控制分钟、小时、日、月、周等时间参数,实现自动化任务调度。
语法结构
# 基础语法
ansible <主机组> -m cron -a "<键>=<值> <键>=<值> ..."
# 完整参数格式
ansible <主机组> -m cron -a "name=<> job=<> minute=<> hour=<> ..."参数说明
| 参数 | 必选 | 默认值 | 说明 |
|---|---|---|---|
name | 是 | - | 任务标识名称(注释字段,需唯一) |
job | 是 | - | 要执行的命令或脚本路径 |
minute | 否 | * | 分钟(0-59) |
hour | 否 | * | 小时(0-23) |
day | 否 | * | 日(1-31) |
month | 否 | * | 月(1-12) |
weekday | 否 | * | 周几(0-6,0=周日) |
user | 否 | 当前用户 | 指定运行用户 |
state | 否 | present | 状态(present/absent) |
disabled | 否 | no | 是否禁用任务(yes/no) |
special_time | 否 | - | 预设时间(reboot/yearly/monthly等) |
backup | 否 | no | 修改前是否备份原crontab |
经典案例
创建基础计划任务
# 每天凌晨3点执行备份脚本
ansible all -m cron -a "name='Daily Backup' job='/opt/scripts/backup.sh' hour=3"
# 每5分钟检查服务状态
ansible webservers -m cron -a "name='Service Check' job='/usr/bin/systemctl status nginx' minute='*/5'"使用预设时间参数
# 系统重启时执行任务
ansible all -m cron -a "name='Post-reboot Task' job='/opt/scripts/cleanup.sh' special_time=reboot"
# 每月1号执行
ansible all -m cron -a "name='Monthly Report' job='/opt/scripts/gen_report.sh' special_time=monthly"多时间条件组合
# 工作日(周一到周五)上午9点和下午5点执行
ansible all -m cron -a "name='Business Hours Sync' job='/usr/bin/sync_data' hour='9,17' weekday='1-5'"
# 每半小时但仅在白天(8am-6pm)执行
ansible all -m cron -a "name='Daytime Monitor' job='/opt/monitor.sh' minute='*/30' hour='8-18'"用户权限控制
# 以apache用户身份每小时执行
ansible webservers -m cron -a "name='Log Rotate' job='/usr/sbin/logrotate /etc/logrotate.d/nginx' user=apache hour='*/1'"
# 以root身份每天清理临时文件
ansible all -m cron -a "name='Temp Cleaner' job='rm -rf /tmp/*' user=root hour=2" --become任务管理
# 禁用任务(不删除)
ansible all -m cron -a "name='Disabled Task' job='/old/script.sh' disabled=yes"
# 删除指定任务
ansible all -m cron -a "name='Obsolete Task' state=absent"
# 备份当前crontab后修改
ansible all -m cron -a "name='Backup DB' job='/opt/backup_db.sh' hour=1 backup=yes"复杂命令处理
# 带环境变量的命令
ansible all -m cron -a "name='Env Task' job='PATH=/usr/local/bin:$PATH /opt/run_with_env.sh'"
# 输出重定向(需转义特殊字符)
ansible all -m cron -a "name='Log Output' job='/opt/script.sh >> /var/log/script.log 2>&1'"高级时间语法
# 随机分钟执行(避免所有主机同时运行)
ansible all -m cron -a "name='Random Sync' job='/usr/bin/rsync_data' minute='{{ 59 \| random(start=1) }}'"
# 精确时间点(每天9:15和16:45)
ansible all -m cron -a "name='Precise Times' job='/opt/task.sh' minute='15,45' hour='9,16'"unarchive 模块
模块简介
unarchive 是 Ansible 的核心模块,用于解压压缩文件或从归档文件中提取内容。它支持多种常见格式(如 .tar、.tar.gz、.tar.bz2、.zip 等),并能自动检测文件类型。该模块既可以从控制节点复制并解压文件,也可以直接在远程主机上解压已有文件。
语法结构
ansible [host-pattern] -m unarchive -a "[参数键=值 ...]"参数
| 参数 | 必选 | 默认值 | 说明 |
|---|---|---|---|
src | 是 | - | 源文件路径(本地路径或URL) |
dest | 是 | - | 目标解压目录(必须存在) |
remote_src | 否 | no | yes=远程主机已有文件,no=从控制机拷贝 |
owner | 否 | - | 设置解压后文件的属主 |
group | 否 | - | 设置解压后文件的属组 |
mode | 否 | - | 设置解压后文件的权限(如 '0644') |
keep_newer | 否 | no | yes=保留比目标更新的文件 |
list_files | 否 | no | yes=返回归档文件列表但不解压 |
extra_opts | 否 | - | 额外解压选项(如 ['--strip-components=1']) |
经典案例
基础解压(控制机→远程主机)
ansible web_servers -m unarchive -a "src=/tmp/app.tar.gz dest=/opt/apps"解压远程主机已有文件
ansible db_servers -m unarchive -a "src=/downloads/db-backup.zip dest=/var/lib/mysql remote_src=yes"带权限控制的解压
ansible all -m unarchive -a "src=https://example.com/pkg/latest.tar.gz dest=/usr/local owner=root group=root mode='0755' remote_src=yes"查看压缩包内容(不解压)
ansible localhost -m unarchive -a "src=~/backup.tar.gz list_files=yes"解压时剥离顶层目录
ansible app_nodes -m unarchive -a "src=/deploy/app-layer.tar.gz dest=/opt/ extra_opts='--strip-components=1'"条件解压(结合register)
ansible test_servers -m stat -a "path=/opt/app/version.txt" --register ver
ansible test_servers -m unarchive -a "src=/tmp/app-v2.tar.gz dest=/opt/app" when: ver.stat.exists == false解压后自动清理
ansible workers -m unarchive -a "src=/tmp/temp-bundle.tar dest=/data"
ansible workers -m file -a "path=/tmp/temp-bundle.tar state=absent"注意事项
- 当
remote_src=no(默认)时,控制机的压缩文件会先被完整拷贝到远程主机再解压 - 目标目录必须预先存在,否则会报错
- 处理大文件时建议配合
async参数避免超时 - Windows 目标主机需要使用
win_unzip模块替代
archive 模块
介绍
archive 模块用于将多个文件或目录打包成一个压缩文件(如 tar、gz、bz2、zip 等格式)。它类似于 Linux 中的 tar 命令,但提供了更简单的 Ansible 集成方式。
语法结构(命令行模式)
ansible <host-pattern> -m archive -a "<options>"主要参数
| 参数 | 必需 | 描述 |
|---|---|---|
path | 是 | 要打包的文件/目录路径 |
dest | 是 | 生成的压缩文件路径 |
format | 否 | 压缩格式(bz2, gz, tar, xz, zip),默认 tar |
remove | 否 | 打包后是否删除源文件(true/false),默认 false |
exclude_path | 否 | 排除的文件/目录路径 |
经典案例
- 打包 /var/log 目录为 gzip 格式
ansible webservers -m archive -a "path=/var/log dest=/tmp/logs.tar.gz format=gz"- 打包后删除源文件
ansible db_servers -m archive -a "path=/opt/backups dest=/mnt/backups.tar.bz2 format=bz2 remove=true"- 排除特定目录
ansible app_servers -m archive -a "path=/home dest=/tmp/home_backup.tar exclude_path=/home/temp"Synchronize 模块
synchronize 模块是对 rsync 命令的封装,用于高效地在本地和远程主机之间同步文件。它支持所有 rsync 的核心功能,并添加了 Ansible 特有的特性。
语法结构
ansible <host-pattern> -m synchronize -a "<options>"主要参数
| 参数 | 必需 | 描述 |
|---|---|---|
src | 是 | 源路径 |
dest | 是 | 目标路径 |
mode | 否 | 同步模式(push/pull),默认 push |
archive | 否 | 启用归档模式(相当于 -a),默认 true |
delete | 否 | 删除目标端多余文件(小心使用),默认 false |
compress | 否 | 启用压缩传输,默认 true |
rsync_opts | 否 | 额外的 rsync 选项 |
checksum | 否 | 基于校验和而非时间/大小,默认 false |
经典案例
# 将本地文件推送到远程主机
ansible web_nodes -m synchronize -a "src=/data/www dest=/var/www/"
# 从远程主机拉取文件到控制机
ansible db_servers -m synchronize -a "mode=pull src=/var/lib/mysql dest=/backups/mysql"
# 同步时删除目标端多余文件
ansible staging -m synchronize -a "src=/build/latest/ dest=/app/ delete=true"
# 使用自定义 rsync 选项
ansible prod -m synchronize -a "src=/data/ dest=/mnt/data/ rsync_opts=--no-motd,--exclude=tmp/"
# 限制传输带宽(单位 KB/s)
ansible remote_servers -m synchronize -a "src=/media/ dest=/mnt/media/ rsync_opts=--bwlimit=100"user 模块
user 模块是 Ansible 中用于管理系统用户账户的核心模块,支持用户创建、修改、删除以及密码管理、组分配等操作,兼容 Linux/Unix 系统。
语法结构
# 基础语法
ansible <主机组> -m user -a "<键>=<值> <键>=<值> ..."
# 完整参数格式
ansible <主机组> -m user -a "name=<> state=<> password=<> groups=<> ..."参数说明
| 参数 | 必选 | 默认值 | 说明 |
|---|---|---|---|
name | 是 | - | 用户名(登录名) |
state | 否 | present | 状态(present/absent) |
password | 否 | - | 加密后的密码字符串 |
groups | 否 | - | 附加组列表(逗号分隔) |
append | 否 | no | 是否追加组(yes/no) |
home | 否 | /home/用户名 | 家目录路径 |
shell | 否 | /bin/bash | 默认shell |
uid | 否 | - | 用户UID |
comment | 否 | - | 用户描述信息(GECOS) |
create_home | 否 | yes | 是否创建家目录 |
system | 否 | no | 是否系统用户 |
move_home | 否 | no | 修改家目录路径时是否迁移内容 |
force | 否 | no | 删除用户时是否强制删除家目录 |
经典案例
基础用户管理
# 创建普通用户
ansible all -m user -a "name=devuser comment='Developer Account'"
# 删除用户(保留家目录)
ansible all -m user -a "name=olduser state=absent"
# 强制删除用户及家目录
ansible all -m user -a "name=olduser state=absent force=yes"密码管理
# 创建加密密码(需先安装passlib)
python -c "from passlib.hash import sha512_crypt; print(sha512_crypt.hash('mypassword'))"
# 设置用户密码(使用加密后的字符串)
ansible all -m user -a "name=devuser password='$6$rounds=656000$saltstr$X5yJL...'"组管理
# 创建用户并加入附加组(覆盖现有组)
ansible all -m user -a "name=webadmin groups=www-data,admin"
# 追加组(不覆盖原有组)
ansible all -m user -a "name=webadmin groups=wheel append=yes"高级配置
# 创建系统用户(无家目录)
ansible all -m user -a "name=serviceuser system=yes create_home=no"
# 自定义UID和shell
ansible all -m user -a "name=dbuser uid=2000 shell=/bin/sh"
# 修改现有用户家目录
ansible all -m user -a "name=devuser home=/opt/dev move_home=yes"批量用户操作
# 使用循环创建多个用户
ansible all -m user -a "name={{ item }} state=present" --extra-vars '{"users":["user1","user2","user3"]}'
# 从文件读取用户列表创建
ansible all -m user -a "name={{ item }} state=present" -i inventory_file --extra-vars "@users.yml"用户状态检查
# 验证用户是否存在
ansible all -m user -a "name=testuser state=query" --check
# 获取用户信息(使用shell模块)
ansible all -m shell -a "getent passwd devuser"安全实践
# 创建受限用户(不可登录)
ansible all -m user -a "name=restricted_user shell=/usr/sbin/nologin"
# 锁定用户账户
ansible all -m user -a "name=locked_user password='!'"group 模块
group 模块是 Ansible 中专门用于管理系统用户组的核心模块,支持组的创建、修改、删除以及组成员管理,兼容主流 Linux/Unix 系统。
语法结构
# 基础语法
ansible <主机组> -m group -a "<键>=<值> <键>=<值> ..."
# 完整参数格式
ansible <主机组> -m group -a "name=<> state=<> gid=<> system=<>"参数说明
| 参数 | 必选 | 默认值 | 说明 |
|---|---|---|---|
name | 是 | - | 组名称 |
state | 否 | present | 状态(present/absent) |
gid | 否 | - | 组GID(数字ID) |
system | 否 | no | 是否系统组(yes/no) |
local | 否 | - | 强制使用本地命令(非LDAP) |
non_unique | 否 | no | 是否允许重复GID |
经典案例
基础组管理
# 创建普通组
ansible all -m group -a "name=developers"
# 删除组
ansible all -m group -a "name=temp_group state=absent"带GID创建
# 创建指定GID的组
ansible all -m group -a "name=dbadmin gid=1500"
# 创建系统组(GID<1000)
ansible all -m group -a "name=service_group system=yes gid=500"非唯一GID
# 允许不同主机使用相同GID
ansible all -m group -a "name=cluster_group gid=2000 non_unique=yes"本地组操作
# 强制在本地创建组(跳过LDAP)
ansible ldap_clients -m group -a "name=local_group local=yes"批量组操作
# 使用循环创建多个组
ansible all -m group -a "name={{ item }} state=present" --extra-vars '{"groups":["group1","group2","group3"]}'
# 从文件读取组配置
ansible all -m group -a "name={{ item.name }} gid={{ item.gid }}" -e "@groups.yml"组状态验证
# 检查组是否存在
ansible all -m group -a "name=developers state=query"
# 获取组信息(使用shell模块)
ansible all -m shell -a "getent group developers"与用户模块联动
# 先创建组再创建用户
ansible all -m group -a "name=devops gid=2001"
ansible all -m user -a "name=deployer groups=devops append=yes"yum 模块
yum 模块是 Ansible 中专门用于管理 RHEL/CentOS/Fedora 等基于 RPM 的 Linux 系统中软件包的核心模块,支持软件包的安装、升级、降级和移除等操作。
语法结构
# 基础语法
ansible <主机组> -m yum -a "<键>=<值> <键>=<值> ..."
# 完整参数格式
ansible <主机组> -m yum -a "name=<> state=<> enablerepo=<> ..."参数说明
| 参数 | 必选 | 默认值 | 说明 |
|---|---|---|---|
name | 是 | - | 软件包名称(支持 * 通配符) |
state | 否 | present | 状态(present/latest/absent) |
enablerepo | 否 | - | 临时启用的仓库(逗号分隔) |
disablerepo | 否 | - | 临时禁用的仓库(逗号分隔) |
exclude | 否 | - | 排除的软件包(逗号分隔) |
list | 否 | - | 列出指定软件包(updates/installed 等) |
update_cache | 否 | no | 是否更新元数据缓存(yes/no) |
download_only | 否 | no | 仅下载不安装(yes/no) |
security | 否 | no | 仅安全相关更新(yes/no) |
skip_broken | 否 | no | 跳过依赖问题(yes/no) |
经典案例
基础软件包管理
# 安装最新版软件包
ansible all -m yum -a "name=httpd state=latest"
# 移除软件包
ansible all -m yum -a "name=telnet state=absent"
# 安装指定版本
ansible all -m yum -a "name=nginx-1.18.0 state=present"多包操作
# 安装多个软件包
ansible all -m yum -a "name=httpd,mod_ssl state=present"
# 使用通配符安装
ansible all -m yum -a "name='postgresql*' state=present"仓库控制
# 从指定仓库安装
ansible all -m yum -a "name=ansible enablerepo=epel state=present"
# 禁用特定仓库
ansible all -m yum -a "name=docker-ce disablerepo=epel state=present"高级操作
# 仅下载不安装(需 yum-plugin-downloadonly)
ansible all -m yum -a "name=openssl download_only=yes update_cache=yes"
# 仅安装安全更新
ansible all -m yum -a "name=* security=yes state=latest"
# 排除内核更新
ansible all -m yum -a "name=* exclude=kernel* state=latest"查询操作
# 列出所有可更新软件包
ansible all -m yum -a "list=updates"
# 检查指定软件包是否安装
ansible all -m yum -a "list=installed grep=httpd"缓存管理
# 清理缓存
ansible all -m yum -a "clean=all"
# 更新缓存后安装
ansible all -m yum -a "name=git update_cache=yes state=latest"事务处理
# 跳过依赖问题
ansible old_servers -m yum -a "name=glibc skip_broken=yes state=latest"
# 最小化安装
ansible minimal -m yum -a "name=@minimal state=present"service 模块
service 模块是 Ansible 中用于管理系统服务的核心模块,支持服务的启动、停止、重启、重载以及状态管理等操作,兼容 systemd、sysvinit、upstart 等多种初始化系统。
语法结构
# 基础语法
ansible <主机组> -m service -a "<键>=<值> <键>=<值> ..."
# 完整参数格式
ansible <主机组> -m service -a "name=<> state=<> enabled=<> ..."参数说明
| 参数 | 必选 | 默认值 | 说明 |
|---|---|---|---|
name | 是 | - | 服务名称(如 nginx/httpd) |
state | 否 | - | 目标状态(started/stopped/restarted/reloaded) |
enabled | 否 | - | 是否开机自启(yes/no) |
sleep | 否 | - | 重启间隔时间(秒) |
arguments | 否 | - | 服务启动参数 |
pattern | 否 | - | 进程匹配模式(用于无服务文件的情况) |
use | 否 | auto | 指定服务管理器(auto/systemd/sysv/upstart) |
daemon_reload | 否 | no | 是否先执行 daemon-reload(systemd专用) |
经典案例
基础服务管理
# 启动服务并设置开机自启
ansible webservers -m service -a "name=nginx state=started enabled=yes"
# 停止服务并禁用自启
ansible all -m service -a "name=httpd state=stopped enabled=no"服务状态操作
# 重启服务(带2秒间隔)
ansible app_servers -m service -a "name=app_service state=restarted sleep=2"
# 重载配置(不中断服务)
ansible all -m service -a "name=rsyslog state=reloaded"高级控制
# 强制使用sysvinit管理服务
ansible legacy_servers -m service -a "name=mysql use=sysv state=restarted"
# 无服务文件时通过进程名控制
ansible all -m service -a "name=custom_app pattern=/opt/app/bin/app state=started"带参数的服务管理
# 启动服务并传递参数
ansible all -m service -a "name=node_exporter arguments='--web.listen-address=:9100' state=started"
# 先刷新systemd再操作
ansible all -m service -a "name=docker daemon_reload=yes state=restarted"批量服务操作
# 批量启动核心服务
ansible all -m service -a "name={{ item }} state=started" --extra-vars '{"services":["sshd","crond","ntpd"]}'
# 禁用不必要服务
ansible all -m service -a "name={{ item }} state=stopped enabled=no" --extra-vars '{"services":["postfix","bluetooth"]}'状态检查
# 检查服务状态(不修改)
ansible all -m service -a "name=firewalld"
# 验证服务是否运行
ansible all -m shell -a "systemctl is-active nginx"特殊场景处理
# 处理无systemd的旧系统
ansible centos6 -m service -a "name=iptables use=sysv state=started"
# 管理自定义systemd服务
ansible all -m service -a "name=/etc/systemd/system/custom.service daemon_reload=yes state=restarted"file 模块
file 模块是 Ansible 中用于管理文件和目录属性的核心模块,支持文件/目录的创建、删除、权限修改、软硬链接管理等操作,具备完整的幂等性支持。
语法结构
# 基础语法
ansible <主机组> -m file -a "<键>=<值> <键>=<值> ..."
# 完整参数格式
ansible <主机组> -m file -a "path=<> state=<> mode=<> ..."参数说明
| 参数 | 必选 | 默认值 | 说明 |
|---|---|---|---|
path | 是 | - | 目标路径(绝对路径) |
state | 否 | file | 目标状态(file/directory/link/absent等) |
mode | 否 | - | 权限模式(如 0644 或 u=rw,g=r,o=r) |
owner | 否 | - | 属主(用户名或UID) |
group | 否 | - | 属组(组名或GID) |
recurse | 否 | no | 递归修改目录属性(yes/no) |
src | 否 | - | 链接源路径(state=link时使用) |
force | 否 | no | 强制创建链接(会覆盖现有文件) |
follow | 否 | yes | 是否追踪符号链接 |
经典案例
基础文件管理
# 创建空文件(幂等操作)
ansible all -m file -a "path=/tmp/test.txt state=touch"
# 删除文件/目录
ansible all -m file -a "path=/var/tmp/old_logs state=absent"目录管理
# 创建目录(带权限755)
ansible all -m file -a "path=/opt/app/config state=directory mode=0755"
# 递归修改属主属组
ansible all -m file -a "path=/data owner=appuser group=appgroup recurse=yes"权限控制
# 设置精确权限
ansible all -m file -a "path=/etc/secret.conf mode=0600 owner=root"
# 特殊权限设置(setuid)
ansible all -m file -a "path=/usr/local/bin/special mode=4755"链接管理
# 创建软链接
ansible all -m file -a "src=/opt/app/bin/app dest=/usr/bin/app state=link"
# 强制创建硬链接(覆盖现有)
ansible all -m file -a "src=/data/file.txt dest=/backup/file.txt state=hard force=yes"批量文件操作
# 使用循环创建多个目录
ansible all -m file -a "path={{ item }} state=directory" --extra-vars '{"dirs":["/data/logs","/data/cache"]}'
# 从模板批量修改权限
ansible all -m file -a "path={{ item.path }} mode={{ item.mode }}" -e "@file_perms.yml"高级用法
# 修改文件属性但不改变内容
ansible all -m file -a "path=/etc/shadow mode=000 follow=no"
# 处理符号链接指向
ansible all -m file -a "path=/etc/localtime src=/usr/share/zoneinfo/Asia/Shanghai state=link"安全实践
# 安全删除(先清空后删除)
ansible all -m file -a "path=/tmp/sensitive_data state=absent"
# 限制目录访问权限(粘滞位)
ansible all -m file -a "path=/shared/tmp mode=1777 state=directory"template 模块
动态渲染Jinja2模板文件并分发到目标主机,支持变量替换、条件判断和循环控制,是配置管理的核心模块。
语法结构
ansible [主机组] -m template -a \
"src=[本地模板路径] dest=[目标路径] \
[backup=yes|no] [mode='0644'] \
[validate='验证命令 %s']"参数
| 参数 | 说明 |
|---|---|
src | 本地.j2模板文件路径(必填) |
dest | 目标主机文件路径(必填) |
backup | 修改前备份原文件(默认no) |
mode | 设置文件权限(如0644) |
validate | 文件生成后执行验证命令(如nginx -t %s) |
经典案例
- 部署Nginx配置(带变量替换):
ansible webservers -m template -a \
"src=./templates/nginx.conf.j2 dest=/etc/nginx/nginx.conf \
mode='0644'" -e "{'server_name':'example.com','port':80}"- 动态生成MySQL配置并验证:
ansible dbservers -m template -a \
"src=my.cnf.j2 dest=/etc/my.cnf \
validate='mysqld --defaults-file=%s --validate-config'"get_url 模块
从HTTP/HTTPS/FTP下载文件到目标主机,支持校验、断点续传和代理设置。
语法结构
ansible [主机组] -m get_url -a \
"url=[下载URL] dest=[保存路径] \
[checksum='sha256:校验值'] [timeout=30] \
[headers='User-Agent=Ansible']"参数
| 参数 | 说明 |
|---|---|
url | 下载地址(必填) |
dest | 目标保存路径(必填) |
checksum | 文件校验(如sha256:abcd1234) |
timeout | 超时时间(秒,默认10) |
headers | 自定义HTTP请求头 |
经典案例
- 下载JDK并校验完整性:
ansible java_servers -m get_url -a \
"url=https://download.oracle.com/java/18/jdk-18_linux-x64_bin.tar.gz \
dest=/opt/jdk.tar.gz \
checksum='sha256:3bfdb59f...'"- 通过代理下载文件:
ansible prod_servers -m get_url -a \
"url=http://internal.com/app.war dest=/opt/tomcat/webapps/ \
headers='Proxy-Authorization=Basic xxxx'"url 模块
发送HTTP/HTTPS请求,支持REST API调用、服务健康检查等场景。
语法结构
ansible [主机组] -m uri -a \
"url=[API地址] method=[GET|POST] \
[body='{"key":"value"}'] \
[headers='Content-Type=application/json'] \
[status_code=200]"参数
| 参数 | 说明 |
|---|---|
url | 请求地址(必填) |
method | HTTP方法(默认GET) |
body | 请求体(JSON/XML格式) |
headers | 自定义请求头 |
status_code | 预期响应状态码(默认200) |
经典案例
# 检查Web服务健康状态
ansible webservers -m uri -a "url=http://localhost:8080/health method=GET return_content=yes"
# 调用API创建用户
ansible localhost -m uri -a \
"url=https://api.example.com/users \
method=POST body='{\"name\":\"test\"}' \
headers='Content-Type=application/json' \
status_code=201"apt 模块
管理Debian/Ubuntu系统软件包,支持安装、升级、卸载和缓存更新。
语法结构
ansible [主机组] -m apt -a \
"name=[包名] state=[present|latest|absent] \
[update_cache=yes|no] [autoremove=yes]"参数
| 参数 | 说明 |
|---|---|
name | 包名(支持多个,如nginx,curl) |
state | 包状态(present安装/latest更新/absent卸载) |
update_cache | 是否先更新缓存(默认no) |
autoremove | 自动移除无用依赖(默认no) |
经典案例
# 安装最新版Nginx
ansible webservers -m apt -a \
"name=nginx state=latest update_cache=yes"
# 批量卸载软件包
ansible old_servers -m apt -a \
"name='apache2,mysql-server' state=absent autoremove=yes"debug 模块
调试工具,可输出变量值、注册任务结果或自定义消息。
语法结构
ansible [主机组] -m debug -a \
"msg='自定义消息'" 或 "var=[变量名]"参数
| 参数 | 说明 |
|---|---|
msg | 直接输出字符串消息 |
var | 输出变量值(如ansible_facts) |
经典案例
# 输出系统信息
ansible all -m debug -a "var=ansible_facts['distribution']"
# 查看磁盘使用注册结果
ansible storage -m shell -a "df -h" register=disk
ansible storage -m debug -a "var=disk.stdout_lines"
# 打印自定义警告
ansible prod -m debug -a "msg='WARNING: 即将执行数据库迁移!'"