2020年、さくらのクラウドにサーバを構築するにあたり楽になるかも AND 新しいものに触れたい
ということでPackerを使ってみました。
せっかくなので備忘録として使い方を残しておきたいと思います。
Vagrant、Terraformを手がけるHashicorp社が提供している仮想マシンイメージ作成ツールです。
AWS、GCPといったクラウドサービス上、ローカルにアーカイブ(サーバイメージ)を作成することができます。
ライブラリを加えることで、対応するアーカイブ作成先を増やすことができ
今回はさくらインターネットさんが提供している「Packer for さくらのクラウド」を併せて使用し
さくらのクラウド上にアーカイブを作成します。
さくらインターネット社が運営するクラウドサービスです。
基本的にドキュメントが日本語なので、とてもわかりやすいです!
さくらのクラウドで、APIキーを払い出してもらいます。
手順はさくらのクラウド公式サイトに詳しい操作方法が掲載されていますので、こちらをご覧ください。
※ アクセスレベルは「作成・削除」が必要と思われます。
Packerは公式のDockerイメージが用意されており、さらにそこに「Packer for さくらのクラウド」を加えた
Dockerイメージがさくらインターネットさんによって用意されています。
ただ、用意されているDockerイメージの作成に使用されているPackerイメージのバージョン、及び「Packer for さくらのクラウド」のバージョンが古いものとなっているため、今回はDockerFileを編集し新しいバージョンのDockerイメージを作成します。
FROM hashicorp/packer:1.5.6 <- このバージョンでは動作を確認できています。
ENV PACKER_SAKURACLOUD_VERSION=0.6.0 <-新しいものに変更します
ADD https://github.com/sacloud/packer-builder-sakuracloud/releases/download/v${PACKER_SAKURACLOUD_VERSION}/packer-builder-sakuracloud_linux-amd64.zip ./
RUN unzip packer-builder-sakuracloud_linux-amd64.zip -d /bin
RUN rm -f packer-builder-sakuracloud_linux-amd64.zip
VOLUME ["/work"]
WORKDIR /work
CMD ["--help"]
上記のDockerFileを使って、任意の名前でDockerイメージを作成します。
今回Packerの設定ファイルは「web.pkr.hcl」としてhclファイルを作成します。
hclファイルはHashicorp社が作成した独自フォーマットの設定ファイルです。
hclファイルに記述された情報に従い、Packerはさくらのクラウドにサーバを構築、コマンドを実行し最後にアーカイブを作成して構築したサーバを削除します。
ファイルは下記のようなフォルダ構成に配置することを想定しています。
/path/to/hcl/file/dir/
├── web.pkr.hcl
└── install_nginx.sh
source "sakuracloud" "web" {
zone = "is1b"
os_type = "centos7"
password = "RootPassword"
disk_size = 20
disk_plan = "ssd"
core = 1
memory_size = 1
archive_name = "Web"
archive_description = "web archive"
archive_tags = ["web"]
}
build {
sources = [
"source.sakuracloud.web"
]
provisioner "file" {
source = "./install_nginx.sh"
destination = "/tmp/install_nginx.sh"
}
provisioner "shell" {
inline = [
"bash /tmp/install_nginx.sh"
]
}
}
↑のように、hclファイルはsource、buildの二つのブロックで構成されています。
ではまず、sourceブロックから説明していきます。
sourceブロックはアーカイブ作成に使用するサーバの情報を記載します。
archive_tagsは設定忘れに気をつけましょう。
source "sakuracloud" "web" { // ソースブロックの名前になります。
zone = "is1b" // さくらのクラウドのゾーンを指定します
os_type = "centos7" //元になるアーカイブOSの指定です。
//元となるアーカイブはさくらのクラウドが管理しています。
password = "RootPassword" // rootユーザのパスワードです。
disk_size = 20 // ストレージのディスクサイズです
disk_plan = "ssd" // SSDを使用します
core = 1 // サーバのCPUを指定します。アーカイブ作成に時間がかかるようなら変更してみましょう
memory_size = 1 // サーバのメモリサイズ(GB)を指定します。アーカイブ作成に時間がかかるようなら変更してみましょう
archive_name = "Web" // 作成するアーカイブ名を指定します
archive_description = "web archive" // 作成するアーカイブ説明文を指定します
archive_tags = ["web"] // 作成するアーカイブに紐づくタグを指定します、同じタグを持つ既存のアーカイブが存在すると
// 上書きの対象となるため注意しましょう。
}
buildブロックはsourceブロックで指定したサーバ内で実行して欲しいコマンド、配置してほしいファイルの情報を記載します。
今回はWebサーバなので、Nginxをインストールするシェルスクリプトファイルをサーバに配置し実行するようにします。
コマンドの実行はrootユーザで行われます。
build {
sources = [
"source.sakuracloud.web" // どのsourceブロックに紐づくビルド内容か指定します。
]
provisioner "file" { //ローカル(今回はDocker)にあるファイルをサーバへコピーします
source = "./install_nginx.sh" // ローカルにあるNginxをインストールするシェルスクリプトファイルを指定します。
destination = "/tmp/install_nginx.sh" // サーバのどこへ配置するか指定します。
}
provisioner "shell" {
inline = [
"bash /tmp/install_nginx.sh" // サーバへ配置したスクリプトを実行します。
]
}
}
Nginxのインストールスクリプトファイルはhclファイルと同じフォルダに配置しておきます。
#!/bin/bash
# create nginx repo file
cat <<'EOF' > /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck=0
enabled=1
EOF
# install nginx
yum -y --enablerepo=nginx install nginx
# systemctl enable
systemctl enable nginx.service
Packerを実行する前に払い出したAPIキーを環境変数として設定します。
$ export SAKURACLOUD_ACCESS_TOKEN=<払い出されたAPIアクセストークン>
$ export SAKURACLOUD_ACCESS_TOKEN_SECRET=<払い出されたAPIアクセスシークレットトークン>
環境変数を設定したらいよいよPakcer実行です
$ cd /path/to/hcl/file/dir
$ docker run -it --rm \
-e SAKURACLOUD_ACCESS_TOKEN \
-e SAKURACLOUD_ACCESS_TOKEN_SECRET \
-v $PWD:/work \
<作成したDockerイメージ名> build web.pkr.hcl
Packerが正常に終了した場合
さくらのクラウドのコントロールパネル画面左側メニューから
ストレージ→アーカイブと選択するとPackerが作成したアーカイブを確認することができます。
作成後は登録したゾーン内でサーバ作成の元イメージとして利用できます。
アーカイブを元にすることで、事前にセットアップが全て終わった状態でサーバを作成することができるわけです。
アーカイブを用意することで、突如としてサーバを増やすことになってもログやtempファイルが積み上がっていない綺麗な状態のサーバを迅速に作成することができます。
Packerを使うことで、構築の設定ファイルを手順や構築内容を伝えるドキュメントとしても使えるようになりました。
書きやすく、共有しやすいPackerが使える機会を今後も探っていきたいと思います。