さくらのクラウド上でマシンイメージを自動構築 〜「Packer for さくらのクラウド」

さくらのクラウド上でマシンイメージを自動構築するツール「Packer for さくらのクラウド」をご紹介いたします。

「Packer for さくらのクラウド」とは、オープンソースのマシンイメージ作成ツール「Packer」にて、さくらのクラウド用のマシンイメージを構築するためのプラグインです。

さくらのクラウド上ですぐに利用できるマシンイメージを作成

Packer for さくらのクラウドは、さくらのクラウドでのサーバー作成時にテンプレートとして指定できる「アーカイブ」と呼ばれるマシンイメージを構築できます。アーカイブとはAWSでのAMI、DigitalOceanでのDropletに相当する、再利用可能なOSテンプレートのようなものです。

さくらのクラウドには「パブリックアーカイブ」と呼ばれるアーカイブが標準で利用できるようになっているのですが、パブリックアーカイブから作成したサーバーは、さくらのクラウド用に調整されているものの、OS環境はほぼ初期状態のものです。
実際にサービス投入する際にはOSアカウントの作成や必要なライブラリ/ミドルウェアのインストール、アプリケーションの配置など様々な設定作業を行う必要があります。

Packer for さくらのクラウドでは煩雑になりがちなこれらの設定作業をテンプレートと呼ばれる設定ファイルに従って自動化することができます。

Packer for さくらのクラウドはPackerプラグインとして動作しますので、Packerの持つ豊富なプロビジョニング機能をそのまま利用できます。
つまり、シェルスクリプト(Linux系)、PowerShell(Windows)、Ansible、ChefなどでOSをプロビジョニングすることが可能です。

ISOイメージからのOSインストールも自動化できる

通常、クラウド上でPackerを利用する場合、各種設定コマンドの実行のためにSSHやWinRMで対象マシンに接続する必要があります。

CentOSなどのパブリックアーカイブからサーバーを作成した場合はすでにSSHが有効になった状態のサーバーが作成されるためそのままPackerでプロビジョニングできるのですが、WindowsパブリックアーカイブやISOイメージからの新規OSインストールの場合は、コンソールを直接操作することでSSH/WinRMが利用可能な状態までもっていく必要があります。

この問題への対応として、Packer for さくらのクラウドにおいてVNC接続をサポートしました。

さくらのクラウドでは、サーバーへのコンソール接続にVNCが利用できます。
VNC経由でキーボード入力を送信することで、OSインストール作業についてもPackerで自動化することが可能となりました。

Packer for さくらのクラウドのセットアップ

Packer for さくらのクラウドを実行するためには以下の準備/設定が必要です。

  • Packer 実行ファイルの取得/配置
  • Packer for さくらのクラウド 実行ファイルの取得/配置
  • さくらのクラウド APIキーの作成/設定

順番に説明します。

※なお、Packer for さくらのクラウドはDockerイメージでも配布しています。
詳細はPacker for さくらのクラウドのドキュメントを参照ください。

Packer 実行ファイルの取得/配置

Packerの公式サイトからPacker実行ファイルをダウンロードします。

Packer ダウンロードページ

ダウンロードしたらパスの通ったディレクトリに配置し、実行権を付与しておきましょう。

Packer for さくらのクラウド 実行ファイルの取得/配置

実行ファイルはGitHubのリリースページにて公開しています。
以下のページから最新版をダウンロードしてください。

Packer for さくらのクラウド リリースページ

ダウンロードしたら、以下のいずれかのディレクトリに配置してください。

  • Packer実行ファイルと同じディレクトリ
  • ホームディレクトリ配下(OSにより異なります)
    • Unix系OSの場合 ~/.packer.d/plugins
    • Windows系OSの場合%APPDATA%/packer.d/plugins

さくらのクラウド APIキーの作成/設定

さくらのクラウド コントロールパネルにログインし、APIキーを作成します。

作成したAPIキーのトークンとシークレットを環境変数に設定しておきます。

# APIキー アクセストークン
$ export SAKURACLOUD_ACCESS_TOKEN=取得したアクセストークン

# APIキー シークレット
$ export SAKURACLOUD_ACCESS_TOKEN_SECRET=取得したシークレット

以上でセットアップ完了です。

