cloud-initを使ったLinux初期設定の自動化 in Azure

Azure環境でLinux 仮想マシンをデプロイした後、ユーザーの追加やパッケージのインストール、ロケールの変更など、初期設定を実施することがほとんどかと思います。

こういった初期設定を、cloud-initを使用することで自動化することができます。

しかし自分の周りだとあまり使っている人も見かけないので、今回はAzure環境でcloud-initを使用する方法について記事にまとめてみました。

cloud-initってなに?

cloud-initは、クラウド環境でLinux 仮想マシンの初期設定を自動化するためのツールです。

初回起動時に設定を定義したファイルを読み込み、指定された設定やインストールを実行します。

cloud-initの特徴

cloud-initの特徴として、以下が挙げられます。

  1. Linuxのオープンソースツールであり、AWSやAzure、GCPといったクラウドプラットフォームで使用可能。
  2. 定義ファイルの再利用性が高く、同じ設定を複数の仮想マシンで再利用できる。
  3. 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形式で記述され、各モジュールで構成されます。

使用可能なモジュールについては、以下の公式ドキュメントを参照ください。

cloudinit.readthedocs.io

今回の上記想定の初期設定を行うため、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を使用可能なイメージについては、以下の公開ドキュメントを参照してください。

learn.microsoft.com

その他の項目については、任意で選択してください。

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のデバッグの方法など、より詳しい内容も書けたらと思います。

執筆担当者プロフィール
桑原 真也

桑原 真也(日本ビジネスシステムズ株式会社)

ハイブリッドクラウド本部所属。 Azureのインフラ設計・構築や、Azureへの移行業務など、幅広く経験しています。左利きです。

担当記事一覧