動態

詳情 返回 返回

批量配置主機IP地址 - 動態 詳情

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

user avatar u_17470194 頭像 2018 頭像 zdyz 頭像 kindledawn 頭像 damenge 頭像 aerfazhe 頭像 yqyx36 頭像 rui_sen 頭像 headofhouchang 頭像 tangqingfeng 頭像 myskies 頭像 zyuxuaner 頭像
點贊 18 用戶, 點贊了這篇動態!
點贊

Add a new 評論

Some HTML is okay.