パブリックアーカイブからマシンイメージ作成

それでは早速Packer for さくらのクラウドでのマシンイメージ作成を実践していきましょう。

最初の例として、CentOSパブリックアーカイブを起点に、Dockerをインストールした状態のイメージを作成してみます。

以下の内容のテンプレートファイル「template.json」を作成してください。

{
    "builders": [{
        "type": "sakuracloud",
        "zone": "is1b",
        "os_type": "centos",
        "password": "TestUserPassword01"
    }],
    "provisioners":[
    {
        "type": "shell",
        "inline": [
            "yum update -y",
            "curl -fsSL https://get.docker.com/ | sh",
            "systemctl enable docker.service"
        ]
    }]
}

※上記ファイルはGitHubでも公開しています。また、「password」部分については適宜変更してご利用ください。

「builders」配下にPacker for さくらのクラウド用の設定を記載していきます。
今回は以下の値を指定しています。

  • 対象ゾーンに「is1b」(石狩第2ゾーン)
  • 起点として「centos」(CentOSパブリックアーカイブの最新安定板)
  • パスワードとして「TestUserPassword01」

これら以外に指定できる項目/値についてはドキュメントを参照ください。

次に、「provisioners」配下にプロビジョニング内容を記載していきます。
今回はシェルスクリプトにてDockerをインストールという手順を記載しています。

シェルスクリプト以外にもChef/Ansible/Puppetなどのツールも利用できます。
詳細はPackerのドキュメントを参照ください。

テンプレートファイル「template.json」を作成したら、以下のコマンドでイメージのビルドを行います。

$ packer build template.json

しばらく待つと、さくらのクラウド上にアーカイブが作成されるはずです。

ISOイメージからのOSインストール & マシンイメージ作成

次に応用編として、ISOイメージからのOSインストールを行い、マシンイメージを作成してみます。

例として、CentOS Atomic HostをISOイメージからインストールしてみます。
ISOイメージのダウンロードやチェックサムの検証、さくらのクラウドへのアップロードなど、面倒な作業はPacker for さくらのクラウドが行ってくれます。

テンプレートファイルには以下の内容を記載します。

{
  "builders": [{
    "type": "sakuracloud",
    "zone": "is1b",
    "os_type": "iso",
    "password": "TestUserPassword01",
    "iso_url": "http://cloud.centos.org/centos/7/atomic/images/CentOS-Atomic-Host-7-Installer.iso",
    "iso_checksum": "e26651dd1c3dde5b6dfee088876189fb29fb79f729e86fcd516fe87ccd992381",
    "iso_checksum_type": "sha256",
    "boot_command": [
      "<tab>",
      "<tab>",
      " inst.text net.ifnames^0<enter>",
      "<wait10>",
      "<esc>",
      "<wait30s>",

      "2<enter><wait5>",
      "5<enter><wait5>",
      "<enter><wait5>",
      "70<enter><wait5>",
      "<wait>",

      "3<enter><wait5>",
      "c<enter><wait5>",
      "c<enter><wait5>",
      "c<enter><wait5>",
      "<wait>",

      "5<enter><wait5>",
      "2<enter><wait>",
      "7<enter><wait>",
      "c<enter><wait5>",
      "c<enter><wait5>",
      "<wait>",

      "6<enter><wait5>",
      "TestUserPassword01<enter><wait>",
      "TestUserPassword01<enter><wait>",
      "<wait>",

      "b<enter>",
      "<wait3m>",

      "<enter>",
      "<wait1m>",

      "<wait>"
    ],
    "boot_wait": "30s"

  }]
}

最初の例と比べて、以下の項目が追加されています。

  • ISOイメージ関連の設定(ダウンロード元URLやチェックサムなど)
  • OSインストール用のキー入力内容「boot_command」

ポイントは「boot_command」の部分です。
これは、対象マシンをさくらのクラウド上で起動した後に、VNC経由で対象マシンに送信するキーボード入力を表します。

通常のキー入力はもちろん、<>で囲む記法を用いることでctrlやalt、delといった特殊キーを送信することもできます。
この記法はPackerが標準でサポートしているVMWare/qemuビルダーのboot_commandと互換性があり、すでにVMWareやqemu用に作成されたテンプレートファイルのboot_commandをそのまま再利用することも可能です。

