批量配置主机IP地址
侧边栏壁纸
  • 累计撰写 200 篇文章
  • 累计收到 124 条评论

批量配置主机IP地址

cby
cby
2025-08-22 / 0 评论 / 4 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2025年08月22日,已超过4天没有更新,若内容或图片失效,请留言反馈。

批量配置主机IP地址

背景

我在经常装一些主机,主机都是虚拟机克隆出来的,网卡的uuid不会变,自动获取IPv6地址会出现问题,每次都需手动配置,比较麻烦。所以编写了一个自动配置地址的脚本。

我的IPv6是需要通过DHCPv6自动下发公网地址,但是我又需要一个简短的内网IPv6地址,所以我的脚本中,只配置了一个内网的地址。这个地址没有配置网关。

免密

第一步先将所有的主机配置免密登录

yum install -y sshpass
ssh-keygen -f /root/.ssh/id_rsa -P ''
export IP="192.168.1.192 192.168.1.194 192.168.1.196 192.168.1.198 192.168.1.200"
export SSHPASS=123123
for HOST in $IP;do
     sshpass -e ssh-copy-id -o StrictHostKeyChecking=no $HOST
done

修改ip脚本

修改你的环境的ip地址,以及网络配置参数,

#!/bin/bash
# 服务器批量配置脚本
# 功能:网络配置、UUID重置、machine-id重置、IP地址设置
# 作者:陈步云
# 日期:2025-08-22

# 日志文件配置
LOG_FILE="server_config_$(date +%Y%m%d%H%M%S).log"
exec 3>&1 4>&2
trap 'exec 2>&4 1>&3' EXIT
exec 1>"$LOG_FILE" 2>&1

# 服务器映射配置(旧IP->新IP)
declare -A IP_MAPPING=(
    ["192.168.1.192"]="192.168.1.31"
    ["192.168.1.194"]="192.168.1.32"
    ["192.168.1.196"]="192.168.1.33"
    ["192.168.1.198"]="192.168.1.34"
    ["192.168.1.200"]="192.168.1.35"
)

# 网络参数配置
GATEWAY="192.168.1.1"
DNS="223.5.5.5"
NETMASK_IPV4="/24"
NETMASK_IPV6="/8"
INTERFACE="ens160"
# 待替换的UUID
# 使用命令查看UUID
# nmcli con show
uuid="d1141403-18c6-3149-907c-ed5f09663a7f"

# 执行SSH命令函数
execute_ssh() {
    local ip=$1
    shift
    local commands=("$@")
    
    echo -e "\n[$(date '+%Y-%m-%d %H:%M:%S')] 在 $ip 执行命令:"
    echo "  ${commands[*]}"
    
    ssh -o StrictHostKeyChecking=no -o ConnectTimeout=3 -o ServerAliveInterval=3 -o ServerAliveCountMax=1 root@"$ip" "${commands[*]}"
    
    if [ $? -eq 0 ]; then
        echo "命令执行成功"
        return 0
    else
        echo "命令执行失败"
        return 1
    fi
}

# 阶段1:网络连接重置
reset_network_connections() {
    for old_ip in "${!IP_MAPPING[@]}"; do
        commands=(
            "nmcli con delete uuid $uuid;nmcli con add type ethernet ifname $INTERFACE con-name $INTERFACE;nmcli con up $INTERFACE"
        )
        execute_ssh "$old_ip" "${commands[@]}"
    done
}

# 阶段2:IPv4配置
configure_ipv4() {
    for old_ip in "${!IP_MAPPING[@]}"; do
        local new_ip="${IP_MAPPING[$old_ip]}"
        
        commands=(
            "nmcli con mod $INTERFACE ipv4.addresses ${new_ip}${NETMASK_IPV4};nmcli con mod $INTERFACE ipv4.gateway $GATEWAY;nmcli con mod $INTERFACE ipv4.method manual;nmcli con mod $INTERFACE ipv4.dns \"$DNS\";nmcli con up $INTERFACE"
        )
        execute_ssh "$old_ip" "${commands[@]}"
    done
}

