Azure VMのカスタムデータ(cloud-init)の利用方法(OS日本語化やインストール)

2021-12-26Azure,Others,RockyLinux/CentOS,Virtual Machine

仮想マシン(Azure VM)作成時にカスタムデータ(cloud-init)を使用してOSの初期設定を行う手順の紹介です。
タイムゾーンやロケールの設定、パッケージのインストール、アップデート、起動設定などを例として紹介します。

Azure Portalで仮想マシンを作成する際、詳細タブ内にカスタムデータという項目があります。
カスタムデータを設定すると、仮想マシン作成と同時にスクリプトなどのユーザーデータをOSに配置することができます。
Linux OSの場合、仮想マシン作成に併せてcloud-initを利用したOSの初期設定ができます。

Azure 仮想マシンでのカスタム データと cloud-init
Azure での仮想マシンに対する cloud-init のサポート

Rocky Linuxを例に、タイムゾーン、ロケールの設定からパッケージのインストール、自動起動などをカスタムデータ(cloud-init)使って設定する手順を紹介します。

※動作確認はRocky Linux release 9.4 (Blue Onyx)を利用して実施しています。

スポンサーリンク

cloud-initやカスタムデータとは

cloud-initとは

cloud-initは、Linux OSを初期化および設定するためのツールです。
仮想マシン作成と同時にパッケージのインストールやユーザー追加のような初期設定が出来ます。
Red Hat Linux、Rocky LinuxやUbuntuなどで使用されます。

cloud-init Documentation

主にクラウド環境で利用されます。
元々はAWSのEC2のインスタンス用に開発されたそうですがAzureの仮想マシンでも利用可能です。
cloud-config、Bashスクリプト、MIMEマルチパート形式と言った形式で設定できます。

マイクロソフト公式サイトでもcloud-initについて紹介されています。

cloud-init を深く知る

カスタムデータとは

仮想マシン作成時にcloud-initの設定情報を渡す方法になります。
カスタムデータにcloud-initを記載しておくと、仮想マシンデプロイ時に自動的に処理させる事が出来ます。
仮想マシン作成時の詳細タブに設定項目があります。

カスタムデータ

詳細タブに"カスタムデータとcloud-init"という項目があります。
cloud-initで処理させる内容を記載します。

※Rocky Linuxのイメージを選択しているので、"cloud-initによって処理されます"というメッセージが表示されます。

カスタムデータとCloud-Initの項目(Azure VMの作成画面の詳細タブ)

拡張機能にカスタムスクリプトもあります

仮想マシンの拡張機能にもカスタムスクリプトと呼ばれるスクリプトを実行させる機能があります。
カスタムスクリプトについてはこちらの記事で紹介しています。

仮想マシン作成と同時にTimeZoneやLocaleを設定

cloud-initのサンプルやモジュール

cloud-initの設定方法は公式サイトに記載されています。
モジュールの使い方が解説されています。

Cloud config examples
Modules

TimeZoneやlocaleを日本に設定

カスタムデータを利用して、OSのTimeZoneとLocaleを日本に設定してみます。
公式サイトにTimeZoneとLocaleサンプルがあるのでこちらを利用します。

Locale
Timezone

最初に#cloud-configと記載します。
これはcloud-configで記載しているという宣言になります。

cloud-configのサンプル

設定したカスタムデータです。
TimeZoneとLocaleを指定しています。

#cloud-config
timezone: Asia/Tokyo
locale: ja_JP.utf8
カスタムデータとCloud-Initの設定例(TimeZoneやlocale)(Azure VMの作成画面の詳細タブ)

仮想マシン作成後にTimeZoneとLocaleを確認

カスタムデータを設定した場合と、設定してない場合を比較してみました。
仮想マシン作成直後にOSにログインして確認しています。

    • カスタムデータ設定無し
      • Time zone: UTC (UTC, +0000)
      • LANG=C.UTF-8
    • カスタムデータ設定有り
      • Time zone: Asia/Tokyo (JST, +0900)
      • LANG=ja_JP.utf8
カスタムデータの設定有無による比較

“timedatectl status"、"locale"、"localectl"コマンドの実行結果を比較します。
カスタムデータ設定内容が反映されている事が確認できます。

カスタムデータを設定していない場合

[root@test-vm-01 ~]# timedatectl status
Local time: Sun 2024-06-09 06:42:59 UTC
Universal time: Sun 2024-06-09 06:42:59 UTC
RTC time: Sun 2024-06-09 06:43:00
Time zone: UTC (UTC, +0000)
~(以下略)~
[root@test-vm-01 ~]# locale
LANG=C.UTF-8
LC_CTYPE="C.UTF-8″
~(以下略)~

[root@test-vm-01 ~]# localectl
System Locale: LANG=C.UTF-8
VC Keymap: us
X11 Layout: us

カスタムデータを設定した場合

