こんにちは、山本和道です。
本記事は連載「若手エンジニアのためのDevOps入門」の第8回です。

第1回 インフラエンジニアにとってのDevOps
第2回 Webアプリでの開発環境構築
第3回 バージョン管理システム
第4回 継続的インテグレーション/デリバリー
第5回 DevOpsのための道具箱: APIを使いこなす
第6回 リリース/構成管理: 概要
第7回 リリース/構成管理: Terraform編
第8回 リリース/構成管理: Ansible/Packer編

第7回は実践編として、さくらのクラウドのリソースマネージャ(Terraform)を用いて実際にインフラを構築しました。今回はAnsible/Packerを用いて構築したサーバに対するセットアップ(プロビジョニング)を行ってみます。

サーバのプロビジョニングツール

前回でさくらのクラウドのリソースマネージャ(Terraform)を用いてサーバの作成が行えましたが、特にOS/ミドルウェア/アプリケーションの設定などを行っていないためシステムを動かすための設定などを行う必要があります。

設定を行うには手作業でコマンドを実行していく方法もありますが、やはりツールを利用することで素早く確実に行うことが可能です。

このためのツールは「プロビジョニングツール」と呼ばれ、様々なツールが存在します。今回はこの中からAnsibleを例にサーバのプロビジョニングを行います。

また、Ansibleなどである程度プロビジョニング済みのOSイメージを各所で使い回す、いわゆるゴールデンイメージという方法も存在します。今回はPackerとAnsibleを組み合わせたゴールデンイメージの作成についても扱います。

Ansibleとは

Ansibleとはオープンソースの構成管理ツールです。yaml形式の構成定義ファイルを用意しておくことでOSの設定やミドルウェアのインストール構成を行えます。

特徴としては対象のマシンに特別なアプリケーションのインストールは不要でSSH(等)で接続してプロビジョニングを行える、いわゆるエージェントレス型であることが挙げられます。

また、ある程度の共通の設定を他所に流用するためのroleの仕組みや、role自体を共有するAnsible-Galaxyといった仕組みも充実しており、複雑な構成でも手軽に構築していけるツールとなっています。

Packerとは

Packerとは前回のTerraformと同じくHashiCorp社が中心となって開発が進められているオープンソースのOSイメージ作成ツールです。VirtualBoxやHyper-Vといった仮想化ソフトウェアやクラウドプラットフォーム上に仮想マシンを作成してプロビジョニング、プロビジョニング後に様々な形式のOSイメージとして保存という作業を行えます。

プロビジョニングには様々なツールを用いることができ、bashやPowerShellといったスクリプトの実行から前述のPackerを用いた複雑なプロビジョニングまで幅広くサポートされています。

今回はPacker for さくらのクラウドというツールを用いて、さくらのクラウド上で再利用できるOSイメージの作成を行ってみます。

実習: Ansible

まずはAnsibleでのプロビジョニングを体験してみます。今回はさくらのクラウド上にサーバを作成し、作成したサーバに対してAnsibleでのプロビジョニングを行います。

事前準備

サーバの作成

まずは操作対象となるサーバを準備します。さくらのクラウドのコントロールパネルからサーバを1台作成します。

コントロールパネルにログイン後、「さくらのクラウド(IaaS)」メニューを開きます。

次に任意のゾーンを選択し、サーバメニューの上部にある「追加」ボタンからサーバ作成画面を開きます。

サーバ作成画面では画面上部の「シンプルモード」がチェックされていることを確認してください。
もしチェックされていなければチェックしておきます。

その後ディスクイメージとしてCentOSを選択してサーバ作成を行います。
(入力項目は任意の値を入力しておいてください)

Ansibleのインストール

サーバの作成後にAnsibleのインストールを行っておきます。今回は簡易的に利用するため、プロビジョニング対象のサーバ自身にAnsibleをインストールし、自分自身をプロビジョニングするという方法をとります。