# 阶段3:IPv6配置
configure_ipv6() {
    for new_ip in "${!IP_MAPPING[@]}"; do
        local new_ip="${IP_MAPPING[$new_ip]}"
        local ipv6_suffix="${new_ip##*.}"
        
        commands=(
            "nmcli con mod $INTERFACE ipv6.addresses fc00::$ipv6_suffix${NETMASK_IPV6};nmcli con up $INTERFACE"
        )
        execute_ssh "$new_ip" "${commands[@]}"
    done
}

# 阶段4:machine-id重置
reset_machine_id() {
    for new_ip in "${IP_MAPPING[@]}"; do
        commands=(
            "rm -rf /etc/machine-id;systemd-machine-id-setup;reboot"
        )
        execute_ssh "$new_ip" "${commands[@]}"
    done
}

# 主执行流程
main() {
    echo "========== 开始服务器配置 =========="
    
    echo -e "\n[阶段1] 重置网络连接..."
    reset_network_connections
    
    echo -e "\n[阶段2] 配置IPv4地址..."
    configure_ipv4
    
    # echo -e "\n等待60秒网络配置生效..."
    # sleep 60
    
    echo -e "\n[阶段3] 配置IPv6地址..."
    configure_ipv6
    
    # echo -e "\n等待30秒网络配置生效..."
    # sleep 30
    
    echo -e "\n[阶段4] 重置machine-id并重启..."
    reset_machine_id
    
    echo -e "\n========== 所有操作已完成 =========="
    echo "详细日志请查看: $LOG_FILE"
}

main

查看日志

==> server_config_20250822215731.log <==
========== 开始服务器配置 ==========

[阶段1] 重置网络连接...

[2025-08-22 21:57:31] 在 192.168.1.194 执行命令:
  nmcli con delete uuid d1141403-18c6-3149-907c-ed5f09663a7f;nmcli con add type ethernet ifname ens160 con-name ens160;nmcli con up ens160

==> server_config_20250822215834.log <==

[阶段2] 配置IPv4地址...

[2025-08-22 21:58:35] 在 192.168.1.194 执行命令:
  nmcli con mod ens160 ipv4.addresses 192.168.1.32/24;nmcli con mod ens160 ipv4.gateway 192.168.1.1;nmcli con mod ens160 ipv4.method manual;nmcli con mod ens160 ipv4.dns "223.5.5.5";nmcli con up ens160
Timeout, server 192.168.1.194 not responding.
命令执行失败

[2025-08-22 21:58:41] 在 192.168.1.196 执行命令:
  nmcli con mod ens160 ipv4.addresses 192.168.1.33/24;nmcli con mod ens160 ipv4.gateway 192.168.1.1;nmcli con mod ens160 ipv4.method manual;nmcli con mod ens160 ipv4.dns "223.5.5.5";nmcli con up ens160
Timeout, server 192.168.1.196 not responding.
命令执行失败

[2025-08-22 21:58:48] 在 192.168.1.192 执行命令:
  nmcli con mod ens160 ipv4.addresses 192.168.1.31/24;nmcli con mod ens160 ipv4.gateway 192.168.1.1;nmcli con mod ens160 ipv4.method manual;nmcli con mod ens160 ipv4.dns "223.5.5.5";nmcli con up ens160
Timeout, server 192.168.1.192 not responding.
命令执行失败

[2025-08-22 21:58:54] 在 192.168.1.198 执行命令:
  nmcli con mod ens160 ipv4.addresses 192.168.1.34/24;nmcli con mod ens160 ipv4.gateway 192.168.1.1;nmcli con mod ens160 ipv4.method manual;nmcli con mod ens160 ipv4.dns "223.5.5.5";nmcli con up ens160
