Azure仮想マシン作成時にカスタム データを使って日本語化やパッケージインストール

Azure Portalを使って仮想マシンを作成していると、詳細タブないにカスタムデータと言う項目が表示されます。
何かと思って調べてみると、cloud-initを使って仮想マシン(Linux)デプロイ時に処理を実行させる事が出来る機能でした。

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

Cent OS 8の仮想マシン作成時のカスタムデータを使ってタイムゾーン、ロケールの設定やパッケージのインストールを試してみました。

スポンサーリンク

cloud-initやカスタムデータって何

cloud-initって何

cloud-initとはLinuxで初回起動時に色々処理を行ってくれるLinux パッケージになります。

CLOUD-INIT の概要
cloud-init Documentation

具体的に言うと、初回作成時にパッケージのインストールやユーザー追加等、OS作成後に実施するような初期設定が出来ます。
元々はAWSのEC2のインスタンス用に開発されたそうですが、現在では幅広いLinuxディストリビューションで使う事が出来ますし、Azureの仮想マシンでも利用可能です。
cloud-config、Bashスクリプト、MIMEマルチパート形式と言った形式での設定が可能です。

マイクロソフト公式サイトでもcloud-initの解説がされております。

cloud-init を深く知る

カスタムデータって何

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

Azure仮想マシン作成時にカスタムデータを使ってTimeZoneやLocaleを設定

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

最初にcloud-initの公式サイトでサンプルやモジュールの解説を確認します。それぞれのモジュールの使い方が解説されています。

Cloud config examples
Modules

今回はCent OSでしたので、念のためRed Hatのサイトでサポートされているモジュールも併せて確認します。

RED HAT はこれらの CLOUD-INIT モジュールをサポートします

こちらのサイトを参考に設定してみます。今回は勉強も兼ねていますのでcloud-configを使っています。

TimeZoneやlocaleを日本に設定

サンプルを参考にTimeZoneとLocaleを日本に設定してみます。

cloud-configのサンプル

まずはcloud-initのサイトでTimeZoneとLocaleサンプルを探してみます。

Locale
Timezone

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

サンプルを参考にCent OSのコマンドと同じフォーマットで記載してみました。

#cloud-config
timezone: Asia/Tokyo
locale: ja_JP.utf8

仮想マシンデプロイ後にTimeZoneとLocaleを確認

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

カスタムデータを使ってみた場合の結果

timedatectl statusとlocaleコマンドの抜粋で比較してみました。

カスタムデータを設定しない場合は、Time zone: Etc/UTC、LANG=en_US.UTF-8になっているのに対して、日本語対応用のカスタムデータを設定してデプロイした仮想マシンではTime zone: Asia/Tokyo 、LANG=ja_JP.utf8となっているのが確認出来ました。

カスタムデータを設定せずにCent OS8.4をデプロイ

[root@cloud-init-base ~]# timedatectl status
Local time: Sun 2021-12-26 06:39:56 UTC
Time zone: Etc/UTC (UTC, +0000)
[root@cloud-init-base ~]# locale
LANG=en_US.UTF-8

カスタムデータを設定してCent OS8.4をデプロイ

[root@cloud-init-01 ~]# timedatectl status
Local time: 日 2021-12-26 15:39:37 JST
Time zone: Asia/Tokyo (JST, +0900)
[root@cloud-init-01 ~]# locale
LANG=ja_JP.utf8

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

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

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

Red Hatのサイトに解説がありますのでこちらを参考にLocaleの場合について確認してみます。
Localeの場合はonce-per-instanceと記載があります。これはモジュールがインスタンスの初回起動時に1回だけ実行されるという事になります。

Azure仮想マシン作成時にカスタムデータを使ってパッケージのアップデート、インストール、起動設定を試してみた

パッケージインストールやアップデートのサンプルを探す

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

cloud-init で VM を更新する

また、コマンドの実行についてはcloud-initのサイトにサンプルがあります。

Modules

こちらのサイトを参考に設定してみます。

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

パッケージインストールのサンプルとしてhttpdを使って試してみます。

      • 設定内容
        • TimeZoneをAsia/Tokyoに変更(前回実施内容)
        • localeをja_JP.utf8を変更(前回実施内容)
        • パッケージアップデート
        • httpdのインストール
        • httpdの起動設定
cloud-configのサンプル

マイクロソフト公式サイトを参考に設定を進めます。

package_upgradeの項目がアップデートの設定になります。trueにするとアップデートを行います。

packages:の項目が追加するパッケージの設定になります。httpdと記載するとhttpdのパッケージが追加されます。

runcmdの項目で実行コマンドが設定出来ます。今回はhttpdの起動と自動起動設定のコマンドを記載しています。

※アップデートをtrueにするとすべてのパッケージがアップデートされますのでcloud-init完了まで時間が掛かります。

#cloud-config
timezone: Asia/Tokyo
locale: ja_JP.utf8
package_upgrade: true
packages:
– httpd
runcmd:
– sudo systemctl start httpd
– sudo systemctl enable httpd

仮想マシンデプロイ後にhttpdのステータスやパッケージのアップデートを確認

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

カスタムデータを使ってみた場合の結果

カスタムデータを設定していない場合はhttpdパッケージのインストールがされておらず、yum updateも実行されていない事が分かります。

一方でカスタムデータの設定した場合はhttpdのステータスが起動中(自動起動も有効)になっている事が分かります。またyumもアップデート済みの為、check-updateでパッケージリストが表示されていない事が分かります。

※/var/log/cloud-init.logにyum updateの結果が出力されていますので、こちらでも確認が可能です。

カスタムデータを設定せずにCent OS8.4をデプロイ

[root@cloud-init-base ~]# systemctl status httpd
Unit httpd.service could not be found.

[root@cloud-init-base ~]# yum check-update
Last metadata expiration check: 2:30:13 ago on Sun 26 Dec 2021 06:33:23 AM UTC.

ModemManager-glib.x86_64 1.10.8-4.el8 BaseOS-openlogic
ModemManager-glib.x86_64 1.10.8-4.el8 baseos

カスタムデータを設定してCent OS8.4をデプロイ

[root@cloud-init-02 ~]# systemctl status httpd
● httpd.service – The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor prese>
Active: active (running) since Sun 2021-12-26 17:43:47 JST; 1min 2s ago
Docs: man:httpd.service(8)

[root@cloud-init-02 ~]# yum check-update
メタデータの期限切れの最終確認: 0:33:29 時間前の 2021年12月26日 17時30分15秒 に 実施しました。

最後に

Azure 仮想マシン作成時のカスタムデータを使うとデプロイ時に一緒に設定が出来る為非常に便利かと思いました。
その他ユーザー追加等についてもマイクロソフト公式サイトにサンプルがあります。今後も色々試してみたい所です。

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