两者怎么选
复制模块把源文件原样送到目标位置,内容里没有任何占位符,适合证书、二进制文件、脚本与内容固定的配置片段。模板模块先用模板引擎渲染,把变量、循环与条件写入配置内容,适合主机名、端口、连接数等随环境变化的配置。判断标准很简单:文件内容是否需要在目标主机上因环境而不同。两者都支持设置权限、属主与备份,模板还支持在落地前调用校验命令检查配置语法。
基本信息
| 复制模块 | 内容固定,原样传输 |
|---|---|
| 模板模块 | 按变量渲染,内容随环境变化 |
| 共同能力 | 设置权限与属主、内容变化时触发通知 |
| 模板附加能力 | 落地前执行语法校验命令 |
使用要点
- 内容固定用复制:证书、密钥文件、预编译产物不要走模板渲染。
- 内容变化用模板:端口、地址、连接数等环境差异写进模板。
- 模板加校验:配置类模板尽量使用校验命令,语法错误在落地前被拦截。
- 保留备份:覆盖已有配置时开启备份,回退时可直接取用。
- 避免动态值:模板中不要写入时间戳、随机串等每次不同的内容。
- 权限显式声明:文件权限与属主写在任务里,避免依赖目标主机的默认设置。
- 通知而非重启:内容变更后通知处理器统一重载,减少重复重启。
两种用法
两种用法
# 复制:内容固定,原样落地
- name: 下发服务证书
ansible.builtin.copy:
src: files/app.pem
dest: /etc/app/app.pem
owner: app
mode: '0640' # 证书权限收紧
backup: true # 覆盖前保留原文件
# 模板:按变量渲染,落地前做语法校验
- name: 下发站点配置
ansible.builtin.template:
src: templates/site.conf.j2
dest: /etc/app/site.conf
owner: app
mode: '0644'
validate: /opt/app/bin/check-config %s # 语法检查,失败则不下发
notify: reload app两种模块对照
| 对比项 | 复制模块 | 模板模块 |
|---|---|---|
| 内容 | 固定 | 按变量渲染 |
| 适用对象 | 证书、二进制、脚本 | 随环境变化的配置 |
| 差异检测 | 按文件内容比较 | 按渲染结果比较 |
| 语法校验 | 不涉及 | 可指定校验命令 |
| 失效风险 | 源文件与目标不一致 | 模板渲染出非法内容 |
| 变更误报 | 源文件确实变化 | 模板含动态值导致每次都变更 |
配置类文件优先用模板加校验:语法错误在下发阶段就被拦住,比等到服务重载失败再回退的成本低得多。
模板渲染结果应当是确定的:同一个变量集合渲染多次结果一致,否则每次执行都会被判定为已变更,带来无意义的重载或重启。