楽天でサーバサイドのエンジニアをしていますtkakと申します。楽天社内には、RIaaSと呼ばれるプライベートクラウド環境があり、その上で多くのサービスが動いています。私が今いる部署では、Packerというツールを使って、RIaaSで使われているテンプレートイメージを管理しています。今回は、そのPackerの使い方などを紹介したいと思います。vSphereをベースにしたプラットフォームと、KVMをベースにしたOpenStackプラットフォームの2種類があります。使っているテンプレートイメージは、用途に合わせていくつか種類があります。OSの初期設定のみの"minimal"楽天のインフラ環境用の設定が入った"base"DB向けの"db"また、ローカル開発環境用にVagrant(VirtualBox)のイメージも用意しています。ローカル環境で開発したアプリケーションをRIaaSに持っていっても動くように、ベースの部分は極力設定を合わせるように作っています。PackerとはPackerは、テンプレートイメージを自動生成・管理するためのコマンドラインツールです。Hashicorpが、OSSとして開発・メンテナンスしています。昨今、様々なクラウド環境や仮想環境が存在していますが、より早くアプリケーションをデプロイするためには、ゴールデンイメージのような環境に合わせたテンプレートイメージの管理が必要です。取り扱う環境やOSの種類が増えるごとに、テンプレートイメージの管理は、煩雑になる傾向があります。そんな時、Packerを使うことで、様々なプラットフォームのテンプレートイメージを、一つの設定ファイルに集約し、かつビルド作業を自動化することができます。弊社では、Packerを導入する前は、テンプレートイメージごとに手作業によるGUI作業と秘伝のスクリプトを駆使して、温かみのある運用をしていました。仮想環境やOSの種類が少ない間は、それでも運用できていたのですが、徐々に仮想環境や運用するOSが増えるにつれて、運用が回らなくなっていきました。そこで、Packerを導入し、Jenkinsと組み合わせることで、ほぼテンプレートイメージビルド作業を自動化することができました。Codeの恩恵も得ることができました。テンプレートイメージをビルドする仕組みでは、実際のテンプレートイメージをビルドする仕組みを紹介したいと思います。ディレクトリ構成は以下のようにしています。target.listJSONファイルがPackerの設定ファイルです。buildというコマンドで行います。以下のようになります。rakuten-centos-7-x86_64.jsonこのコマンドを実行した後、しばらく待つとイメージが出来上がります。この時の処理の流れは、基本的には以下のようになっています。ISOイメージのダウンロード仮想マシンの作成と起動VNC経由でbootコマンドを実行し、OSインストールを開始(kickstart)OSインストール完了後に再起動SSH経由で任意のコマンドを実行シャットダウンイメージの配布Packerはこれらの処理を自動的に行います。Packerの設定ファイルは、buildersやprovisioners、post-processorsなどのセクションに分かれていて、それぞれ次のような用途になっています。]}buildersは、仮想マシンの作成・起動を行います。上記のイメージビルドの流れでいうと1から4までが、buildersで取り扱う設定になります。AWSやAzure、GCP、DigitalOcean、OpenStack、Dockerなど、色々なプラットフォームをサポートしています。provisionersは、起動した仮想マシンの中で、任意のコマンドやスクリプト、Chef、Ansibleなどを行います。上記のイメージビルドの流れでいうと5がprovisionersで取り扱う設定になります。post-processorsは、ビルドが終わったマシンイメージを、tarに固めたり、どこかにアップロードしたりする処理を行います。上記のイメージビルドの流れでいうと7がpost-processorsで取り扱う設定になります。詳細な使い方などは、公式サイトを参照してください。vSphereとOpenStack向けのビルド環境をそれぞれ紹介します。vSphere用のビルド環境ついて紹介します。全体の流れは次のようになります。hookが行われ、Jenkinsのジョブが起動packerを実行ISOをダウンロード&ESXiに転送ESXiにVMを作成&起動。vSphere用のbuilders設定ファイルは以下のようにしています。...}buildersでは、使う環境に合わせて"type"を選択します。VMwareの場合、"vmware-iso"と"vmware-vmx"の2つが用意されています。以下のような違いがあります。ある仮想マシン(vmx)から新しい仮想マシンを作る今のところは、ビルドに時間がかかりますが一から作ることができる"vmware-iso"をメインで使っています。ここで注意したいのが、Packerのvmware-isoタイプは、vSphereではなくESXi用ということです。最初試した時にネットワーク設定をvSphereでしかサポートされていない"分散仮想スイッチ"に設定してしまい、いくら試してもネットワークが繋がらず、どハマりしたことがありました。ネットワーク設定は"スタンダードネットワーク"を指定しなければなりません(ESXiなんだから当たり前ではありますが・・・。1これは、PackerがESXiに接続してコマンドを実行するために必要な物です。中で、実際にどんなコマンドを使っているかは、こちらを見ればわかります。VNC接続用にポート(デフォルトだと5900から6000)の解放も必要なので、適宜設定してください。VNC用のポートを追加するには、ESXiにログインしxmlファイルを変更する必要があります。詳細なやり方は以下を参考にしてください。Deploymentsprovisionersprovisionersでは、スクリプトとChefを使っています。toolsのインストールなど)や、カーネルアップデート、Chefクライアントのインストールなどを行なっています。Chefの方では、楽天インフラ独自の設定を行っています。PackerからChefを使う際は、Packerで用意されている"chef-client"や"chef-solo"といったタイプは使わずに以下のようにコマンドから実行するようにしています。...また、"override"パラメータを使うことで、builderごとにパラメータを上書きすることが出来るので便利です。builderごとにprovisionerを書く必要がなくなります。post-processorspost-processorsでは、出来上がったマシンイメージのVMXファイルをカスタマイズしたり、各vCenterに配布したりする処理を行っています。配布するにあたって、一度マシンイメージをダウンロードする必要があるのですが、ovftoolというコマンドラインツールを使っています。VMXファイルのカスタマイズとマシンイメージの配布は、govcというツールを使っています。力業でやっているのでpackerの設定ファイルに書くのではなく、スクリプトの方で行なっています。次にOpenStack用のビルド環境について紹介します。全体像は次のようになります。slaveとpackerをインストール)ISOをダウンロードQEMU+KVM上にVMを作成&起動。...OpenStack用と言っても、実際はQEMU+KVM向けの設定です。buildを実行すれば、QEMUのイメージが作成できます。provisionersprovisionersでは、スクリプトとChefを実行するようにしています。ほとんどvSphereと一緒なので、割愛します。post-processorspost-processorsでは、マシンイメージの整形と配布を行っています。出来上がったテンプレートイメージには、MACアドレスなどの邪魔な情報が残っているため、virt-sysprepコマンドを実行して、それらを削除します。images/${image_name}その後、glanceコマンドでOpenStackにイメージを配布しています。images/${image_name}終わりにRIaaSで使われているテンプレートイメージのビルド環境について簡単に紹介しました。Packerを導入したことで、煩わしいビルド作業を自動化し、コード化することで属人性を減らすことができました。今後としては、現状一回のビルドに1時間くらいかかってしまっているので、ビルド時間を短縮させたいです。他の組織でもPackerを使っていけるように布教活動なども行なっていきたいと思います。VMware周りは色々と落とし穴が多かったので、本エントリが今後VMwareでPackerを導入する方のお役に立てれば幸いです。requestStockLike6@tkak@tkakです。upLoginユーザーは見つかりませんでした。