批量配置主機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運維交流社區》