CentOS7でPackerを使用してDigitalOceanスナップショットを作成する方法
序章
HashicorpのPackerは、複数のプラットフォームと環境で同一のマシンイメージをすばやく作成するためのコマンドラインツールです。 Packerでは、 template と呼ばれる構成ファイルを使用して、事前構成されたオペレーティングシステムとソフトウェアを含むマシンイメージを作成します。 次に、このイメージを使用して新しいマシンを作成できます。 単一のテンプレートを使用して、本番環境、ステージング環境、および開発環境の同時作成を調整することもできます。
このチュートリアルでは、Packerを使用してCentOS7でNginxWebサーバーを構成します。 次に、Packerを使用してこのドロップレットのスナップショットを作成し、DigitalOceanダッシュボードですぐに利用できるようにして、新しいドロップレットを作成できるようにします。
前提条件
Packerを起動して実行する前に、いくつかのことが必要になります。
- sudo権限を持つroot以外のユーザーで構成されたCentOS7サーバー。これは、CentOS7サーバーでユーザーを追加および削除する方法に従って設定できます。
- 読み取りおよび書き込み権限を持つDigitalOceanAPIトークン。 DigitalOcean APIv2を使用してトークンを取得する方法を確認してください。
ステップ1—Packerのダウンロードとインストール
サーバーにログインした後、Packerバイナリパッケージをダウンロードし、現在のユーザーのPackerをインストールして、インストールが成功したことを確認します。
システムでPackerを実行する最も簡単な方法は、Hashicorpの公式リリースWebサイトから最新のバイナリパッケージをダウンロードすることです。 執筆時点では、最新バージョンは0.12.2です。
使用 curl
HashicorpのWebサイトからバイナリパッケージをダウンロードするためのユーティリティ。
- curl -O https://releases.hashicorp.com/packer/0.12.2/packer_0.12.2_linux_amd64.zip
ダウンロードしたら、 unzip
ユーティリティを使用して、パッケージの内容を解凍します。 /usr/local
ディレクトリ、すべてのユーザーがPackerを利用できるようにするための推奨される場所。
- sudo yum install -y unzip
- sudo unzip -d /usr/local packer_0.12.2_linux_amd64.zip
CentOSにはすでにと呼ばれるプログラムが含まれています packer
、コマンドを実行するたびにフルパスを入力するだけで済みますが、この問題を回避するためのより効率的な方法は、マップするシンボリックリンクを作成することです。 packer.io
に /usr/local/packer
. でシンボリックリンクを作成します /usr/local/bin
次のコマンドを使用してフォルダを作成します。
- sudo ln -s /usr/local/packer /usr/local/bin/packer.io
次のことを確認して、インストールが成功したことを確認します packer.io
コマンドラインで利用可能です:
- packer.io
インストールが成功すると、次のように出力されます。
Outputusage: packer [--version] [--help] <command> [<args>]
Available commands are:
build build image(s) from template
fix fixes templates from old versions of packer
inspect see components of a template
push push a template and supporting files to a Packer build service
validate check that a template is valid
version Prints the Packer version
これで、Packerがインストールされ、マシンで動作します。 次のステップでは、プロジェクトディレクトリを設定し、基本的なCentOSスナップショットを生成するようにテンプレートを構成します。
ステップ2—DigitalOceanBuilderを構成する
Packerでドロップレットを作成し、いくつかのソフトウェアと構成ファイルをインストールしてから、そのドロップレットを新しいマシンの作成に使用できるイメージに変換する必要があります。 Packerは、 template と呼ばれる構成ファイルを使用します。このファイルには、Packerにイメージの作成方法を指示するすべての詳細が含まれています。 この構成は、構成ファイルの一般的な形式であるJSONを使用して記述します。
Packerと言えば、 builder は、Packerで作成するイメージのブループリントを含むJSONオブジェクトです。 を使用して digitalocean
ビルダーの場合、NYC1リージョンで起動される512MBのCentOS7.3ドロップレットを作成するようにPackerに指示します。
このチュートリアルで作成するテンプレートと構成ファイルを保持する新しいディレクトリを作成して変更します。
- mkdir ~/packerProject
- cd ~/packerProject
プロジェクトディレクトリができたので、という新しいファイルを開きます。 template.json
、テキストエディタで:
- vi ~/packerProject/template.json
各ビルダーは、 builders
のセクション template.json
. 今すぐこのセクションを追加して、 digitalocean
このコードをファイルに配置することにより、ビルダー:
{
"builders": [
{
"type": "digitalocean"
}]
}
The type
keyは、Packerがイメージの作成に使用するビルダーを定義します。 The digitalocean
Builderは、Packerがスナップショットを作成するDigitalOceanドロップレットを作成します。
Packerは、DigitalOceanのイメージを作成することを認識しましたが、ビルドを完了するには、さらにいくつかのキーと値のペアが必要です。
これらのキーと値を追加してドロップレットの構成を完了し、NYC1リージョンで起動される512 MBCentOS7ドロップレットからスナップショットを生成します。 次のようにファイルを変更します。
{
"builders": [
{
"type": "digitalocean",
"ssh_username": "root",
"api_token": "YOUR_DIGITALOCEAN_API_TOKEN",
"image": "centos-7-x64",
"region": "nyc1",
"size": "512mb"
}]
}
パッカーは、を使用してドロップレットに接続します ssh_username
価値。 Packerが正しく機能するには、この値を「root」に設定する必要があります。
保存 template.json
テキストエディタを終了します。
上記のコードブロックには、DigitalOceanドロップレットを作成するために必要な最小限の構成が含まれていますが、次の表に示すように、追加の構成オプションを使用できます。
鍵 | 価値 | 必須 | 説明 |
---|---|---|---|
api_token |
弦 | はい | アカウントへのアクセスに使用するAPIトークン。 環境変数で指定することもできます DIGITALOCEAN_API_TOKEN 、設定されている場合。 |
image |
弦 | はい | 使用するベースイメージの名前(またはスラッグ)。 これは、新しいドロップレットを起動してプロビジョニングするために使用されるイメージです。 受け入れられた画像名/スラッグのリストを取得する方法の詳細については、https://developers.digitalocean.com/documentation/v2/#list-all-imagesを参照してください。 |
region |
弦 | はい | ドロップレットを起動するリージョンの名前(またはスラッグ)。 したがって、これはスナップショットが利用できる領域です。 受け入れられるリージョン名/スラッグについては、https://developers.digitalocean.com/documentation/v2/#list-all-regionsを参照してください。 |
size |
弦 | はい | 使用するドロップレットサイズの名前(またはスラッグ)。 受け入れられるサイズ名/スラッグについては、https://developers.digitalocean.com/documentation/v2/#list-all-sizesを参照してください。 |
api_url |
弦 | いいえ | 非標準のAPIエンドポイントのURL。 DigitalOcean API互換サービスを使用している場合は、これを設定します。 |
droplet_name |
弦 | いいえ | ドロップレットに割り当てられた名前。 DigitalOceanは、マシンのホスト名をこの値に設定します。 |
private_networking |
ブール値 | いいえ | に設定 true 作成中のドロップレットのプライベートネットワークを有効にします。 これはデフォルトで false 、または有効になっていません。 |
snapshot_name |
弦 | いいえ | アカウントに表示される結果のスナップショットの名前。 これは一意である必要があります。 |
state_timeout |
弦 | いいえ | タイムアウトする前に、ドロップレットが目的の状態(「アクティブ」など)に入るのを継続時間文字列として待機する時間。 デフォルトの状態タイムアウトは「6m」です。 |
user_data |
弦 | いいえ | ドロップレットで起動するユーザーデータ。 詳細については、ドロップレットメタデータの概要を参照してください。 |
これで有効なテンプレートが作成されましたが、APIトークンはテンプレートにハードコードされています。 これは悪い習慣であり、潜在的なセキュリティリスクです。 次のステップでは、このトークンの変数を作成し、そこから移動します template.json
.
ステップ3—ユーザー変数の作成と保存
Packerを使用すると、変数の値を作成して別のファイルに保存できます。 イメージをビルドする準備ができたら、このファイルをコマンドラインからPackerに渡すことができます。
変数を別のファイルに保存することは、機密情報や環境固有のデータをテンプレートから除外するための理想的な方法です。 これは、チームメンバーと共有したり、GitHubなどの公開リポジトリに保存したりする場合に重要です。
ローカルコピーのみを保存する場合でも、テンプレートの外部に変数を格納することはPackerのベストプラクティスです。
で新しいJSONファイルを作成して開きます packerProject
この情報を保存するディレクトリ:
- vi ~/packerProject/variables.json
ここで、 my_token
変数を設定し、その値をDigitalOceanAPIトークンに設定します。
{
"my_token": "YOUR_DIGITALOCEAN_API_TOKEN"
}
保存 variables.json
エディターを終了します。
次に、変数を使用するようにテンプレートを構成しましょう。 使用する前に my_token
変数、またはその他の変数の場合、最初に、変数をで定義することにより、変数が存在することをPackerに通知する必要があります。 variables
冒頭のセクション template.json
ファイル。
開ける template.json
エディターで:
- vi template.json
新しいを追加します variables
上記のセクション builders
以前に定義したセクション。 この新しいセクション内で、 my_token
変数を設定し、デフォルト値を空の文字列に設定します。
{
"variables": {
"my_token":""
},
"builders": [
...
}
で定義された変数 variables
セクションはグローバルに利用可能です。
次に、APIトークンを builders
を呼び出すセクション my_token
:
{
...
"builders": [
{
"type": "digitalocean",
"api_token": "{{ user `my_token` }}",
...
}]
}
ご覧のとおり、ユーザー変数の呼び出しには特定の形式を使用する必要があります。 "{{ user `variable_name` }}
. 二重中括弧と同様に、引用符とバッククォートが必要です。
ファイルを保存して、エディターを終了します。
これで、基本的なスナップショットと、APIキーを保存するための個別の変数ファイルを生成する作業テンプレートができました。 イメージを検証してビルドする前に、 provisioners
イメージを作成する前にマシンにNginxWebサーバーをインストールしてセットアップするようにPackerを構成するテンプレートのセクション。
ステップ4—プロビジョナーの構成
The provisioners
このセクションでは、Packerが実行中のDropletにソフトウェアをインストールして構成してから、それをマシンイメージに変換します。 ビルダーと同様に、ドロップレットの構成に使用できるプロビジョナーにはさまざまな種類があります。
Nginxを構成するには、Packerを使用します file
構成ファイルをサーバーにアップロードしてから、 shell
それらのファイルを使用するインストールスクリプトを実行するプロビジョナー。 The file
プロビジョナーを使用すると、実行中のマシンをイメージに変換する前に、実行中のマシンとの間でファイルやディレクトリを移動できます。 とともに shell
プロビジョニング担当者は、そのマシンでシェルスクリプトをリモートで実行できます。
プロビジョナーは、テンプレート内に表示されるのと同じ順序で実行されます。 これは置くことを意味します file
シェルスクリプトにはアップロードされたファイルが必要なので、最初にプロビジョナー。
追加する provisioners
次のセクション builders
のセクション template.json
使用する2つのプロビジョナーを設定します。
{
...
"builders": [
{
...
}],
"provisioners": [
{
"type": "file"
},
{
"type": "shell"
}]
}
The file
プロビジョニング担当者は source
、ローカルファイルパスを指し、および destination
、実行中のマシン上の既存のファイルパスを指します。 Packerは、既存の宛先にのみファイルを移動できます。 このため、通常、ファイルをにアップロードします。 /tmp
ディレクトリ。
を構成します file
強調表示された行をに追加することによるプロビジョナー template.json
:
{
...
"provisioners": [
{
"type": "file",
"source": "configs/",
"destination": "/tmp"
},
...
}
作成します configs
次のステップでローカルマシン上のフォルダ。 その前に、設定ファイルを設定して構成ファイルの編集を終了しましょう。 shell
プロビジョニング担当者。
The shell
プロビジョニング担当者は scripts
実行中のマシンに渡す必要のあるスクリプトの配列を含むキー。 各スクリプトは、テンプレートで指定された順序でアップロードおよび実行されます。
次に、 shell
スクリプトへのフルパスを提供することによるプロビジョナー:
{
...
"provisioners": [
{
"type": "file",
"source": "configs/",
"destination": "/tmp"
},
{
"type": "shell",
"scripts": [
"scripts/configureNginx.sh"
]
}]
}
スクリプトは個別にリストする必要があります。これにより、スクリプトの実行順序を制御できます。
The provisioners
テンプレートのセクションが完成しました。 ファイルを保存してVimを終了します。
次に、Packerがイメージの作成に使用するシェルスクリプトと構成ファイルを作成しましょう。
ステップ5—構成ファイルとインストールスクリプトを追加する
適切な構成ファイルとデフォルトのWebページを使用して、完全に構成されたNginxインストールでイメージを出荷する必要があります。 このセクションでは、チュートリアル Ubuntu 16.04 でNginxサーバーブロック(仮想ホスト)を設定する方法に基づいて、事前定義された構成からこれらのファイルを作成します。Nginx構成はこのチュートリアルの範囲を超えているためです。
単一のインストールスクリプトで処理される3つの個別の構成ファイルを作成してアップロードすることにより、Nginxを使用してサーバーをプロビジョニングします。
まず、プロジェクトフォルダ内に設定ファイルを保存するための新しいディレクトリを作成します。
- mkdir ~/packerProject/configs
への変更 /configs
Nginx構成ファイルを作成するには:
- cd ~/packerProject/configs
まず、新しいドメインから提供するデフォルトのWebページが必要です。 ファイルを作成する index.html.new
:
- vi index.html.new
この新しいファイルに、以下を挿入します。
HELLO FROM YOUR TEST PAGE
次に、ドメインのリスニングポートとWebページの場所を定義するドメインのサーバーブロックを定義するNginx構成ファイルが必要です。 というファイルを作成します newDomain.conf
:
- vi newDomain.conf
このファイルに次の構成を配置します。
server {
listen 80;
listen [::]:80;
server_name example.com;
location / {
root /var/www/html/newDomain;
index index.html index.htm;
}
}
この例では、 example.com
プレースホルダー値として。 イメージから新しいマシンを作成するときは、新しいマシンにログインし、このファイルを変更して、マシンを指す実際のドメインまたはIPアドレスを反映する必要があります。
最後に、Nginxが新しいディレクトリからドメインの構成をロードするようにします。 /etc/nginx/vhost.d/
. これは、メインのNginx構成ファイルを編集することを意味します。
作成 nginx.conf.new
:
- vi nginx.conf.new
デフォルトのNginx構成ファイルを使用しますが、特定のサイト構成を含めるように変更します。 このファイルに次の内容を入れます。
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/vhost.d/*.conf;
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /usr/share/nginx/html;
include /etc/nginx/default.d/*.conf;
location / {
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
}
ファイルを保存して終了します。
構成ファイルを配置したら、Packerが必要なソフトウェアをインストールするために使用するスクリプトを定義しましょう。 スクリプトを保存するための新しいフォルダを作成します。
- mkdir ~/packerProject/scripts
次に、この新しいディレクトリに移動して、インストールスクリプトを作成します。 configureNginx.sh
、Nginx Webサーバーをインストール、構成、有効化、および起動します。
- cd ~/packerProject/scripts
- vi configureNginx.sh
作成した構成ファイルを使用して、Nginxをインストール、構成、および起動するファイルに以下を貼り付けます。
#!/bin/bash
# Script to install Nginx and enable on boot.
# Update your system:
yum update -y
# Install EPEL Repository, update EPEL, and install Nginx:
yum install -y epel-release
yum update -y
yum install -y nginx
#Start Nginx service and enable to start on boot:
systemctl enable nginx
systemctl start nginx
# Create new 'vhost' directory for domain configuration:
mkdir /etc/nginx/vhost.d
# Create a new directory to serve new content.
mkdir -p /var/www/html/newDomain
# Create a copy of original configuration files and import configuration:
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.original
cp /tmp/nginx.conf.new /etc/nginx/nginx.conf
# Copy over the server block configuration:
cp /tmp/newDomain.conf /etc/nginx/vhost.d/newDomain.conf
# Copy over the html test page:
cp /tmp/index.html.new /var/www/html/newDomain/index.html
# Restart Nginx:
systemctl restart nginx
テンプレートが完成し、スナップショットを検証して構築する準備が整いました。
ステップ6-ドロップレットの検証と構築
Packerを使用してテンプレートをテストする時が来ました validate
サブコマンド。 テンプレートが正常に検証されたら、ドロップレットを作成してスナップショットを作成します。
プロジェクトのルートに変更します。
- cd ~/packerProject
The validate
サブコマンドは、有効な構文および構成オプションについてテンプレートをチェックします。
- packer.io validate -var-file=variables.json template.json
The -var-file
フラグは読み取ります variables.json
の値を設定します my_token
内部 template.json
.
次の出力が表示されます。
OutputTemplate validated successfully.
何か問題がある場合 template.json
エラーメッセージが表示されます。 このメッセージはエラーによって異なりますが、ほとんどの場合、構文を再確認し、タイプミスを修正することで修正できます。
The build
サブコマンドは、で定義したビルドを実行します builders
テンプレートのセクション。 つまり、Packerにドロップレットを作成してから、DigitalOceanダッシュボードにそのドロップレットのスナップショットを作成するように指示します。
電話 packer.io build
ドロップレットを作成してスナップショットを作成するには、次の手順に従います。
- packer.io build -var-file=variables.json template.json
に注意してください -var-file
フラグは、両方に対してまったく同じように動作します build
と validate
サブコマンド。
成功したビルドの出力は、次のようになります。
Outputdigitalocean output will be in this color.
==> digitalocean: Creating temporary ssh key for Droplet...
==> digitalocean: Creating Droplet...
==> digitalocean: Waiting for Droplet to become active...
==> digitalocean: Waiting for SSH to become available...
==> digitalocean: Connected to SSH!
==> digitalocean: Gracefully shutting down Droplet...
==> digitalocean: Creating snapshot: packer-1467580504
==> digitalocean: Waiting for snapshot to complete...
==> digitalocean: Destroying Droplet...
==> digitalocean: Deleting temporary ssh key...
Build 'digitalocean' finished.
==> Builds finished. The artifacts of successful builds are:
--> digitalocean: A snapshot was created: 'packer-1487878703' (ID: 18252043) in region 'nyc1'
ビルドが成功すると、DigitalOceanスナップショットリポジトリに新しいスナップショットが見つかります。 スナップショットの名前は出力にあります。 この例では、 packer-1487878703
.
ここから、DigitalOceanダッシュボードにアクセスし、 Images を選択すると、新しいスナップショットがリストに表示されます。
これで、この新しいスナップショットを使用して新しいドロップレットを作成できます。 その他を選択し、ドロップレットの作成を選択します。 次に、フォームに記入して新しいマシンを作成します。
マシンがオンラインになったら、ダッシュボードからIPアドレスを決定し、新しいマシンにログインします。
- ssh root@your_new_server_ip_address
次に、Nginxサーバー構成ファイルを編集します。
- vi /etc/nginx/vhost.d/newDomain.conf
そして交換してください example.com
マシンのIPアドレスまたは使用するドメイン名のいずれかを使用します。
server {
listen 80;
listen [::]:80;
server_name your_new_server_ip_address;
location / {
root /var/www/html/newDomain;
index index.html index.htm;
}
}
または、 sed
次のように、ファイル内の値を置き換えるコマンド:
- sudo sed -i 's/^.*server_name example.com/server_name your_new_server_ip_address/' /etc/nginx/vhost.d/newDomain.conf
あなたはについてもっと学ぶことができます sed
このチュートリアルで。
トラブルシューティング
場合によっては、エラーメッセージで十分に説明されていない問題が発生することがあります。 これらのシナリオでは、デバッグモードを有効にするか、Packerログを調べるか、またはその両方を行うことで、ビルドに関する詳細を抽出できます。
デバッグモードは、リモートビルドの各ステップのビルダー固有のデバッグ情報を提供します。 DigitalOceanビルドのデバッグモードを有効にすると、プロジェクトフォルダーに一時的な秘密鍵が生成され、スナップショットに変換される前に、実行中のドロップレットに接続して検査するために使用できます。
を渡すことでデバッグモードに入ることができます -debug
フラグを立てる packer.io build
コマンドラインで:
- packer.io build -debug --var-file=variables.json template.json
デバッグモードで問題を診断できない場合は、Packerログを有効にしてみてください。 これらのログは主にローカルビルダーのデバッグに使用されますが、リモートビルドに関する有用な情報も提供する場合があります。
パッカーログを有効にするには、 PACKER_LOG
「0」または空の文字列以外の任意の値への環境変数:
- PACKER_LOG=1 packer build --var-file=variables.json template.json
設定しない限り、ログはコンソールに出力されます PACKER_LOG_PATH
環境変数。
それでも問題が解決しない場合は、Packerコミュニティの誰かに連絡してみてください。
結論
これで、Packerの基本に慣れたので、この基盤の上に構築することに興味があるかもしれません。
テンプレートに2つ目のビルダーを追加して、DigitalOceanスナップショットと一緒にローカルテスト環境を作成してみてください。 The virtualbox-iso
たとえば、ビルダーは、企業と愛好家の両方が使用する無料のオープンソース仮想化製品であるVirtualBoxのイメージを作成します。 あなたは定義することができます post-processor
VirtualBoxイメージに追加し、DigitalOceanスナップショットをミラーリングするVagrant環境を作成します。 これにより、ライブのドロップレットにプッシュする前に、Webサイトの変更をローカルでテストできます。 詳細については、Vagrantポストプロセッサーのドキュメントをご覧ください。
または、Webサーバーをデータベースに接続することもできます。 秒を追加します digitalocean
ビルダーと使用 only
あなたのキー provisioners
各ビルドに異なるプロビジョニングを適用するセクション。
構成管理ツールをより快適に使用できる場合、Packerには、 Ansible 、 Puppet 、Chefなどのサポートが付属しています。 これらのプロビジョナーのいずれかを使用して、ユースケースに一致するようにDropletをさらに構成してみてください。 これまでに構成管理を試したことがない場合は、Ubuntuでシステム構成を自動化するためのAnsiblePlaybookを作成する方法をご覧ください。