Skip to content

Ansible-模块

ping 模块

ping 模块是 Ansible 中最基础的连接测试模块,用于检查与目标主机的 SSH 连接是否正常以及 Python 环境是否可用。它不执行真正的 ICMP ping,而是通过建立 SSH 连接并执行简单 Python 脚本来验证主机可管理性。

语法结构

bash
# 基础语法
ansible <主机> -m ping

# 带参数语法
ansible <主机> -m ping -a "<参数>"

参数说明

参数必选默认值说明
datapong自定义返回的测试数据
timeout超时设置连接超时时间(秒)
port22SSH 端口号
user当前用户SSH 连接用户名

经典案例

基础连接测试
bash
# 测试所有主机连接性
ansible all -m ping

# 测试指定主机组
ansible webservers -m ping
带自定义返回数据
bash
# 修改返回的测试数据
ansible db_servers -m ping -a "data=test_response"
指定连接参数
bash
# 使用特定用户测试
ansible all -m ping -a "user=admin"

# 指定非标准SSH端口
ansible gateway -m ping -a "port=2222"
超时控制
bash
# 设置5秒超时
ansible remote_hosts -m ping -a "timeout=5"
结合主机选择模式
bash
# 测试192.168.1网段主机
ansible '192.168.1.*' -m ping

# 测试在webservers组但不在production组的主机
ansible 'webservers:!production' -m ping
输出格式化
bash
# 单行简洁输出
ansible all -m ping -o

# 详细JSON输出
ansible all -m ping --verbose
权限提升测试
bash
# 测试sudo权限
ansible all -m ping --become

command 模块

基本特性

  • 直接执行命令,不通过 /bin/sh 或任何其他 shell
  • 因此不支持 shell 特性如变量扩展($HOME)、管道(|)、重定向(>)等
  • shell 模块更安全,因为不受 shell 注入攻击影响
  • 适合执行可信的命令

语法结构

bash
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 特性的复杂命令场景。

语法结构

bash
# 基础语法
ansible <主机> -m shell -a "<命令> [参数]"

# 完整语法
ansible <主机> -m shell -a "<键>=<值> <键>=<值> ..."

参数

参数必选默认值说明
cmd-要执行的 shell 命令(可直接写命令,无需此参数)
argv-将命令分解为参数列表,避免 shell 解析
chdir-执行命令前切换工作目录
creates-当指定文件不存在时执行
removes-当指定文件存在时执行
executable/bin/sh指定 shell 解释器路径
stdin-设置命令的标准输入
stdin_add_newlinetrue是否在 stdin 后添加换行符
warntrue是否显示 shell 警告

经典案例

基础命令执行
bash
# 查看系统负载
ansible webservers -m shell -a "uptime"

# 检查磁盘空间(带管道)
ansible all -m shell -a "df -h | grep -v tmpfs"
目录操作
bash
# 在指定目录执行 git 操作
ansible app_servers -m shell -a "git pull chdir=/opt/myapp"

# 递归查找大文件
ansible all -m shell -a "find /var/log -type f -size +50M"
幂等性控制
bash
# 仅当文件不存在时解压
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"
带环境变量
bash
# 使用环境变量
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'"
危险操作(需谨慎)
bash
# 使用 root 权限重启服务
ansible webservers -m shell -a "systemctl restart nginx" --become

# 多命令组合(使用 && 确保顺序执行)
ansible all -m shell -a "make clean && make && make install chdir=/opt/src"
输出处理
bash
# 统计 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"
条件安装
bash
# 检查并安装软件(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 模块不同,它先拷贝脚本再执行,支持幂等性控制。

语法结构

bash
# 基础语法
ansible <主机> -m script -a "<脚本路径> [参数]"

# 完整参数格式
ansible <主机> -m script -a "path=<> [creates=<> removes=<> ...]"

参数