Timeout, server 192.168.1.198 not responding.
命令执行失败

[2025-08-22 21:59:00] 在 192.168.1.200 执行命令:
  nmcli con mod ens160 ipv4.addresses 192.168.1.35/24;nmcli con mod ens160 ipv4.gateway 192.168.1.1;nmcli con mod ens160 ipv4.method manual;nmcli con mod ens160 ipv4.dns "223.5.5.5";nmcli con up ens160
Timeout, server 192.168.1.200 not responding.
命令执行失败

[阶段3] 配置IPv6地址...

[2025-08-22 21:59:06] 在 192.168.1.32 执行命令:
  nmcli con mod ens160 ipv6.addresses fc00::32/8;nmcli con up ens160
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/6)
命令执行成功

[2025-08-22 21:59:07] 在 192.168.1.33 执行命令:
  nmcli con mod ens160 ipv6.addresses fc00::33/8;nmcli con up ens160
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/6)
命令执行成功

[2025-08-22 21:59:07] 在 192.168.1.31 执行命令:
  nmcli con mod ens160 ipv6.addresses fc00::31/8;nmcli con up ens160
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/6)
命令执行成功

[2025-08-22 21:59:07] 在 192.168.1.34 执行命令:
  nmcli con mod ens160 ipv6.addresses fc00::34/8;nmcli con up ens160
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/6)
命令执行成功

[2025-08-22 21:59:07] 在 192.168.1.35 执行命令:
  nmcli con mod ens160 ipv6.addresses fc00::35/8;nmcli con up ens160
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/6)
命令执行成功

[阶段4] 重置machine-id并重启...

[2025-08-22 21:59:08] 在 192.168.1.32 执行命令:
  rm -rf /etc/machine-id;systemd-machine-id-setup;reboot
Initializing machine ID from random generator.
命令执行成功

[2025-08-22 21:59:08] 在 192.168.1.33 执行命令:
  rm -rf /etc/machine-id;systemd-machine-id-setup;reboot
Initializing machine ID from random generator.
命令执行成功

[2025-08-22 21:59:08] 在 192.168.1.31 执行命令:
  rm -rf /etc/machine-id;systemd-machine-id-setup;reboot
Initializing machine ID from random generator.
命令执行成功

[2025-08-22 21:59:08] 在 192.168.1.34 执行命令:
  rm -rf /etc/machine-id;systemd-machine-id-setup;reboot
Initializing machine ID from random generator.
命令执行成功

[2025-08-22 21:59:09] 在 192.168.1.35 执行命令:
  rm -rf /etc/machine-id;systemd-machine-id-setup;reboot
Initializing machine ID from random generator.
命令执行成功

========== 所有操作已完成 ==========
详细日志请查看: server_config_20250822215834.log

验证

# 查看ID
[root@ik-cby cby]# ssh root@192.168.1.31 "cat /etc/machine-id"
e58fe64009824002b232161b9e709aea
[root@ik-cby cby]# 

# 查看网卡配置
[root@ik-cby cby]# ssh root@192.168.1.31 "cat /etc/NetworkManager/system-connections/ens160.nmconnection"
[connection]
id=ens160
uuid=45e3ea75-0cf6-4171-bbd0-f4e1b5217fa3
type=ethernet
interface-name=ens160
timestamp=1755871128

[ethernet]

[ipv4]
address1=192.168.1.31/24,192.168.1.1
dns=223.5.5.5;
method=manual

[ipv6]
addr-gen-mode=default
address1=fc00::31/8
method=auto

[proxy]
[root@ik-cby cby]# 

附录

手动配置