先ほど作成したサーバにSSH接続し、以下のコマンドを実行することでインストール可能です。

$ yum install ansible

インストール後は以下のコマンドを実行することで確認できます。ここではpingモジュールという疎通確認用のモジュールで自分自身への疎通を確認しています。

$ ansible localhost -m ping

# 正常にインストールされている場合以下のような出力となる
 [WARNING]: Could not match supplied host pattern, ignoring: all
 [WARNING]: provided hosts list is empty, only localhost is available

localhost | SUCCESS => {
     "changed": false,
     "ping": "pong"
 }

今回構成するサーバ

準備が整いましたので早速サーバのプロビジョニングを行います。

今回は以下のようなサーバ構成となるようにプロビジョニングを行います。

  • WebサーバとしてNginxを利用
  • HTTP用にファイヤウォールの設定(tcp:80番の開放)

それでは早速この構成をコード化してみます。

構成のコード化

まずは以下のようなyamlファイルを作成します。ファイル名はplaybook.yamlとしておいてください。

---
 - hosts: localhost

tasks:
 # この下に必要な処理を記載していく

まずはNginxをインストールし利用できる状態に持っていく処理を記載します。playbook.yamlを以下のように編集してください。

---
 - hosts: localhost

tasks:
 # インストール用のRPMリポジトリを追加
 - name: NGINX | Add NGINX repo
   yum:
     name: http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

# Nginxをインストール
 - name: NGINX | Install NGINX
   yum:
     name: nginx
     state: latest

# Nginxを起動
 - name: NGINX | Start NGINX
   service:
     name: nginx
     state: started

次にファイアウォールの設定を行います。
playbook.yamlを以下のように編集してください。

---
 - hosts: localhost

tasks:
 # インストール用のRPMリポジトリを追加
 - name: NGINX | Add NGINX repo
   yum:
     name: http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

# Nginxをインストール
 - name: NGINX | Install NGINX
   yum:
     name: nginx
     state: latest

# Nginxを起動
 - name: NGINX | Start NGINX
   service:
     name: nginx
     state: started

# ファイアウォール設定
 - name: firewalld | Open http
   firewalld: service=http permanent=true state=enabled immediate=true

これで今回の構成のコード化ができました。

なお、今回はAnsibleを体験してみることを主眼としているためコードは簡易的な書き方となっています。本格的に利用する際はAnsibleのドキュメントなども参照ください。

Ansibleの実行

それでは作成したコードをAnsibleを用いて適用してみます。以下のコマンドを実行してください。

$ ansible-playbook playbook.yaml

これでNginxがインストールされ、必要なポートが開放された状態となります。今回は単純な例でしたが、さらなるコードを追加したり、公開されているRoleを利用することでより複雑な構成でも対応可能です。

実習: Packerでのゴールデンイメージの作成

Ansibleの実習ではOSインストール直後の状態からNginxのインストールを行いましたが、多くのサーバである程度共通の設定を利用するという場合も多いです。

このため、Webサーバのインストールやログのローテーション設定などの基本的な部分は設定済みのゴールデンイメージを用意しておき、実際にサーバ構築する際はゴールデンイメージからサーバ作成、その後各サーバ固有の設定のみ行うことで、サーバ構築完了までの時間を短縮することが可能です。

ここではPacker for さくらのクラウドを利用して、さくらのクラウドで再利用可能なOSイメージを作成してみます。OSイメージは先ほども扱ったAnsibleを用いてプロビジョニングを行います。

準備: Packerのインストール

PackerはGo言語で書かれており、実行ファイルをダウンロードするだけでインストール可能です。通常は以下のサイトから最新版の実行ファイルをダウンロードし、PATHの通ったディレクトリに配置するだけで利用可能です。

> Packer ダウンロードページ

今回は先ほど作成したサーバで以下のコマンドを実行してインストールしてください。

