Ansible批量改配置核心是“一次写好、多地生效”,依赖免密SSH和Python环境;通过copy/template/lineinfile三类模块覆盖、动态生成或编辑配置;改后需重载服务并验证,配合Git管理、试运行和条件锁保障安全。

用 Ansible 批量修改多台服务器配置,核心是“一次写好、多地生效”——不用逐台登录,也不依赖被控端装额外软件,只要 SSH 通、Python 有(2.6+),就能统一推配置。
先打通连接:免密 SSH + 分组定义
这是所有操作的前提。控制机必须能无密码登录每台目标服务器:
- 在控制机生成密钥:
ssh-keygen -t rsa -b 4096(一路回车) - 分发公钥到各服务器:
ssh-copy-id user@192.168.1.10(替换为实际 IP 和用户) - 创建 inventory 文件(如
hosts.ini),按角色分组:
[web] web01 ansible_host=192.168.1.10 ansible_user=deploy web02 ansible_host=192.168.1.11 ansible_user=deploy <p>[db] db01 ansible_host=192.168.1.20 ansible_user=admin</p>
测试连通性:ansible web -i hosts.ini -m ping,返回 pong 即成功。
改配置的三种常用方式
根据修改场景灵活选择,不硬套一种方法:
-
直接覆盖文件:适合整份替换(如
/etc/hosts、/etc/sysctl.conf)
用copy模块把本地文件推过去:- name: Copy sysctl config<br> ansible.builtin.copy:<br> src: ./files/sysctl.conf<br> dest: /etc/sysctl.conf<br> owner: root<br> mode: '0644'
-
动态生成配置:适合含变量或环境差异的文件(如 Nginx、JVM 参数)
用template模块 + Jinja2 模板:
模板中写worker_processes {{ ansible_processor_vcpus }};,运行时自动填入 CPU 核数。 -
原地编辑行内容:适合只改某几行(如注释某行、追加一行)
用lineinfile或blockinfile:- name: Ensure timezone is Asia/Shanghai<br> ansible.builtin.lineinfile:<br> path: /etc/timezone<br> line: "Asia/Shanghai"<br> create: yes
改完后确保服务生效
配置不是改完就结束,还要触发对应动作:
- 若改的是 systemd 服务配置(如
/etc/systemd/system/myapp.service),需重载并重启:- name: Reload and restart myapp<br> ansible.builtin.systemd:<br> name: myapp<br> state: restarted<br> daemon_reload: yes
- 若改的是应用级配置(如 Tomcat 的
server.xml),可加一步验证命令:- name: Check config syntax before restart<br> ansible.builtin.command: /opt/tomcat/bin/configtest.sh<br> register: config_check<br> failed_when: config_check.rc != 0
- 支持条件执行:只有配置真被改动了,才重启服务(利用
changed_when或模块的notify机制)
安全与可维护要点
批量改配置容易出问题,这几个习惯能大幅降低风险:
- 所有 Playbook 提交 Git,每次修改留记录、带注释;上线前先
ansible-playbook --check做试运行 - 敏感操作(如改
/etc/shadow、重启数据库)加when: environment == 'prod'条件锁住 - 用
block把“备份原配置 → 推新配置 → 验证 → 重启”串成原子操作,失败自动回滚备份 - 不同环境(dev/staging/prod)用不同 inventory 或变量文件隔离,避免误操作