ssh root@192.168.1.195 "rm -rf /etc/machine-id; systemd-machine-id-setup;reboot"
ssh root@192.168.1.196 "rm -rf /etc/machine-id; systemd-machine-id-setup;reboot"
ssh root@192.168.1.197 "rm -rf /etc/machine-id; systemd-machine-id-setup;reboot"
ssh root@192.168.1.198 "rm -rf /etc/machine-id; systemd-machine-id-setup;reboot"
ssh root@192.168.1.199 "rm -rf /etc/machine-id; systemd-machine-id-setup;reboot"
# 
# 查看当前的网卡列表和 UUID:
# nmcli con show
# 删除要更改 UUID 的网络连接:
# nmcli con delete uuid <原 UUID>
# 重新生成 UUID:
# nmcli con add type ethernet ifname <接口名称> con-name <新名称>
# 重新启用网络连接:
# nmcli con up <新名称>

# 更改网卡的UUID
# 先配置静态IP之后使用ssh方式配置不断连
ssh root@192.168.1.195 "nmcli con delete uuid d1141403-18c6-3149-907c-ed5f09663a7f;nmcli con add type ethernet ifname ens160 con-name ens160;nmcli con up ens160"
ssh root@192.168.1.196 "nmcli con delete uuid d1141403-18c6-3149-907c-ed5f09663a7f;nmcli con add type ethernet ifname ens160 con-name ens160;nmcli con up ens160"
ssh root@192.168.1.197 "nmcli con delete uuid d1141403-18c6-3149-907c-ed5f09663a7f;nmcli con add type ethernet ifname ens160 con-name ens160;nmcli con up ens160"
ssh root@192.168.1.198 "nmcli con delete uuid d1141403-18c6-3149-907c-ed5f09663a7f;nmcli con add type ethernet ifname ens160 con-name ens160;nmcli con up ens160"
ssh root@192.168.1.199 "nmcli con delete uuid d1141403-18c6-3149-907c-ed5f09663a7f;nmcli con add type ethernet ifname ens160 con-name ens160;nmcli con up ens160"

# 参数解释
# 
# ssh ssh root@192.168.1.31
# 使用SSH登录到IP为192.168.1.31的主机,使用root用户身份。
# 
# nmcli con delete uuid 708a1497-2192-43a5-9f03-2ab936fb3c44
# 删除 UUID 为 708a1497-2192-43a5-9f03-2ab936fb3c44 的网络连接,这是 NetworkManager 中一种特定网络配置的唯一标识符。
# 
# nmcli con add type ethernet ifname ens160 con-name ens160
# 添加一种以太网连接类型,并指定接口名为 ens160,连接名称也为 ens160。
# 
# nmcli con up ens160
# 开启 ens160 这个网络连接。
# 
# 简单来说,这个命令的作用是删除一个特定的网络连接配置,并添加一个名为 ens160 的以太网连接,然后启用这个新的连接。

# 修改静态的IPv4地址
ssh root@192.168.1.195 "nmcli con mod ens160 ipv4.addresses 192.168.1.31/24; nmcli con mod ens160 ipv4.gateway  192.168.1.1; nmcli con mod ens160 ipv4.method manual; nmcli con mod ens160 ipv4.dns "8.8.8.8"; nmcli con up ens160"
ssh root@192.168.1.196 "nmcli con mod ens160 ipv4.addresses 192.168.1.32/24; nmcli con mod ens160 ipv4.gateway  192.168.1.1; nmcli con mod ens160 ipv4.method manual; nmcli con mod ens160 ipv4.dns "8.8.8.8"; nmcli con up ens160"
ssh root@192.168.1.197 "nmcli con mod ens160 ipv4.addresses 192.168.1.33/24; nmcli con mod ens160 ipv4.gateway  192.168.1.1; nmcli con mod ens160 ipv4.method manual; nmcli con mod ens160 ipv4.dns "8.8.8.8"; nmcli con up ens160"
ssh root@192.168.1.198 "nmcli con mod ens160 ipv4.addresses 192.168.1.34/24; nmcli con mod ens160 ipv4.gateway  192.168.1.1; nmcli con mod ens160 ipv4.method manual; nmcli con mod ens160 ipv4.dns "8.8.8.8"; nmcli con up ens160"
ssh root@192.168.1.199 "nmcli con mod ens160 ipv4.addresses 192.168.1.35/24; nmcli con mod ens160 ipv4.gateway  192.168.1.1; nmcli con mod ens160 ipv4.method manual; nmcli con mod ens160 ipv4.dns "8.8.8.8"; nmcli con up ens160"

