ansible同步配置文件的核心是声明式逻辑与状态闭环,而非简单复制:通过jinja2模板动态生成适配各主机的配置、synchronize模块高效分发大文件、校验生效三步闭环保障可靠性,并依托分层主机清单与角色化变量实现环境隔离与可回滚。

Ansible 同步配置文件不是简单地“复制粘贴”,而是让成百上千台机器的配置状态可描述、可验证、可回滚。关键在用声明式逻辑替代手工操作,靠结构化设计规避人为偏差。
用 template 模块代替 copy,生成适配每台机器的配置
硬编码的配置文件(如直接 copy /etc/my.cnf)在集群中极易出错:server-id 冲突、read_only 设置反向、路径权限不匹配等。真正要同步的是「逻辑配置」,不是「静态文件」。
- 把配置写进 Jinja2 模板,例如 roles/mysql/templates/my.cnf.j2,里面用
{{ mysql_port }}、{{ ansible_hostname }}等变量 - 通过 inventory 分组自动识别角色:
{% if inventory_hostname in groups['mysql_master'] %}read_only = 0{% else %}read_only = 1{% endif %} - server-id 可从主机名提取:
server-id = {{ ansible_hostname | regex_replace('db(\d+)', '\1') | int }},避免手写错误 - 敏感内容(密码、token)绝不写进模板,改用
vars_files:引入ansible-vault加密文件
大目录或证书包用 synchronize 模块,别用 copy
copy 模块会把整个文件读入控制节点内存再逐台传输,超 1MB 就容易 OOM,且不支持增量。synchronize 调用 rsync,高效又可控。
- 确保目标路径存在:先用
file: state=directory创建目录 - 基本用法:
synchronize: src=./files/certs/ dest=/etc/pki/tls/certs/ rsync_opts="--archive --compress --delete" - 跨 NAT 或禁用 rsync daemon 时,加
use_ssh_args=yes走 SSH 通道 - 排除不需要同步的内容:
exclude: 'temp_* .git/ *.log'
每次分发后必须校验 + 确认生效
传完 ≠ 配置就绪。必须构建“传完 → 校验 → 生效”闭环,否则静默失败难排查。
- 检查文件基础状态:
stat: path=/etc/my.cnf,确认存在、权限为0644、属主为mysql:mysql - 执行语法校验:
command: mysqld --validate-config --defaults-file=/etc/my.cnf,配合failed_when: result.rc not in [0, 1](MySQL 8.0+ warning 返回 1) - 触发 handler 重载服务:
notify: restart mysql,确保只在配置真变化时重启 - 全 Playbook 加
ignore_errors: no,杜绝静默失败
主机与变量必须分层隔离,避免环境污染
所有服务器塞进一个 hosts 文件是运维大忌。环境混杂、变量交叉、故障扩散快。
- 目录结构按环境物理隔离:
inventories/production/(正式)、inventories/staging/(预发) - 主机组名语义化:
[app_servers]、[mysql_master],不写 IP 或泛称[all] - 变量按角色定义:
group_vars/mysql_master.yml只放mysql_role: master、server_id_offset: 100等专属参数 - 同一套 Playbook,通过
-i inventories/staging/切换环境,复用率高、出错率低