参数必选默认值说明
creates-当远程主机指定路径不存在时执行
removes-当远程主机指定路径存在时执行
chdir-在远程主机上执行脚本前切换工作目录
executable-指定远程执行脚本的解释器(如 /bin/python
decryptyes是否解密源文件(配合 ansible-vault 使用)
argv-传递给脚本的参数列表(需脚本内解析 $1 $2

经典案例

基础脚本执行
bash
# 执行本地脚本(自动传输到远程临时目录执行)
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"
幂等性控制
bash
# 仅当锁文件不存在时执行初始化脚本
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"
指定执行环境
bash
# 使用 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"
复杂参数传递
bash
# 通过 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"
加密脚本执行
bash
# 执行 ansible-vault 加密的脚本(自动解密)
ansible all -m script -a "/opt/secret_scripts/encrypted.sh decrypt=yes"
多主机差异化执行
bash
# 根据主机组执行不同脚本
ansible "webservers:dbservers" -m script -a "/opt/scripts/{{ 'web' if 'webservers' in group_names else 'db' }}_config.sh"

copy 模块

copy 模块是 Ansible 中用于将文件从控制节点复制到远程主机的核心模块,支持文件权限控制、变量替换和幂等性检查,是配置分发的关键工具。

语法结构

bash
# 基础语法
ansible <主机> -m copy -a "src=<源路径> dest=<目标路径> [参数]"

# 完整参数格式
ansible <主机> -m copy -a "src=<> dest=<> owner=<> group=<> mode=<> backup=<>"

参数

参数必选默认值说明
src-控制节点上的源文件路径(可以是绝对或相对路径)
dest-远程主机上的目标路径(必须是绝对路径)
owner-文件属主(如 root
group-文件属组(如 www-data
mode-文件权限(如 0644u=rw,g=r,o=r
backupno覆盖前是否备份原文件(yes/no
forceyes目标存在时是否强制覆盖
content-直接写入内容(替代src
remote_srcno是否从远程主机复制(yes/no
validate-复制前执行验证命令(如 /usr/sbin/apache2ctl -t %s

经典案例

基础文件复制
bash
# 复制本地文件到远程主机
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"
目录复制
bash
# 生成测试文件
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"
内容直接写入
bash
# 直接写入内容到文件
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"
条件复制
bash
# 仅当目标文件不存在时复制
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'"
高级权限控制
bash
# 设置属主和属组(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"
远程主机间复制
bash
# 从远程主机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 环境。

语法结构

bash
# 基础语法
ansible <主机> -m raw -a "<原始命令>"

# 带参数语法
ansible <主机> -m raw -a "<命令> [可执行路径=<>] [环境变量=<>]"

参数说明

参数必选默认值说明
free_form-直接传递原始命令字符串
executable/bin/sh指定命令解释器路径
environment-设置环境变量(格式:{"PATH":"/custom/path"}
stdin-传递标准输入内容

经典案例

基础命令执行
bash
# 在未安装Python的主机上执行命令
ansible legacy_servers -m raw -a "ls -l /tmp"

# 检查系统版本
ansible new_servers -m raw -a "cat /etc/os-release"
环境初始化
bash
# 安装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"}}'
复杂命令组合
bash
# 多命令组合(使用分号分隔)
ansible all -m raw -a "date; whoami; uname -a"

# 带管道的命令(需指定解释器)
ansible all -m raw -a "ps aux | grep sshd" executable=/bin/bash
系统服务管理
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}')"
文件操作
bash
# 直接编辑文件(危险操作需谨慎)
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
网络诊断
bash
# 检查网络连接
ansible gateway -m raw -a "netstat -tulnp | grep 22"

# 测试外网连通性
ansible all -m raw -a "curl -Is http://example.com | head -n1"
带输入的命令
bash
# 传递标准输入(如密码交互)
ansible db_servers -m raw -a "mysql -u root -p" stdin="P@ssw0rd\nshow databases;\n"

fetch 模块

fetch 模块是 Ansible 中用于从远程主机拉取文件到控制节点的专用模块,支持文件完整性校验和目录结构保留,常用于日志收集和配置备份场景。

语法结构

bash
# 基础语法
ansible <主机> -m fetch -a "src=<远程文件> dest=<本地目录> [参数]"

# 完整参数格式
ansible <主机> -m fetch -a "src=<> dest=<> flat=<> validate_checksum=<>"

参数说明

参数必选默认值说明
src-远程主机上的绝对路径源文件
dest-控制节点上的目标目录(会自动创建主机子目录)
flatno是否忽略主机子目录结构(yes/no
validate_checksumyes是否校验文件完整性(MD5校验)
fail_on_missingyes源文件不存在时是否报错
checksum-指定预期校验值(验证文件一致性)

经典案例

基础文件拉取
bash
# 拉取远程日志文件(保留主机目录结构)
ansible webservers -m fetch -a "src=/var/log/nginx/error.log dest=/backup/logs/"

结果路径:/backup/logs/web1.example.com/var/log/nginx/error.log

扁平化存储
bash
# 拉取配置并忽略主机目录结构(所有文件存同一目录)
ansible all -m fetch -a "src=/etc/nginx/nginx.conf dest=/backup/nginx/ flat=yes"

结果路径:/backup/nginx/nginx.conf(多主机时会覆盖)

批量拉取验证
bash
# 拉取SSH密钥并校验(文件被修改则报错)
ansible all -m fetch -a "src=/etc/ssh/ssh_host_rsa_key dest=/backup/ssh/ validate_checksum=yes"
条件拉取
bash
# 仅拉取最近修改的文件(结合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
带校验值的拉取
bash
# 验证远程文件是否匹配特定MD5值
ansible db_servers -m fetch -a "src=/opt/db/schema.sql dest=/backup/db/ checksum=md5:d41d8cd98f00b204e9800998ecf8427e"
忽略缺失文
bash
# 尝试拉取可能不存在的临时文件
ansible all -m fetch -a "src=/tmp/session_data.bin dest=/backup/tmp/ fail_on_missing=no"
大文件分片拉取
bash
# 分片拉取大日志文件(结合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 的条件判断和变量引用。

语法结构

bash
# 基础语法
ansible <主机> -m setup

# 带过滤语法
ansible <主机> -m setup -a "filter=<表达式> [gather_subset=<>]"

参数说明

参数必选默认值说明
filter-使用 shell 通配符过滤返回的 Facts(如 ansible_*_mb
gather_subsetall指定收集的信息子集(如 network,hardware
fact_path/etc/ansible/facts.d自定义本地 Facts 目录路径
gather_timeout10收集超时时间(秒)
gather_network_resources-收集网络设备资源信息

经典案例

获取全部系统信息
bash
# 显示所有 Facts(JSON 格式)
ansible webservers -m setup

# 简洁输出(摘要信息)
ansible all -m setup --tree /tmp/facts
使用过滤器获取特定信息
bash
# 获取内存信息
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"
按子集收集信息
bash
# 仅收集网络和硬件信息
ansible all -m setup -a "gather_subset=network,hardware"

# 排除系统服务信息
ansible all -m setup -a "gather_subset=!services"
自定义 Facts 收集
bash
# 收集自定义本地 Facts(需提前在远程主机创建)
ansible all -m setup -a "fact_path=/etc/company/facts.d"

# 示例自定义 Fact 文件(/etc/company/facts.d/appinfo.fact):
# [app]
# version=1.2.3
网络设备专项收集
bash
# 收集网络接口详情(需平台支持)
ansible routers -m setup -a "gather_network_resources=interfaces"
超时控制
bash
# 设置 20 秒超时(适用于慢速设备)
ansible iot_devices -m setup -a "gather_timeout=20"
结合 jq 处理输出
bash
# 提取所有主机的主机名和 CPU 核心数
ansible all -m setup | jq '.ansible_facts.hostname, .ansible_facts.ansible_processor_vcpus'

cron 模块

cron 模块是 Ansible 中用于管理计划任务(Cron Jobs)的核心模块,支持创建、修改和删除 crontab 条目,可精确控制分钟、小时、日、月、周等时间参数,实现自动化任务调度。

语法结构

bash
# 基础语法
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当前用户指定运行用户
statepresent状态(present/absent
disabledno是否禁用任务(yes/no
special_time-预设时间(reboot/yearly/monthly等)
backupno修改前是否备份原crontab

经典案例

创建基础计划任务
bash
# 每天凌晨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'"
使用预设时间参数
bash
# 系统重启时执行任务
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"
多时间条件组合
bash
# 工作日(周一到周五)上午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'"
用户权限控制
bash
# 以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
任务管理
bash
# 禁用任务(不删除)
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"
复杂命令处理
bash
# 带环境变量的命令
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'"
高级时间语法
bash
# 随机分钟执行(避免所有主机同时运行)
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 等),并能自动检测文件类型。该模块既可以从控制节点复制并解压文件,也可以直接在远程主机上解压已有文件。

语法结构

yaml
ansible [host-pattern] -m unarchive -a "[参数键=值 ...]"

参数

参数必选默认值说明
src-源文件路径(本地路径或URL)
dest-目标解压目录(必须存在)
remote_srcnoyes=远程主机已有文件,no=从控制机拷贝
owner-设置解压后文件的属主
group-设置解压后文件的属组
mode-设置解压后文件的权限(如 '0644')
keep_newernoyes=保留比目标更新的文件
list_filesnoyes=返回归档文件列表但不解压
extra_opts-额外解压选项(如 ['--strip-components=1'])

经典案例

基础解压(控制机→远程主机)
bash
ansible web_servers -m unarchive -a "src=/tmp/app.tar.gz dest=/opt/apps"
解压远程主机已有文件
bash
ansible db_servers -m unarchive -a "src=/downloads/db-backup.zip dest=/var/lib/mysql remote_src=yes"
带权限控制的解压
bash
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"
查看压缩包内容(不解压)
bash
ansible localhost -m unarchive -a "src=~/backup.tar.gz list_files=yes"
解压时剥离顶层目录
bash
ansible app_nodes -m unarchive -a "src=/deploy/app-layer.tar.gz dest=/opt/ extra_opts='--strip-components=1'"
条件解压(结合register)
bash
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
解压后自动清理
bash
ansible workers -m unarchive -a "src=/tmp/temp-bundle.tar dest=/data"
ansible workers -m file -a "path=/tmp/temp-bundle.tar state=absent"

注意事项

  1. remote_src=no(默认)时,控制机的压缩文件会先被完整拷贝到远程主机再解压
  2. 目标目录必须预先存在,否则会报错
  3. 处理大文件时建议配合 async 参数避免超时
  4. Windows 目标主机需要使用 win_unzip 模块替代

archive 模块

介绍

archive 模块用于将多个文件或目录打包成一个压缩文件(如 tar、gz、bz2、zip 等格式)。它类似于 Linux 中的 tar 命令,但提供了更简单的 Ansible 集成方式。

语法结构(命令行模式)

bash
ansible <host-pattern> -m archive -a "<options>"

主要参数

参数必需描述
path要打包的文件/目录路径
dest生成的压缩文件路径
format压缩格式(bz2, gz, tar, xz, zip),默认 tar
remove打包后是否删除源文件(true/false),默认 false
exclude_path排除的文件/目录路径

经典案例

  1. 打包 /var/log 目录为 gzip 格式
bash
ansible webservers -m archive -a "path=/var/log dest=/tmp/logs.tar.gz format=gz"
  1. 打包后删除源文件
bash
ansible db_servers -m archive -a "path=/opt/backups dest=/mnt/backups.tar.bz2 format=bz2 remove=true"
  1. 排除特定目录
bash
ansible app_servers -m archive -a "path=/home dest=/tmp/home_backup.tar exclude_path=/home/temp"

Synchronize 模块

synchronize 模块是对 rsync 命令的封装,用于高效地在本地和远程主机之间同步文件。它支持所有 rsync 的核心功能,并添加了 Ansible 特有的特性。

语法结构

bash
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

经典案例

bash
# 将本地文件推送到远程主机
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 系统。

语法结构

bash
# 基础语法
ansible <主机> -m user -a "<键>=<值> <键>=<值> ..."

# 完整参数格式
ansible <主机> -m user -a "name=<> state=<> password=<> groups=<> ..."

参数说明

参数必选默认值说明
name-用户名(登录名)
statepresent状态(present/absent
password-加密后的密码字符串
groups-附加组列表(逗号分隔)
appendno是否追加组(yes/no
home/home/用户名家目录路径
shell/bin/bash默认shell
uid-用户UID
comment-用户描述信息(GECOS)
create_homeyes是否创建家目录
systemno是否系统用户
move_homeno修改家目录路径时是否迁移内容
forceno删除用户时是否强制删除家目录

经典案例

基础用户管理
bash
# 创建普通用户
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"
密码管理
bash
# 创建加密密码(需先安装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...'"
组管理
bash
# 创建用户并加入附加组(覆盖现有组)
ansible all -m user -a "name=webadmin groups=www-data,admin"

# 追加组(不覆盖原有组)
ansible all -m user -a "name=webadmin groups=wheel append=yes"
高级配置
bash
# 创建系统用户(无家目录)
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"
批量用户操作
bash
# 使用循环创建多个用户
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"
用户状态检查
bash
# 验证用户是否存在
ansible all -m user -a "name=testuser state=query" --check

# 获取用户信息(使用shell模块)
ansible all -m shell -a "getent passwd devuser"
安全实践
bash
# 创建受限用户(不可登录)
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 系统。

语法结构

bash
# 基础语法
ansible <主机> -m group -a "<键>=<值> <键>=<值> ..."

# 完整参数格式
ansible <主机> -m group -a "name=<> state=<> gid=<> system=<>"

参数说明

参数必选默认值说明
name-组名称
statepresent状态(present/absent
gid-组GID(数字ID)
systemno是否系统组(yes/no
local-强制使用本地命令(非LDAP)
non_uniqueno是否允许重复GID

经典案例

基础组管理
bash
# 创建普通组
ansible all -m group -a "name=developers"

# 删除组
ansible all -m group -a "name=temp_group state=absent"
带GID创建
bash
# 创建指定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
bash
# 允许不同主机使用相同GID
ansible all -m group -a "name=cluster_group gid=2000 non_unique=yes"
本地组操作
bash
# 强制在本地创建组(跳过LDAP)
ansible ldap_clients -m group -a "name=local_group local=yes"
批量组操作
bash
# 使用循环创建多个组
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"
组状态验证
bash
# 检查组是否存在
ansible all -m group -a "name=developers state=query"

# 获取组信息(使用shell模块)
ansible all -m shell -a "getent group developers"
与用户模块联动
bash
# 先创建组再创建用户
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 系统中软件包的核心模块,支持软件包的安装、升级、降级和移除等操作。

语法结构

bash
# 基础语法
ansible <主机> -m yum -a "<键>=<值> <键>=<值> ..."

# 完整参数格式
ansible <主机> -m yum -a "name=<> state=<> enablerepo=<> ..."

参数说明

参数必选默认值说明
name-软件包名称(支持 * 通配符)
statepresent状态(present/latest/absent
enablerepo-临时启用的仓库(逗号分隔)
disablerepo-临时禁用的仓库(逗号分隔)
exclude-排除的软件包(逗号分隔)
list-列出指定软件包(updates/installed 等)
update_cacheno是否更新元数据缓存(yes/no
download_onlyno仅下载不安装(yes/no
securityno仅安全相关更新(yes/no
skip_brokenno跳过依赖问题(yes/no

经典案例

基础软件包管理
bash
# 安装最新版软件包
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"
多包操作
bash
# 安装多个软件包
ansible all -m yum -a "name=httpd,mod_ssl state=present"

# 使用通配符安装
ansible all -m yum -a "name='postgresql*' state=present"
仓库控制
bash
# 从指定仓库安装
ansible all -m yum -a "name=ansible enablerepo=epel state=present"

# 禁用特定仓库
ansible all -m yum -a "name=docker-ce disablerepo=epel state=present"
高级操作
bash
# 仅下载不安装(需 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"
查询操作
bash
# 列出所有可更新软件包
ansible all -m yum -a "list=updates"

# 检查指定软件包是否安装
ansible all -m yum -a "list=installed grep=httpd"
缓存管理
bash
# 清理缓存
ansible all -m yum -a "clean=all"

# 更新缓存后安装
ansible all -m yum -a "name=git update_cache=yes state=latest"
事务处理
bash
# 跳过依赖问题
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 等多种初始化系统。

语法结构

bash
# 基础语法
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-进程匹配模式(用于无服务文件的情况)
useauto指定服务管理器(auto/systemd/sysv/upstart
daemon_reloadno是否先执行 daemon-reload(systemd专用)

经典案例

基础服务管理
bash
# 启动服务并设置开机自启
ansible webservers -m service -a "name=nginx state=started enabled=yes"

# 停止服务并禁用自启
ansible all -m service -a "name=httpd state=stopped enabled=no"
服务状态操作
bash
# 重启服务(带2秒间隔)
ansible app_servers -m service -a "name=app_service state=restarted sleep=2"

# 重载配置(不中断服务)
ansible all -m service -a "name=rsyslog state=reloaded"
高级控制
bash
# 强制使用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"
带参数的服务管理
bash
# 启动服务并传递参数
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"
批量服务操作
bash
# 批量启动核心服务
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"]}'
状态检查
bash
# 检查服务状态(不修改)
ansible all -m service -a "name=firewalld"

# 验证服务是否运行
ansible all -m shell -a "systemctl is-active nginx"
特殊场景处理
bash
# 处理无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 中用于管理文件和目录属性的核心模块,支持文件/目录的创建、删除、权限修改、软硬链接管理等操作,具备完整的幂等性支持。

语法结构

bash
# 基础语法
ansible <主机> -m file -a "<键>=<值> <键>=<值> ..."

# 完整参数格式
ansible <主机> -m file -a "path=<> state=<> mode=<> ..."

参数说明

参数必选默认值说明
path-目标路径(绝对路径)
statefile目标状态(file/directory/link/absent等)
mode-权限模式(如 0644u=rw,g=r,o=r
owner-属主(用户名或UID)
group-属组(组名或GID)
recurseno递归修改目录属性(yes/no
src-链接源路径(state=link时使用)
forceno强制创建链接(会覆盖现有文件)
followyes是否追踪符号链接

经典案例

基础文件管理
bash
# 创建空文件(幂等操作)
ansible all -m file -a "path=/tmp/test.txt state=touch"

# 删除文件/目录
ansible all -m file -a "path=/var/tmp/old_logs state=absent"
目录管理
bash
# 创建目录(带权限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"
权限控制
bash
# 设置精确权限
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"
链接管理
bash
# 创建软链接
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"
批量文件操作
bash
# 使用循环创建多个目录
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"
高级用法
bash
# 修改文件属性但不改变内容
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"
安全实践
bash
# 安全删除(先清空后删除)
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模板文件并分发到目标主机,支持变量替换、条件判断和循环控制,是配置管理的核心模块。

语法结构

bash
ansible [主机组] -m template -a \
"src=[本地模板路径] dest=[目标路径] \
[backup=yes|no] [mode='0644'] \
[validate='验证命令 %s']"

参数

参数说明
src本地.j2模板文件路径(必填)
dest目标主机文件路径(必填)
backup修改前备份原文件(默认no)
mode设置文件权限(如0644)
validate文件生成后执行验证命令(如nginx -t %s

经典案例

  1. 部署Nginx配置(带变量替换):
bash
ansible webservers -m template -a \
"src=./templates/nginx.conf.j2 dest=/etc/nginx/nginx.conf \
mode='0644'" -e "{'server_name':'example.com','port':80}"
  1. 动态生成MySQL配置并验证:
bash
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下载文件到目标主机,支持校验、断点续传和代理设置。

语法结构

bash
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请求头

经典案例

  1. 下载JDK并校验完整性:
bash
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...'"
  1. 通过代理下载文件:
bash
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调用、服务健康检查等场景。

语法结构

bash
ansible [主机组] -m uri -a \
"url=[API地址] method=[GET|POST] \
[body='{"key":"value"}'] \
[headers='Content-Type=application/json'] \
[status_code=200]"

参数

参数说明
url请求地址(必填)
methodHTTP方法(默认GET)
body请求体(JSON/XML格式)
headers自定义请求头
status_code预期响应状态码(默认200)

经典案例

bash
# 检查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系统软件包,支持安装、升级、卸载和缓存更新。

语法结构

bash
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)

经典案例

bash
# 安装最新版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 模块

调试工具,可输出变量值、注册任务结果或自定义消息。

语法结构

bash
ansible [主机组] -m debug -a \
"msg='自定义消息'" "var=[变量名]"

参数

参数说明
msg直接输出字符串消息
var输出变量值(如ansible_facts

经典案例

bash
# 输出系统信息
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: 即将执行数据库迁移!'"