Ansible批量修改服务器ssh配置

多台服务器逐台登录修改SSH配置不仅效率低,还容易漏改或写错参数。
用Ansible批量修改服务器SSH配置,可以一次下发统一的安全策略,比如更换默认端口、禁止root直接登录、关闭密码认证并启用密钥登录。
下面按零基础也能跟做的顺序,从准备到验证完整走一遍。

准备条件与Inventory文件

开始前需要满足几个前提:

  • 控制机已安装Ansible,可用 ansible --version 检查。
  • 控制机已配置到目标服务器的SSH密钥免密登录,或者知道目标机密码。
  • 目标服务器系统为常见的CentOS、Ubuntu、Debian等,且允许通过当前SSH连接操作。
  • 建议先在一台测试机验证,再推送到生产环境。

创建Inventory文件 hosts.ini,把目标服务器分组:

[ssh_servers]
192.168.1.10
192.168.1.11
192.168.1.12

[ssh_servers:vars]
ansible_user=root
ansible_ssh_private_key_file=~/.ssh/id_rsa

如果暂时用密码登录,可以加 ansible_password=你的密码,但生产环境更推荐密钥。

先用ping模块测试连通性:

ansible -i hosts.ini ssh_servers -m ping

看到 SUCCESS 说明控制机与目标机通信正常。

编写Playbook下发统一SSH策略

核心思路是用 template 模块把一份标准 sshd_config 模板推送到所有机器,再用 service 或 systemd 模块重启SSH服务。

创建模板目录和文件:

mkdir -p roles/ssh_hardening/templates

新建 roles/ssh_hardening/templates/sshd_config.j2,写入关键安全项:

Port 22022
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
ChallengeResponseAuthentication no
UsePAM yes
X11Forwarding no
MaxAuthTries 3
ClientAliveInterval 300
ClientAliveCountMax 2

注意:修改端口和禁止root登录前,务必确认已有一个可用的普通用户并配置好密钥,否则可能把自己锁在门外。

接着创建Playbook ssh_hardening.yml:

- name: 统一SSH安全策略
  hosts: ssh_servers
  become: yes
  tasks:
    - name: 备份原sshd_config
      copy:
        src: /etc/ssh/sshd_config
        dest: /etc/ssh/sshd_config.bak
        remote_src: yes
        backup: yes

    - name: 下发新的sshd_config
      template:
        src: roles/ssh_hardening/templates/sshd_config.j2
        dest: /etc/ssh/sshd_config
        owner: root
        group: root
        mode: '0600'
      notify: restart sshd

    - name: 检查配置语法
      command: sshd -t
      changed_when: false

  handlers:
    - name: restart sshd
      service:
        name: sshd
        state: restarted

Ubuntu系统服务名可能是 ssh,需要把 name: sshd 改成 name: ssh,否则重启会失败。

执行与常见报错处理

运行Playbook:

ansible-playbook -i hosts.ini ssh_hardening.yml

执行过程中可能遇到几类问题:

  • ssh连接超时:检查Inventory中的IP、端口、密钥路径是否正确,防火墙是否放行新端口。
  • sshd -t 语法错误:模板中某个参数写错,先在本机用 sshd -t -f 模板文件 测试。
  • 服务重启失败:确认服务名是 sshd 还是 ssh,可用 systemctl status sshd 查看。
  • 修改端口后无法连接:云服务器安全组需要同步放行新端口,否则连接会被拦截。

如果只想先改端口,不想立刻禁用密码登录,可以先把 PasswordAuthentication 保持为 yes,等密钥登录验证通过后再改为 no。

验证策略是否生效

Playbook执行成功后,用以下方式确认配置已统一:

  • 用新端口连接:ssh -p 22022 用户名@服务器IP,能登录说明端口修改成功。
  • 尝试用root直接登录:ssh -p 22022 root@服务器IP,应被拒绝。
  • 查看配置:ansible -i hosts.ini ssh_servers -m shell -a "grep -E 'Port|PermitRootLogin|PasswordAuthentication' /etc/ssh/sshd_config",确认输出一致。
  • 检查服务状态:ansible -i hosts.ini ssh_servers -m shell -a "systemctl is-active sshd",应返回 active。

统一安全策略的关键不是一次改完,
而是每次变更后都保留回滚方式。
建议保留备份文件 sshd_config.bak,
并确保至少有一个带外管理通道,
比如云控制台的VNC,
以防SSH完全无法连接。

几个容易踩的坑

  • 不要在未验证新配置的情况下直接重启sshd,先用 sshd -t 检查语法。
  • 修改端口后记得同步更新防火墙规则和云安全组。
  • 如果使用 ansible_user=root 且禁用了root登录,后续Playbook会连不上,应提前创建普通运维账号并配置sudo。
  • 模板中不要保留与目标系统不兼容的参数,不同发行版对某些选项支持不同,建议以 man sshd_config 为准。

批量修改SSH配置只是统一安全策略的一部分,后续还可以用Ansible统一管理防火墙、sudo权限和日志策略。
先按本文步骤在一台机器上跑通,再逐步扩大范围,能有效降低批量操作带来的风险。

分享到:
上一篇
Grafana导入服务器监控模板
下一篇
Shell脚本监控SSL证书到期,提前邮件告警
1
系统公告

泽御云中秋国庆双节活动上线:新购8折,拼团3.99元起

尊敬的用户:
泽御云“月满中秋·礼贺国庆”双节活动现已开启,活动时间为2026年9月23日至10月10日。 活动期间可享以下福利:
1. 常规云服务器新购使用优惠码“泽御中秋国庆同乐”,符合条件的订单享8折优惠。
2. 香港精品云服务器5人拼团低至3.99元,部分4核4G套餐3人拼团年付388元,续费同价。
3. 新用户购买年付云服务器,符合活动规则可赠送2个月使用时长。
4. 老用户续费季度赠15天,续费年度赠2个月;活动期间升级配置免收配置迁移手续费。
5. 推荐好友成功下单,符合条件的推荐人可获赠7天服务器使用时长。
6. 活动期间享宕机补偿标准翻倍、简单网站迁移协助及技术工单优先处理权益。
温馨提示:优惠码不适用于拼团套餐、活动轻量产品、年付订单及续费订单;拼团套餐为独立特价活动,不与赠时类福利叠加。赠送时长不可折现、退款或跨账户转移,具体规则以活动页面说明为准。
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意