linux

如何通过脚本批量修改hostname

小樊
34
2025-05-21 15:02:34
栏目: 编程语言

要通过脚本批量修改多台服务器的 hostname,可以采用多种方法,具体取决于你的操作系统和环境。以下介绍几种常见的方法,主要以 Linux 系统为例:

方法一:使用 SSH 批量执行命令

如果你的服务器已经配置好 SSH 无密码登录,可以使用脚本来批量修改 hostname。

步骤:

  1. 准备主机列表

    创建一个包含所有目标服务器 IP 地址或主机名的文件,例如 hosts.txt

    192.168.1.101
    192.168.1.102
    server3.example.com
    
  2. 编写 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"
    

    注意事项:

    • 确保你有权限通过 SSH 无密码登录到目标服务器。
    • 替换 newhostname 为你想要设置的新 hostname。
    • 如果目标服务器使用的是其他方式管理 hostname(如 hostname 命令),需要相应调整脚本。
  3. 执行脚本

    赋予脚本执行权限并运行:

    chmod +x change_hostname.sh
    ./change_hostname.sh
    

方法二:使用 Ansible 自动化工具

Ansible 是一个强大的自动化工具,适用于批量管理和配置多台服务器。

步骤:

  1. 安装 Ansible

    在控制节点(用于运行 Ansible 的机器)上安装 Ansible:

    pip install ansible
    

    或者使用包管理器安装,例如在 Ubuntu 上:

    sudo apt update
    sudo apt install ansible
    
  2. 配置 Inventory

    创建一个库存文件(例如 hosts.ini),列出所有目标服务器:

    [servers]
    192.168.1.101
    192.168.1.102
    server3.example.com
    
  3. 编写 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 将任务委托给控制节点执行,避免在每台服务器上执行命令。
  4. 运行 Playbook

    执行以下命令来应用 Playbook:

    ansible-playbook change_hostname.yml
    

方法三:使用 Python 脚本结合 Paramiko 库

如果你更喜欢使用 Python,可以利用 Paramiko 库通过 SSH 批量修改 hostname。

步骤:

  1. 安装 Paramiko

    pip install paramiko
    
  2. 编写 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_usernameyour_password 为实际的 SSH 凭证。
    • 确保目标服务器允许通过 SSH 密码认证(出于安全考虑,建议使用 SSH 密钥认证)。

注意事项

  1. 备份配置:在批量修改之前,建议备份 /etc/hostname/etc/hosts 文件,以防止意外情况发生。

  2. 权限管理:确保执行脚本的用户具有足够的权限来修改 hostname,通常需要 sudo 权限。

  3. 网络连接:确保控制节点能够通过网络访问所有目标服务器,并且防火墙设置允许 SSH 连接。

  4. 测试脚本:在生产环境运行之前,先在少量服务器上测试脚本,确保其按预期工作。

通过以上方法,你可以根据具体需求选择合适的工具和方法来批量修改服务器的 hostname。

0
看了该问题的人还看了