ansible synchronize模块通过封装rsync实现高效文件同步,优化需三方面:禁用archive、checksum等冗余功能;透传rsync_opts参数如--no-compress、--inplace;启用ssh复用、pipelining及serial分批并行。

Ansible 的 synchronize 模块本质是封装 rsync,专为高效文件同步设计,特别适合大规模代码发布场景。它复用本地 rsync 二进制、支持增量传输、可跳过未变更内容,比 copy 或 template 模块快得多。但默认配置下仍可能慢——关键不在 rsync 本身,而在 Ansible 的执行机制和模块调用方式。
启用 synchronize 模块并禁用冗余功能
先确保使用 synchronize 而非 copy:
它自动调用本地 rsync(控制节点需装 rsync),走 SSH 通道,天然支持差异同步。
- 避免用
archive: yes(默认开启):它隐含-a,会保留所有元数据(属主、权限、xattrs),而代码发布通常只需文件内容+可执行位。改用archive: no+ 显式控制选项更轻量。 - 禁用 fact 收集:若 playbook 不依赖主机变量(如系统架构、路径等),加
gather_facts: false,省去每台机器数秒的探测开销。 - 不设
checksum: yes:默认按修改时间+大小判断变更;仅当频繁 touch 文件但内容不变时才需校验,否则增加 CPU 和 I/O 开销。
优化 rsync 底层行为
synchronize 模块透传 rsync 参数,通过 rsync_opts 直接干预:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 大代码包(如 dist/、node_modules/)禁用压缩:
--no-compress --compress-level=0,避免 CPU 成瓶颈;千兆内网中压缩反而拖慢。 - 跳过已压缩文件:
--skip-compress=.js,.css,.jpg,.png,.gz,.zip,防止二次压缩浪费资源。 - 用
--inplace:原地更新文件,不生成临时文件再 mv,减少磁盘写入和 inode 操作,对 SSD 尤其友好。 - 加
--partial-dir=.rsync-partial:断点续传,网络中断后重试不重传整个文件。
批量主机并行与连接复用
代码发布常面向数十上百台节点,串行同步是最大瓶颈:
- 设置
serial: 10(或按负载调高),分批执行,避免单次压垮控制节点内存或 SSH 连接数。 - 启用 SSH 多路复用:在
ansible.cfg中配置:
ssh_args = -o ControlMaster=auto -o ControlPersist=600s -o ControlPath=~/.ansible/cp/ansible-ssh-%h-%p-%r
首次连接建隧道,后续任务复用同一 TCP 连接,省去密钥交换和 TCP 握手耗时。 - 开启 pipelining:
pipelining = True
让 rsync 命令直接通过 SSH stdin 执行,而非先上传脚本再执行,减少 IO 和进程创建次数。
精简同步范围与排除无用文件
代码仓库里大量开发期文件(.git、node_modules、__pycache__、logs)不需发布:
- 用
rsync_opts排除:--exclude='.git/' --exclude='node_modules/' --exclude='*.log' --exclude='tmp/'。 - 若源目录结构固定,用
src指向构建后产物目录(如build/),而非整个 repo 根目录,从源头减少扫描量。 - 配合
use_ssh_args: true确保 rsync 复用 Ansible 的 SSH 配置(如端口、用户、IdentityFile)。
不复杂但容易忽略。核心就三点:用对模块、关掉多余开关、让连接和传输都并行起来。










