要通过脚本批量修改多台服务器的 hostname,可以采用多种方法,具体取决于你的操作系统和环境。以下介绍几种常见的方法,主要以 Linux 系统为例:
如果你的服务器已经配置好 SSH 无密码登录,可以使用脚本来批量修改 hostname。
准备主机列表
创建一个包含所有目标服务器 IP 地址或主机名的文件,例如 hosts.txt
:
192.168.1.101
192.168.1.102
server3.example.com
编写 Bash 脚本
创建一个脚本文件,例如 change_hostname.sh
:
#!/bin/bash
# 读取主机列表文件
HOSTFILE="hosts.txt"
# 循环遍历每个主机
while IFS= read -r host; do
echo "正在修改 $host 的 hostname..."
# 使用 SSH 执行远程命令
ssh "$host" "sudo hostnamectl set-hostname newhostname"
# 可选:更新 /etc/hosts 文件(如果需要)
ssh "$host" "echo '127.0.0.1\tnewhostname' | sudo tee -a /etc/hosts"
echo "$host 的 hostname 已修改为 newhostname"
done < "$HOSTFILE"
注意事项:
newhostname
为你想要设置的新 hostname。hostname
命令),需要相应调整脚本。执行脚本
赋予脚本执行权限并运行:
chmod +x change_hostname.sh
./change_hostname.sh
Ansible 是一个强大的自动化工具,适用于批量管理和配置多台服务器。
安装 Ansible
在控制节点(用于运行 Ansible 的机器)上安装 Ansible:
pip install ansible
或者使用包管理器安装,例如在 Ubuntu 上:
sudo apt update
sudo apt install ansible
配置 Inventory
创建一个库存文件(例如 hosts.ini
),列出所有目标服务器:
[servers]
192.168.1.101
192.168.1.102
server3.example.com
编写 Playbook
创建一个 YAML 文件,例如 change_hostname.yml
:
---
- name: 批量修改 hostname
hosts: servers
become: yes
tasks:
- name: 设置新的 hostname
hostname:
name: newhostname
state: present
delegate_to: localhost
- name: 更新 /etc/hosts 文件
replace:
path: /etc/hosts
regexp: '^127.0.0.1.*$'
replace: '127.0.0.1\tnewhostname'
delegate_to: localhost
说明:
become: yes
表示使用 sudo 提升权限。delegate_to: localhost
将任务委托给控制节点执行,避免在每台服务器上执行命令。运行 Playbook
执行以下命令来应用 Playbook:
ansible-playbook change_hostname.yml
如果你更喜欢使用 Python,可以利用 Paramiko 库通过 SSH 批量修改 hostname。
安装 Paramiko
pip install paramiko
编写 Python 脚本
创建一个脚本文件,例如 change_hostname.py
:
import paramiko
# 目标主机列表
hosts = [
{'ip': '192.168.1.101', 'username': 'your_username', 'password': 'your_password'},
{'ip': '192.168.1.102', 'username': 'your_username', 'password': 'your_password'},
{'ip': 'server3.example.com', 'username': 'your_username', 'password': 'your_password'},
]
new_hostname = 'newhostname'
for host in hosts:
try:
# 创建 SSH 客户端
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname=host['ip'], username=host['username'], password=host['password'])
# 修改 hostname
stdin, stdout, stderr = ssh.exec_command(f"sudo hostnamectl set-hostname {new_hostname}")
print(stdout.read().decode())
# 更新 /etc/hosts(可选)
stdin, stdout, stderr = ssh.exec_command(f"echo '127.0.0.1\t{new_hostname}' | sudo tee -a /etc/hosts")
print(stdout.read().decode())
ssh.close()
print(f"{host['ip']} 的 hostname 已修改为 {new_hostname}")
except Exception as e:
print(f"无法连接到 {host['ip']}: {e}")
注意事项:
your_username
和 your_password
为实际的 SSH 凭证。备份配置:在批量修改之前,建议备份 /etc/hostname
和 /etc/hosts
文件,以防止意外情况发生。
权限管理:确保执行脚本的用户具有足够的权限来修改 hostname,通常需要 sudo
权限。
网络连接:确保控制节点能够通过网络访问所有目标服务器,并且防火墙设置允许 SSH 连接。
测试脚本:在生产环境运行之前,先在少量服务器上测试脚本,确保其按预期工作。
通过以上方法,你可以根据具体需求选择合适的工具和方法来批量修改服务器的 hostname。