如何通过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主机的根权限。
  • A text editor, such as vim, nano, or VSCode.

使用hostnamectl设置主机名

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

sudo hostnamectl set-hostname "new-hostname"

运行`hostnamectl`命令,使用`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配置文件将网络配置从各种后端抽象出来。

netplan工具在系统启动期间读取这些配置文件并将它们应用于目标网络接口。为什么这很重要,您可能会问?

拥有以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

这样更好。现在你可以将用户输入重定向到几个变量,以供脚本使用。

还有许多其他属性可以设置,本教程没有详细介绍。如果您想查看其他常见属性,请务必阅读netplan 手册页

网络选项完成后,现在是时候构建一个单独的脚本了!

在 Bash 脚本中将所有内容组合在一起

现在,您将把之前学到的所有内容结合到一个单独的 Bash 脚本中。打开您喜欢的编辑器,粘贴下面的代码,并将文件保存为~/host_deploy.sh

#! /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/