Azure環境でLinux 仮想マシンをデプロイした後、ユーザーの追加やパッケージのインストール、ロケールの変更など、初期設定を実施することがほとんどかと思います。
こういった初期設定を、cloud-initを使用することで自動化することができます。
しかし自分の周りだとあまり使っている人も見かけないので、今回はAzure環境でcloud-initを使用する方法について記事にまとめてみました。
cloud-initってなに?
cloud-initは、クラウド環境でLinux 仮想マシンの初期設定を自動化するためのツールです。
初回起動時に設定を定義したファイルを読み込み、指定された設定やインストールを実行します。
cloud-initの特徴
cloud-initの特徴として、以下が挙げられます。
- Linuxのオープンソースツールであり、AWSやAzure、GCPといったクラウドプラットフォームで使用可能。
- 定義ファイルの再利用性が高く、同じ設定を複数の仮想マシンで再利用できる。
- RHELやUbuntu、Debianなど複数のLinuxディストリビューションに対応している。
cloud-initのメリット・デメリット
cloud-initを使用することの一番のメリットは、やはり初期設定を自動化できるところです。
デプロイ後に設定コマンドをコピー&ペーストで実行することは、手間と作業ミスの原因になりかねません。一度定義ファイルを作成することで、作業ミスと手間を減らすことに繋がります。
cloud-initのデメリットとしては、大規模なサーバ群の構成には向いていないことです。
cloud-initは構成管理ツールではないため、初期設定後にさらに設定変更を行うことはできません。
cloud-initのサポート状況
Microsoftは、Linuxのディストリビューションパートナーと連携し、cloud-initに対応したイメージを提供しています。
仮想マシンの作成時は、Azure Marketplaceにて、cloud-initが既にインストールされたイメージを使用することでcloud-initを利用できます。
以下はcloud-initがインストールされたイメージの一部です。
イメージ提供元 | プラン | サポートバージョン |
---|---|---|
Canonical | UbuntuServer | 18.04-LTS 以上 |
Red Hat | RHEL | 7.7 以上 |
OpenLogic | CentOS | 7.7 以上 |
Oracle | Oracle Linux | 77 以上 |
cloud-initを使用してVMを作成する
では、実際にcloud-initを使用してLinux仮想マシンを作成してみます。
今回はイメージとして、Azure Marketplaceで提供されているRed Hatの「Red Hat Entereprise Linux 8.7 (LVM)」を使用します。
今回は例として、よくある以下の初期設定を行う想定とします。
- タイムゾーンの変更
- ロケールの変更
- SELinuxの無効化
- ファイアウォールの無効化
- swap領域の有効化、サイズ変更
また、仮想マシンのデプロイ方式として、Azure ポータルとAzure CLIの2パターンで記載します。
※リソースグループや仮想ネットワークなどの必須コンポーネントは既に作成済みであることを前提としています。
cloud-configの作成
cloud-initを使用する際、cloud-configという初期設定の定義を作成する必要があります。
cloud-configはyaml形式で記述され、各モジュールで構成されます。
使用可能なモジュールについては、以下の公式ドキュメントを参照ください。
今回の上記想定の初期設定を行うため、cloud-configは以下のように記述します。
#cloud-config timezone: Asia/Tokyo package_upgrade: true packages: - glibc-langpack-ja locale: ja_JP.utf8 runcmd: - setenforce 0 - sed -i -e 's/^\SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config - systemctl stop firewalld - systemctl disable firewalld - sed -i -e 's/^\ResourceDisk.Format=n/ResourceDisk.Format=y/g' /etc/waagent.conf - sed -i -e 's/^\ResourceDisk.EnableSwap=n/ResourceDisk.EnableSwap=y/g' /etc/waagent.conf - sed -i -e 's/^\ResourceDisk.SwapSizeMB=2048/ResourceDisk.SwapSizeMB=8192/g' /etc/waagent.conf - reboot
上記cloud-configでは、以下のモジュールを使用しています。
- timezone:
- タイムゾーンを変更するモジュール。今回は東京に変更。
- package_upgrade:
- パッケージリストのアップデートするモジュール。
- packages:
- 指定したパッケージをインストールするモジュール。今回は日本語パックをインストールします。
- locale:
- ロケールを変更するモジュール。今回は日本語に変更。
- runcmd:
- 変更したい設定のモジュールが用意されていない場合、runcmdモジュールの値としてコマンドを記述することで自動で実行してくれます。
- 今回は「SELinux無効化」「ファイアウォール無効化」「Swap領域の有効化・サイズ変更」「再起動」を実行するコマンドを記述しています。
cloud-configが作成できたら、実際にcloud-initを使用していきます。
Azure ポータルでの使用方法
AzureポータルのGUI操作でcloud-initを使用する方法を記載します。
1.Azureポータルで仮想マシンの作成画面に移動します。
2.[基本]タブの「イメージ」にて、「Red Hat Entereprise Linux 8.7 (LVM)」を選択します。 ※Azure Marketplaceでcloud-initを使用可能なイメージについては、以下の公開ドキュメントを参照してください。
その他の項目については、任意で選択してください。
3.[詳細]タブの「カスタムデータ」にて、作成したyaml形式のcloud-configを貼り付けます。
4.作成ボタンをクリックして仮想マシンをデプロイします。
完了後、仮想マシンにSSH接続し、初期設定が反映されているか確認します。
Azure CLIでの使用方法
Azure CLIでcloud-initを使用する方法を記載します。
Azure CLIを使用するパターンとして、Cloud Shellを使用する方法と、端末にAzure CLIをインストールする方法の2パターンがありますが、今回は端末にインストールしてAzure CLIを使用します。
1.作成したcloud-configを任意の名前で作業ディレクトリに保存します。
今回は「customData.txt」とします。
2.PowerShellを起動し、az loginコマンドでAzureに接続します。
3.以下のaz vm createコマンドを実行して仮想マシンを作成します。
オプションとして「--custom-data」を使用し、作成したcloud-configファイルを指定することで、cloud-initに定義を渡します。
az vm create ` --resource-group "test-rg-01" ` --name "test-vm-0002" ` --vnet-name "test-vnet-01" ` --subnet "default" ` --image "RedHat:RHEL:8_7:8.7.2023022801" ` --authentication-type "password" ` --admin-username "azureadmin" ` --admin-password "P@ssw0rd1234" ` --custom-data "customData.txt"
4.完了後、仮想マシンにSSH接続し、初期設定が反映されているか確認します。
まとめ
今回はAzure環境でcloud-initを使用してLinux 仮想マシンの初期設定を自動化する方法について書きました。
cloud-configは再利用性が高いので、一度ベースを作っておくと、今後も使いまわせて作業の効率化が図ることができます。
次はcloud-initのデバッグの方法など、より詳しい内容も書けたらと思います。