# 参数解释
# 
# ssh root@192.168.1.154
# 使用SSH登录到IP为192.168.1.154的主机,使用root用户身份。
# 
# "nmcli con mod ens160 ipv4.addresses 192.168.1.31/24"
# 修改ens160网络连接的IPv4地址为192.168.1.31,子网掩码为 24。
# 
# "nmcli con mod ens160 ipv4.gateway 192.168.1.1"
# 修改ens160网络连接的IPv4网关为192.168.1.1。
# 
# "nmcli con mod ens160 ipv4.method manual"
# 将ens160网络连接的IPv4配置方法设置为手动。
# 
# "nmcli con mod ens160 ipv4.dns "8.8.8.8"
# 将ens160网络连接的IPv4 DNS服务器设置为 8.8.8.8。
# 
# "nmcli con up ens160"
# 启动ens160网络连接。
# 
# 总体来说,这条命令是通过SSH远程登录到指定的主机,并使用网络管理命令 (nmcli) 修改ens160网络连接的配置,包括IP地址、网关、配置方法和DNS服务器,并启动该网络连接。

# 我这里有公网的IPv6的地址,但是是DHCP动态的,无法固定,使用不方便
# 所以我配置了内网的IPv6地址,可以实现固定的访问地址

# 我使用的方式。只配置IPv6地址不配置网关DNS
ssh root@192.168.1.61 "nmcli con mod ens160 ipv6.addresses fc00::31/8; nmcli con up ens160"
ssh root@192.168.1.32 "nmcli con mod ens160 ipv6.addresses fc00::32/8; nmcli con up ens160"
ssh root@192.168.1.33 "nmcli con mod ens160 ipv6.addresses fc00::33/8; nmcli con up ens160"
ssh root@192.168.1.34 "nmcli con mod ens160 ipv6.addresses fc00::34/8; nmcli con up ens160"
ssh root@192.168.1.35 "nmcli con mod ens160 ipv6.addresses fc00::35/8; nmcli con up ens160"

# IPv6地址路由DNS,样例
ssh root@192.168.1.31 "nmcli con mod ens160 ipv6.addresses fc00:43f4:1eea:1::10; nmcli con mod ens160 ipv6.gateway fc00:43f4:1eea:1::1; nmcli con mod ens160 ipv6.method manual; nmcli con mod ens160 ipv6.dns "2400:3200::1"; nmcli con up ens160"
ssh root@192.168.1.32 "nmcli con mod ens160 ipv6.addresses fc00:43f4:1eea:1::20; nmcli con mod ens160 ipv6.gateway fc00:43f4:1eea:1::1; nmcli con mod ens160 ipv6.method manual; nmcli con mod ens160 ipv6.dns "2400:3200::1"; nmcli con up ens160"
ssh root@192.168.1.33 "nmcli con mod ens160 ipv6.addresses fc00:43f4:1eea:1::30; nmcli con mod ens160 ipv6.gateway fc00:43f4:1eea:1::1; nmcli con mod ens160 ipv6.method manual; nmcli con mod ens160 ipv6.dns "2400:3200::1"; nmcli con up ens160"
ssh root@192.168.1.34 "nmcli con mod ens160 ipv6.addresses fc00:43f4:1eea:1::40; nmcli con mod ens160 ipv6.gateway fc00:43f4:1eea:1::1; nmcli con mod ens160 ipv6.method manual; nmcli con mod ens160 ipv6.dns "2400:3200::1"; nmcli con up ens160"
ssh root@192.168.1.35 "nmcli con mod ens160 ipv6.addresses fc00:43f4:1eea:1::50; nmcli con mod ens160 ipv6.gateway fc00:43f4:1eea:1::1; nmcli con mod ens160 ipv6.method manual; nmcli con mod ens160 ipv6.dns "2400:3200::1"; nmcli con up ens160"