[root@test-vm-01 ~]# timedatectl
Local time: Sun 2024-06-09 15:54:44 JST
Universal time: Sun 2024-06-09 06:54:44 UTC
RTC time: Sun 2024-06-09 06:54:44
Time zone: Asia/Tokyo (JST, +0900)
~(以下略)~
[root@test-vm-01 ~]# locale
LANG=ja_JP.utf8
LC_CTYPE="ja_JP.utf8″
~(以下略)~
[root@test-vm-01 ~]# localectl
System Locale: LANG=ja_JP.utf8
VC Keymap: us
X11 Layout: us

cloud-initのModuleに記載があるModule frequencyとは何?

cloud-initのモジュールを確認しているとModule frequencyと言う項目があります。
これはいつ実行されるのかを表記しています。

CLOUD-INIT モジュールはフェーズごとに実行される

Localeの場合はonce-per-instanceと記載があります。
インスタンスの初回起動時に1回だけ実行される事を表しています。

カスタムデータ(cloud-init)を使ったコマンド実行、パッケージインストールやアップデート

カスタムデータ(cloud-init)のサンプル

マイクロソフト公式サイトにパッケージの更新やインストールのサンプルがあります。

cloud-init で VM を更新する

cloud-initのサイトでコマンド実行のサンプルが紹介されています。

Modules

パッケージのアップデート、Apacheインストールから自動起動設定

Webサーバー作成をイメージして、カスタムデータ(cloud-init)のサンプルを作成してみます。

    • 設定内容
      • TimeZoneをAsia/Tokyoに設定
      • localeをja_JP.utf8に設定
      • keymapをjp106に設定
      • パッケージをすべてアップデート(dnf -y update)
      • glibc-langpackの関連パッケージをインストール
      • Apache(httpd)のパッケージをインストール
      • Apache(httpd)の起動設定
cloud-configのサンプル

package_upgradeの項目がパッケージアップデートの設定です。
アップデートする場合はtrueを設定します。

packages:の項目が追加するパッケージの設定です。
指定したパッケージが追加されます。

runcmdの項目が実行するコマンドの設定です。
記載したコマンドが実行されます。

※仮想マシン作成直後に確認すると、cloud-initに設定した処理が完了していない場合があります。特にパッケージアップデートをtrueにした場合、cloud-init完了までに時間が掛かります。

#cloud-config
timezone: Asia/Tokyo
locale: ja_JP.UTF8
package_upgrade: true
packages:
– glibc-langpack-en.x86_64
– glibc-langpack-ja.x86_64
– httpd
runcmd:
– systemctl start httpd
– systemctl enable httpd
localectl set-keymap jp106

カスタムデータとCloud-Initの設定例(Webサーバーの場合)

仮想マシン作成後にカスタムデータ(cloud-init)の設定が反映されているかを確認

仮想マシン作成後にカスタムデータ(cloud-init)を設定内容が反映されているか確認します。

カスタムデータ(cloud-init)の反映状況

“dnf check-update"でパッケージのアップデートを確認します。
アップデート済みである事が確認できます。

Apache(httpd)のステータスが起動中となっている事が確認できます。
自動起動も有効になっています。

※/var/log/cloud-init.logにも結果が出力されています。

[root@test-vm-01 ~]# dnf check-update
メタデータの期限切れの最終確認: 0:06:11 前の 2024年06月09日 17時27分56秒 に実施 しました。

[root@test-vm-01 ~]#
timedatectl status

Local time: 日 2024-06-09 17:34:26 JST
Universal time: 日 2024-06-09 08:34:26 UTC
RTC time: 日 2024-06-09 08:34:27
Time zone: Asia/Tokyo (JST, +0900)

[root@test-vm-01 ~]# locale
LANG=ja_JP.UTF8
LC_CTYPE="ja_JP.UTF8″

[root@test-vm-01 ~]# localectl
System Locale: LANG=ja_JP.UTF8
VC Keymap: jp106
X11 Layout: jp
X11 Model: jp106

[root@test-vm-01 ~]# systemctl status httpd
● httpd.service – The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; preset: di>
Active: active (running) since Sun 2024-06-09 17:33:21 JST; 1min 47s ago

最後に

仮想マシン作成時のカスタムデータ(cloud-init)設定について確認してみました。
OSの日本語化やパッケージのインストールと言った初期設定が出来てとても便利かと思います。
ユーザー追加などについてもサンプルが公開されており、その他にも色々な事ができそうです。

cloud-init で VM にユーザーを追加する

引き続き色々試してみたいと思います。

Rocky Linuxの仮想マシン作成手順についてはこちらで紹介しています。
初期設定に関する内容なども紹介しています。

Rocky Linuxの仮想マシン作成時の管理者アカウントについてはこちらで紹介しています。
初期設定に関する内容なども紹介しています。

スポンサーリンク