Ubuntu IPとホスト名をBash経由で更新する方法

UbuntuコンピューターのIPアドレスとホスト名を管理する方法はいくつかあります。システム管理者は、nmcli、netplan、hostname、hostnamectlというツールを使用できます。これらのツールはそれぞれ優れた機能を持っていますが、これらのツールを組み合わせて自動化を向上させる方法はありますか?

それには、設定を行うBashスクリプトを作成することができます。この記事では、入力を受け付けるBashスクリプトを使用して新しいホスト名を設定し、IPアドレス情報を設定する方法について学びます。

各例は前の例に基づいて構築されます。記事の最後までに、新しいまたは既存のUbuntuホストで使用するための完全に機能する構成スクリプトを作成するために必要な知識が身につきます。

前提条件

このチュートリアルに従うためには、Bashシェルスクリプトの専門家である必要はありませんが、以下の要件を満たしていることを確認してください。

  • 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」コマンドを実行し、新しいホスト名をダブルクォート(””)で囲まれた文字列値として指定することで、一般的なパラメータを使用してコマンドを実行することができます。手動でこのコマンドを実行する場合、問題なく動作するはずです。

しかし、ユーザー入力を受け付けるスクリプトに組み込む場合はどうでしょうか?まず、readコマンドを使用して、-pパラメータ(promptを意味する)と、このプロンプトに対してユーザーに入力する内容を示す文字列を指定します。そして、入力をNEW_HOSTNAMEという新しい変数に保存します。

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

ホスト名がNEW_HOSTNAME変数に保存されたら、以下の例のように変数をhostnamectlコマンドに指定することができます。

sudo hostnamectl set-hostname "$NEW_HOSTNAME"

以上です!これらの2つのワンライナーを組み合わせることで、スクリプト内でコマンドを実行することができます!ただし、追加のタスクがあります:ネットワークオプションの設定です。

netplanを使用してIPアドレス情報を設定する

netplanコマンドは、モダンなUbuntuホストのネットワークインターフェースのIPアドレス情報を管理するためのデファクトスタンダードの方法です。netplanツールは、YAML形式の設定ファイルを使用して、さまざまなバックエンドからネットワークの設定を抽象化します。

netplanツールは、システムの起動時にこれらの設定ファイルを読み込み、対象のネットワークインターフェースに適用します。なぜこの点が重要かというと、おそらく次のような理由があるからです。

ネットワーク構成をYAML形式で持つことで、Gitリポジトリに構成を保存またはバックアップを開始することができます。Gitは変更の追跡機能を提供するため、同じ構成ファイルを再作成する必要なく、将来のデプロイメントに対してCI / CDパイプラインを使用できます。DevOpsのことですね!

構成ファイルに行を追加する前に、touchコマンドを使用して構成ファイルを作成する必要があります。

sudo touch ~/99-custom.yaml

上記のコマンドは新しい構成ファイルをホームディレクトリに配置します。ここから、echoコマンドを実行して、入力のリダイレクションを使用して構成ファイルに1行ずつ入力を注入します。 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でネットワークインターフェイス情報をすべてリストする方法の1つは、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 プレイを使って質問に答えることもできます。このチュートリアルのタスクは、ビルドとデプロイメントのスクリプトで使用できる初期設定アイテムのごく一部にすぎません。

今ではユーザーの入力を受け入れ、Bash スクリプトを使用して基本的なシステムパラメーターを設定し、Ubuntu Linux でホスト名と IP アドレスを変更する技術を適用する方法を知っています。

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