テンプレートファイルを作成したらpacker buildを実行してみてください。
ISOイメージのダウンロード〜マシンイメージ構築まで一気に行われます。

※なお、packer buildを実行中に、さくらのクラウドのコントロールパネルから対象マシンのコンソールを開くと、VNC経由でboot_commandが送信されている様子を確認することができます。勝手に画面が動くので眺めていると面白いですよ!

Windows + 応答ファイルでのマシンイメージ作成

boot_commandを駆使すればWindowsもプロビジョニング可能です。
ただし、boot_commandを一から組み立てていくのは割と大変な作業です。

そこで、各OSがサポートしている自動インストールの仕組みを併用することで、
さらに楽にマシンイメージを作成することができます。

RedHat系であればkickstart、Debian系であればPreseed、そしてWindowsであれば応答ファイルを利用した無人インストールなどです。

今回はWindows + 応答ファイルの例をご紹介いたします。


この例のサンプルは以下で公開しています。

Windows + 応答ファイルでのマシンイメージ構築のサンプル

ポイントは以下の通りです。

  • あらかじめ応答ファイル(参考:MSDN / Windows セットアップの自動化の概要)を作成しておく
  • 作成した応答ファイルを含むISOイメージをmkisofsコマンドなどで作成する
  • 作成したISOファイルをさくらのクラウドにアップロード
  • さくらのクラウドでWindowsサーバー作成時に、ISOイメージとして先ほど作成&アップロードしたファイルを指定する(WindowsからはCDROMとして見える)

あらかじめ応答ファイルを含むISOイメージを作成し、さくらのクラウド上にアップロードしておく必要があります。

今回は応答ファイルについては解説しませんが、サンプルとして以下の処理を行うような応答ファイル含む「answer_file.iso」というISOイメージを作成しています。

  • 日本語環境の設定
  • 管理者パスワードの設定
  • 1回だけ自動ログインする
  • WinRMを有効にするスクリプトのダウンロード & 実行

また、ISOイメージのアップロードには「sacloud-upload-image」などのツールが利用できますので是非ご活用ください。

応答ファイルを含むISOイメージをアップロードしたら、以下のようなテンプレートを作成します。

{
    "builders": [{
        "type": "sakuracloud",
        "zone": "is1b",
        "os_type": "windows",
        "source_archive" : 112800764405,
        "iso_id": (応答ファイルを含むISOイメージのIDを指定),
        "disk_size": 100,
        "user_name" : "Administrator",
        "password": "TestUserPassword01",
        "winrm_use_ssl": true,
        "winrm_insecure" : true,
        "boot_wait": "120s"
    }],
    "provisioners":[
        {
            "type": "powershell",
            "inline": ["dir c:\\"]
        }]
}

「source_archive」には、Windows server 2012 DataCenterエディションのパブリックアーカイブのIDを指定しています。今後さくらのクラウド側のアップデートなどでIDが変わる可能性がありますので、適宜変更してください。

「iso_id」には、先ほどアップロードした、応答ファイルを含むISOイメージのIDを指定します。

あとはpacker buildを実行すれば、応答ファイルに従ってWindowsのインストール〜セットアップが実施されます。応答ファイル内でWinRMを有効にしていますので、「provisioners」で指定しているようにpowershellでのプロビジョニングも行えます。(今回はサンプルですので、powershellでの実行内容に意味はありません)

まとめ

Packer for さくらのクラウドなら、さくらのクラウド上で簡単にマシンイメージを作成できます。

作成したマシンイメージを使ってサーバーを作成することで、すぐに本番投入可能な状態のサーバーを作成することができます。

VNCをサポートしていることで、素のISOイメージからのOSインストールにも対応しています。これにより、パブリックアーカイブが提供されていないOSでも、手軽にサーバーで利用できるようになります。

今回はご紹介しきれなかったですが、「Terraform for さくらのクラウド」と組み合わせることで、マシンイメージはPackerで、作成したマシンイメージの配置、ネットワーク設定やアプリの投入はTerraformで、という形が取れます。

Packer for さくらのクラウドを利用することで、より一層「Infrastructure as Code」化ができると思いますので、是非一度お試しください!

以上です。