$ curl -L -O packer.zip https://releases.hashicorp.com/packer/1.2.1/packer_1.2.1_linux_amd64.zip
$ unzip packer.zip
$ mv packer /usr/local/bin/
$ rm packer.zip

準備: Packer for さくらのクラウドのインストール

Packerはプラグインという形で拡張できるようになっており、さくらのクラウドについてもプラグインにて対応しています。通常は以下のサイトから実行ファイルをダウンロードし、Packerと同じディレクトリに配置すれば利用可能となります。

> Packer for さくらのクラウド ダウンロードページ

今回は先ほどと同じくサーバ上で以下のコマンドを実行してインストールしてください。

$ curl -LO https://github.com/sacloud/packer-builder-sakuracloud/releases/download/v0.1.4/packer-builder-sakuracloud_linux-amd64.zip
$ unzip packer-builder-sakuracloud_linux-amd64.zip
$ mv packer-builder-sakuraccloud /usr/local/bin/
$ rm packer-builder-sakuracloud_linux-amd64.zip

また、さくらのクラウドのAPIを利用するためにAPIキーの設定が必要です。
前回の記事などを参考にAPIキーを発行し、環境変数に設定しておきます。

# 環境変数にAPIキー設定
$ export SAKURACLOUD_ACCESS_TOKEN=<APIトークン>
$ export SAKURACLOUD_ACCESS_TOKEN_SECRET=<APIシークレット>

Packerのテンプレート作成

Packerはテンプレートと呼ばれるJSONファイルにしたがってOSイメージの構築を行います。今回はCentOS7をベースに先ほどAnsibleで設定した内容を反映したイメージを作成します。

以下のようなJSONファイルをtemplate.jsonという名前で作成してください。passwordの部分は任意の値に変更してください。

{
  "builders": [{
    "type": "sakuracloud",
    "zone": "is1b",
    "os_type": "centos",
    "password": "",
    "disk_size": 20,
    "disk_plan": "ssd",
    "archive_name": "centos-nginx-base"
 }],
 "provisioners":[
   {
     "type": "shell",
     "inline": [
       "yum update -y",
       "yum install -y ansible"
     ]
   },
   {
     "type": "ansible-local",
     "playbook_file": "playbook.yaml"
   }
 ]}

この設定で以下の処理を行ってくれます。

  • さくらのクラウド(石狩第2ゾーン)にサーバ作成(OSはCentOS7)
  • サーバが起動したらSSHで接続
  • Ansibleのインストール
  • playbook.yamlファイルをサーバに転送し、ansible-playbookコマンドを実行
  • サーバのディスクからアーカイブ(さくらのクラウドでのOSイメージ)を作成
  • 作成したサーバを削除

Packerコマンド実行

それでは早速packerコマンドを実行します。

$ packer build template.json

実行が完了すると、石狩第2ゾーンに以下のようなアーカイブが作成されているはずです。

あとはサーバ作成時にこのアーカイブをコピー元として指定することでNginxがインストール済みのサーバを構築することが可能です。

注意点として、さくらのクラウドの場合はアーカイブを保存しておくのに若干とはいえ費用が発生する点があります。プロビジョニングの規模によってはゴールデンイメージとせず毎回1からプロビジョニングした方が良い場合もありますので、発生する費用やプロビジョニングに求められる速度などを勘案した上でどのような方法をとるかを検討してください。

まとめ

今回はAnsibleでのサーバのプロビジョニングと、PackerとAnsibleを組み合わせたゴールデンイメージの作成を扱いました。

Ansibleを用いることでクラウド上に調達したサーバのOS設定やミドルウェアのインストール/設定をコードを通じて行えます。また、Packerを併用すればゴールデンイメージの作成も容易に行えます。前回と同じくぜひコードを書いてインフラ構築を体験してみてください。

次回はこれまであつかったバージョン管理や継続的インテグレーション/継続的デリバリー、リリース/構成管理の振り返りとしてサンプルアプリを通じて実際に開発〜リリースまでの流れを体験してみます。