# 参数解释
# 
# ssh root@192.168.1.31
# 通过SSH连接到IP地址为192.168.1.31的远程主机,使用root用户进行登录。
# 
# "nmcli con mod ens160 ipv6.addresses fc00:43f4:1eea:1::10"
# 使用nmcli命令修改ens160接口的IPv6地址为fc00:43f4:1eea:1::10。
# 
# "nmcli con mod ens160 ipv6.gateway fc00:43f4:1eea:1::1"
# 使用nmcli命令修改ens160接口的IPv6网关为fc00:43f4:1eea:1::1。
# 
# "nmcli con mod ens160 ipv6.method manual"
# 使用nmcli命令将ens160接口的IPv6配置方法修改为手动配置。
# 
# "nmcli con mod ens160 ipv6.dns "2400:3200::1"
# 使用nmcli命令设置ens160接口的IPv6 DNS服务器为2400:3200::1。
# 
# "nmcli con up ens160"
# 使用nmcli命令启动ens160接口。
# 
# 这个命令的目的是在远程主机上配置ens160接口的IPv6地址、网关、配置方法和DNS服务器,并启动ens160接口。

# 查看网卡配置
# nmcli device show ens160
# nmcli con show ens160
[root@localhost ~]#  cat /etc/NetworkManager/system-connections/ens160.nmconnection 
[connection]
id=ens160
uuid=8eba8c2b-1137-497b-8331-28357ec9eafc
type=ethernet
interface-name=ens160
timestamp=1746419908

[ethernet]

[ipv4]
address1=192.168.1.31/24,192.168.1.1
dns=192.168.1.99;
method=manual

[ipv6]
addr-gen-mode=default
address1=fc00::31/8
method=auto

[proxy]

[root@localhost ~]# 

# 参数解释
# 1. `[connection]`:
#    - `id`: 连接的唯一标识符,用于内部引用。
#    - `uuid`: 连接的通用唯一标识符(UUID),确保在系统中的唯一性。
#    - `type`: 指定连接的类型,本例中为以太网。
#    - `interface-name`: 网络接口的名称(`ens160`),表示与此连接关联的物理或逻辑网络接口。
#    - `timestamp`: 时间戳,指示连接配置上次修改的时间。
# 2. `[ethernet]`:
#    - 通常包含以太网特定的配置设置,如MAC地址或链路速度。
# 3. `[ipv4]`:
#    - `address1`: 以CIDR表示法指定IPv4地址和子网掩码(`192.168.1.31/24`)。还包括网关IP(`192.168.1.1`)。
#    - `dns`: 指定要使用的DNS服务器(本例中为`8.8.8.8`),提供将域名转换为IP地址的手段。
#    - `method`: 指定获取IPv4地址的方法。在本例中,设置为手动,表示IP地址是静态配置的。
# 4. `[ipv6]`:
#    - `addr-gen-mode`: 指定IPv6地址生成模式。设置为默认,通常意味着地址是根据接口的MAC地址生成的。
#    - `method`: 指定获取IPv6地址的方法。在本例中,设置为自动,表示使用DHCPv6或SLAAC等协议进行自动配置。
# 5. `[proxy]`:
#    - 通常用于配置代理设置,如HTTP或SOCKS代理。

关于

https://www.oiox.cn/

https://www.oiox.cn/index.php/start-page.html

CSDN、GitHub、知乎、开源中国、思否、掘金、简书、华为云、阿里云、腾讯云、哔哩哔哩、今日头条、新浪微博、个人博客

全网可搜《小陈运维》

文章主要发布于微信公众号:《Linux运维交流社区》

0

评论 (0)

取消