批量配置主机IP地址

背景

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

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

免密

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

1
2
3
4
5
6
7
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地址,以及网络配置参数,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#!/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

查看日志

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
==> 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

验证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 查看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]#

附录

手动配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
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运维交流社区》