如何通過 Bash 更新 Ubuntu 的 IP 和主機名

管理Ubuntu计算机的IP地址和主机名有几种方法。系统管理员可以使用nmcli、netplan、hostname和hostnamectl工具来完成这些任务。虽然这些工具本身就可以很好地完成工作,但如何将这些工具与自动化结合起来提升效率呢?

您可以创建一个Bash脚本来处理配置。在本文中,您将学习如何使用接受输入的Bash脚本设置新的主机名和配置IP地址信息。

每个示例都会建立在前一个示例的基础上。通过本文的学习,您将具备构建一个在新的或现有的Ubuntu主机上使用的完全功能配置脚本所需的知识。

先决条件

您不需要成为Bash shell脚本的专家,只需确保满足以下要求即可。

  • A host running on Ubuntu. This tutorial uses Ubuntu 22.04 LTS.
  • 对Ubuntu主机具有Root权限。
  • A text editor, such as vim, nano, or VSCode.

使用hostnamectl设置主机名

每个主机都应该有一个唯一的名称。使用hostnamectl命令可以查询或更改主机名。在这种情况下,以下语法用于将当前主机名更改为您想要的任何名称。

sudo hostnamectl set-hostname "new-hostname"

執行以下指令更改主機名稱,使用`set-hostname`通用參數,後接雙引號內的字串值作為新主機名稱。如果您手動執行此指令,應該可以順利運作。

但如果您想將其放入接受使用者輸入的腳本中呢?首先使用read指令,後接參數`-p`,代表提示,以及一個字串告訴使用者為此提示輸入什麼。然後將輸入保存到一個新變數中,稱為NEW_HOSTNAME。

read -p "Please type the desired hostname: " NEW_HOSTNAME

一旦主機名稱存儲在NEW_HOSTNAME變數中,您可以像下面的示例一樣將變數提供給`hostnamectl`指令。

sudo hostnamectl set-hostname "$NEW_HOSTNAME"

就是這樣!結合這兩個單行指令,可以使命令在腳本中運作!但是,您還有一個額外的任務:配置網絡選項。

使用netplan設置IP地址信息

netplan指令是管理現代Ubuntu主機的網絡界面的IP地址信息的事實上方法。netplan工具使用YAML配置文件將網絡配置抽象出來,從而從各種後端讀取這些配置文件並在系統啟動期間應用於目標網絡界面。

為什麼這很重要?

將您的網絡配置保存為YAML格式,使您能夠開始保存或備份配置到Git存儲庫。由於Git提供了變更跟踪功能,您可以在將來使用CI / CD管道進行部署時使用相同的配置文件,而無需重新創建它。您知道,這就是DevOps的力量!

在向配置文件添加行之前,您必須使用touch命令創建配置文件。

sudo touch ~/99-custom.yaml

上述命令將將新配置文件放入您的主目錄。從這里,您將運行echo命令echo您輸入的內容,並使用STDOUT的輸入重定向逐行將其注入到配置文件中,使用>(添加)和>>(追加)。

注意:在YAML中,使用雙空格而不是制表符進行縮進。

echo "network:" > ~/99-custom.yaml
echo "  ethernets:" >> ~/99-custom.yaml
echo "    enp0s31f6:" >> ~/99-custom.yaml
echo "      dhcp4: false" >> ~/99-custom.yaml
echo "      addresses:"
echo "       - [$IP_ADDRESS]" >> ~/99-custom.yaml
echo "      routes:"
echo "       - to: default"
echo "         via: $GATEWAY_ADDRESS" >> ~/99-custom.yaml
echo "      nameservers:" >> ~/99-custom.yaml
echo "        addresses: [$PRIMARY_DNS_ADDRESS, $SECONDARY_DNS_ADDRESS, 208.67.222.222, 208.67.220.220]" >> ~/99-custom.yaml
echo "  version: 2" >> ~/99-custom.yaml

使用每個echo命令,通過使用STDOUT進行輸入重定向,您可以使用適當的間距構建YAML配置。或者,您可以使用文本編輯器手動構建此文件。但是,您無需手動構建文件。

