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权限和日志策略。
先按本文步骤在一台机器上跑通,再逐步扩大范围,能有效降低批量操作带来的风险。