assemble模块用于在控制节点将本地多个文本片段按字母顺序拼接成单个配置文件并推送至目标主机,适用于仅支持单一配置文件、不兼容conf.d结构的服务,不支持变量渲染。

用 Ansible 的 assemble 模块,可以把本地多个小配置片段按顺序拼成一个完整配置文件,再推到目标主机。它适合那些只认单个配置文件、不支持 conf.d 目录结构的服务(比如某些老旧的 daemon 或定制化脚本)。
确认 assemble 的适用场景
assemble 不是用于远程拉取或模板渲染,而是在控制节点上把本地目录里的多个文本文件串起来,生成一个目标文件,再传过去。关键点:
- 源文件必须在 Ansible 控制机本地(
remote_src=False,默认行为) - 文件按字母顺序拼接(如
01-base.conf→10-override.conf→99-final.conf) - 不执行变量替换或 Jinja2 渲染——那是
template模块的事 - 适合静态内容聚合,比如 Nginx 的 server 块拆分、SSH 的
sshd_config片段、自定义日志轮转规则等
准备片段目录与命名规范
在 playbook 所在目录下建一个子目录(例如 files/nginx-conf.d/),把所有片段放进去,并用前缀数字+短横线确保排序正确:
01-http.conf10-vhost-example.com.conf99-security.conf
避免以 . 开头的隐藏文件(默认被忽略,可设 ignore_hidden: no 覆盖);若需空行或分隔线,用 delimiter 参数指定,比如 delimiter: "# --- END OF {{ item }} ---"。
在 playbook 中调用 assemble 模块
示例任务写法(YAML):
- name: Assemble nginx main config from fragments
assemble:
src: files/nginx-conf.d/
dest: /etc/nginx/nginx.conf
mode: '0644'
owner: root
group: root
backup: yes
delimiter: "# === GENERATED FROM FRAGMENTS ==="
说明:
-
src是控制机上的相对路径(相对于 playbook 目录) -
dest是目标主机上的绝对路径 -
backup: yes会在覆盖前保存带时间戳的备份(如nginx.conf.2026-05-01@14:02:15~) - 权限和属主直接通过
mode/owner/group设置,无需额外file模块
验证与调试技巧
执行前建议先本地预览拼接结果:
- 手动运行:
cat files/nginx-conf.d/* | sort(模拟 assemble 排序逻辑) - 加
check_mode: yes运行 playbook,看是否报错但不实际写入 - 启用
-v或--debug查看 assemble 实际读取了哪些文件 - 若片段中含敏感信息(如密钥),确保它们不进 Git;可用
ansible-vault加密整个src目录(需设decrypt: yes)











