《100个“反常识”经验21:批量改300台服务器密码,用ansible一行搞定》
ansible是SSH批量管理工具,无需安装agent。批量改密码命令:ansible all -m user -a "name=root password={{ 密码 }}"。安全建议:每台服务器用不同密码,用ansible-vault加密存储。前置条件:控制节点安装ansible,受管节点开启SSH且免密登录。
本期摘要
服务器数量从几台增长到几百台后,很多操作就不能靠手动SSH一台台敲了。比如每季度强制改密码,300台服务器手动改完要花一整天,还容易漏掉几台。本文介绍用ansible批量修改服务器密码的方法:一行命令同时更新300台服务器的root密码,同时把新密码加密保存到本地文件中。文章涵盖ansible的安装、主机清单配置、批量执行命令的写法,以及如何安全地管理密码(ansible-vault加密)。读完你就能从“手动敲命令”进化到“写一行代码让机器自己干活”。
一次让人崩溃的改密码经历
某安全合规要求:每季度所有服务器必须更换root密码。
公司有300多台服务器,分布在不同云厂商和IDC。过去的做法是:打开Excel表格,一行行SSH登录,执行passwd,把新密码记下来。
一个人干,要整整两天。中途还要处理各种问题:ssh连不上、密码输错被锁、忘记记录哪台改过……
后来有一次,有位同事改完密码忘记保存,导致一批服务器密码失联,只能通过云厂商控制台一个个重置,又折腾了一天。
直到引入ansible,这个问题才被彻底解决。
ansible是什么?
ansible是一款自动化运维工具,通过SSH协议批量管理服务器。不需要在被管理机器上安装agent,只要能用SSH登录就能管理。
核心概念:
-
控制节点:安装ansible的机器(你的电脑或跳板机)
-
受管节点:被管理的服务器
-
Inventory:主机清单,列出所有服务器的IP和分组
-
Ad-hoc命令:一次执行的单条命令
批量改密码实战
第一步:安装ansible
bash
# CentOS/RHEL yum install epel-release -y yum install ansible -y # Ubuntu/Debian apt update apt install ansible -y # macOS brew install ansible
第二步:配置主机清单
创建/etc/ansible/hosts或者自定义文件inventory.ini:
ini
[webservers] web1.example.com ansible_user=root web2.example.com ansible_user=root [dbservers] db1.example.com ansible_user=root db2.example.com ansible_user=root [all:vars] ansible_ssh_private_key_file=/root/.ssh/id_rsa
按业务分组方便以后批量管理。
第三步:测试连通性
bash
ansible all -m ping
返回pong表示SSH连接正常。
第四步:批量修改密码
bash
# 生成新密码(使用openssl)
NEW_PASS=$(openssl rand -base64 16)
# 批量修改root密码
ansible all -m user -a "name=root password={{ '$NEW_PASS' | password_hash('sha512') }}" --become
或者更稳妥的做法:每台服务器生成不同的随机密码,保存到文件。
bash
# 批量改密码并记录 ansible all -m shell -a "echo $(openssl rand -base64 16) | passwd --stdin root" -o > new_passwords.txt
第五步:验证密码
bash
# 验证是否能登录(需要提前准备好新密码文件) ansible all -m ping --user=root --ask-pass
进阶技巧:用ansible-vault加密密码
明文保存密码不安全,ansible提供了vault加密功能。
创建加密文件:
bash
ansible-vault create secrets.yml
在加密文件中填写变量:
yaml
root_password: $6$salt$hash
Playbook中引用加密变量:
yaml
- hosts: all
tasks:
- name: 修改root密码
user:
name: root
password: "{{ root_password }}"
执行Playbook时输入密码:
bash
ansible-playbook change_pass.yml --ask-vault-pass
常用ansible批量操作
| 操作 | 命令 |
|---|---|
| 批量查看系统版本 | ansible all -m shell -a "cat /etc/os-release" |
| 批量重启服务器 | ansible all -m shell -a "reboot" |
| 批量安装软件 | ansible all -m yum -a "name=nginx state=present" |
| 批量拷贝文件 | ansible all -m copy -a "src=/local/file dest=/remote/file" |
| 批量检查磁盘使用率 | ansible all -m shell -a "df -h" |
批量改密码的完整脚本
bash
#!/bin/bash
# 批量改密码脚本
INVENTORY="/etc/ansible/hosts"
PASS_FILE="new_passwords_$(date +%Y%m%d).txt"
# 测试连通性
ansible all -i $INVENTORY -m ping
# 生成随机密码并修改
> $PASS_FILE
for host in $(ansible all -i $INVENTORY --list-hosts | tail -n +2); do
NEW_PASS=$(openssl rand -base64 16)
echo "$host: $NEW_PASS" >> $PASS_FILE
ansible $host -i $INVENTORY -m shell -a "echo $NEW_PASS | passwd --stdin root" --become
done
echo "密码已保存到 $PASS_FILE"
安全建议
-
不要在所有服务器上用相同的密码
-
密码文件要加密存储(ansible-vault、gpg)
-
修改密码后测试登录,确认无误再关闭当前会话
-
定期更换密码,建议每季度一次
-
记录密码变更日志,包括时间、操作人、涉及服务器
下期预告
《100个“反常识”经验22:用shell写一个服务器健康检查脚本》
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)