本期摘要

服务器数量从几台增长到几百台后,很多操作就不能靠手动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写一个服务器健康检查脚本》

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