相反,提示用戶使用相同的read命令輸入所需的IP地址信息。

提示:在Ubuntu上列出所有網絡接口信息的一種方法是運行ip address命令。

read -p "Now type the IP address in CIDR notation, i.e. 192.168.1.1/24: " IP_ADDRESS
read -p "The gateway IP: " GATEWAY_ADDRESS
read -p "The primary DNS IP: " PRIMARY_DNS_ADDRESS
read -p "And finally, the secondary DNS IP: " SECONDARY_DNS_ADDRESS

這樣更好。您現在可以將用戶輸入重新導向到一些變量,以供腳本使用。

在完成網絡選項後,現在是時候建立一個單一腳本了!

將所有內容組合到一個Bash腳本中

現在,您將從前幾節中學到的內容結合到一個Bash腳本中。打開您喜歡的編輯器,粘貼下面的代碼,然後將文件保存為~/host_deploy.sh如果您想查看其他常見屬性,請務必閱讀netplan手冊頁

#! /usr/bin/env bash
# host_deploy.sh
# 描述:
# 用於 Ubuntu Server ovf 模板。假定 Ubuntu Cloud 映像和默認 sudo 帳戶。
# 此腳本須以 sudo 執行。
# 示例:
# sudo bash ~/host_deploy.sh

# 從用戶獲取輸入
read -p "Please type the desired hostname: " NEW_HOSTNAME
read -p "Now type the IP address in CIDR notation, i.e. 192.168.1.1/24: " IP_ADDRESS
read -p "The gateway IP: " GATEWAY_ADDRESS
read -p "The primary DNS IP: " PRIMARY_DNS_ADDRESS
read -p "And finally, the secondary DNS IP: " SECONDARY_DNS_ADDRESS

# 設置新主機名
sudo hostnamectl set-hostname "$NEW_HOSTNAME"

# 創建新的 netplan yaml 配置文件
sudo touch ~/99-custom.yaml

# 將網絡配置應用於 netplan yaml 配置文件
# 這裡對適配器名稱做了一些假設
echo "network:" > ~/99-custom.yaml
echo "  ethernets:" >> ~/99-custom.yaml
echo "    enp0s31f6:" >> ~/99-custom.yaml
echo "      dhcp4: false" >> ~/99-custom.yaml
echo "      addresses:"
echo "       - [$IP_ADDRESS]" >> ~/99-custom.yaml
echo "      routes:"
echo "       - to: default"
echo "         via: $GATEWAY_ADDRESS" >> ~/99-custom.yaml
echo "      nameservers:" >> ~/99-custom.yaml
echo "        addresses: [$PRIMARY_DNS_ADDRESS, $SECONDARY_DNS_ADDRESS, 208.67.222.222, 208.67.220.220]" >> ~/99-custom.yaml
echo "  version: 2" >> ~/99-custom.yaml

# 將自定義配置複製到 netplan 文件夾並應用
sudo cp ~/99-custom.yaml /etc/netplan/99-custom.yaml

# 應用新的配置
sudo netplan apply

# 提醒重新啟動以重置狀態
echo "Please restart to complete host deployment!!"

要執行該腳本,請在終端中運行以下命令以調用腳本,使用bash

sudo bash ~/host_deploy.sh

該腳本將提示您輸入新的主機名和 IP 地址信息,並提醒您重新啟動主機以使更改生效。

現在您在用戶目錄中有一個可工作的腳本,您可以創建一個黃金映像以重複使用或與技術人員和經常執行此任務的人分享。

結論

恭喜!您已經完成了本文並建立了一個可以重複使用的完全功能的 Bash 腳本。

您也可以嘗試使用這個腳本與 Ansible,並使用 Ansible play 回答問題。本教程中的任務只是您可以開始在構建和部署腳本中使用的初始配置項的一小部分。

現在您已經知道如何接受用戶輸入,使用 Bash 腳本設置基本系統參數,並在 Ubuntu Linux 中應用該技術以更改主機名和 IP 地址。

Source:
https://adamtheautomator.com/change-linux-ip-hostname-bash-script/