批量配置主机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/index.php/start-page.html
CSDN、GitHub、知乎、开源中国、思否、掘金、简书、华为云、阿里云、腾讯云、哔哩哔哩、今日头条、新浪微博、个人博客
全网可搜《小陈运维》
文章主要发布于微信公众号:《Linux运维交流社区》
评论 (0)