2017年10月26日木曜日

terraform に入門してみた (docker 編)

概要

terraform を試してみました
terraform はインフラ自動構築するためのツールでコード化することができます
terraform にはたくさんのプロバイダがあり今回は docker プロバイダを使って試してみました

環境

  • CentOS 7.3
  • terraform 0.10.7

terraform のインストール

まずはインストールです
hashicorp 製品はバイナリを一つ置いて終了です

  • wget 'https://releases.hashicorp.com/terraform/0.10.7/terraform_0.10.7_linux_amd64.zip?_ga=2.150895542.1898133342.1508819233-1686377386.1508819233' -O terraform_0.10.7_linux_amd64.zip
  • unzip terraform_0.10.7_linux_amd64.zip
  • mv terraform /usr/local/bin

とりあえず試してみる

公式の Getting Started にあるサンプルをとりあえず実行してみましょう

  • vim main.tf
provider "docker" {
  host = "tcp://127.0.0.1:2376/"
}

# Create a container
resource "docker_container" "foo" {
  image = "${docker_image.ubuntu.latest}"
  name  = "foo"
}

resource "docker_image" "ubuntu" {
  name = "ubuntu:latest"
}

dockerd の tcp 接続を有効にしている場合は上記で OK です
socket 接続の場合はコメントアウトすれば OK です
dockerd の tcp 接続の有効化に関してはこちら を参考にしてください

.tf ファイルが記載できたら初期化します

  • terraform init

これで docker プロバイダのインストールが始まります
完了すると .terraform というディレクトリが作成されています
terraform は実行する前に実行計画を確認することができます

  • terraform plan

実行すると作成されるリソースの一覧とその情報が表示されます
今回であれば pull されるイメージの情報や作成されるコンテナの情報が表示されます

では実行してみましょう

  • terraform apply

apply コマンドで実行できます
実際に .tf ファイルに記載した内容のコンテナとイメージが作成されます
確認は docker コマンドでもできますが terraform で作成したリソースだけを表示することもできます

  • terraform show

show コマンドを実行することで terraform 経由で pull したイメージやコンテナの情報だけを表示することができます

リソースを削除する

terraform 経由で作成されたリソースのみ削除したい場合は destroy コマンドを利用します

  • terraform destroy

基本的にはこれで削除したほうが良いと思います
もちろん docker rm などを使えばそれでも削除できますが面倒なので一気に削除したい場合は destroy を使うと良いと思います
デフォルトだとリソースの削除時に確認があるので確認が不要な場合は -force を付与してください
また、plan コマンドで-destroy オプションを付与すると削除時の計画を表示することも可能です

インフラ構成を変更する

terraform では一度構築した環境を変更することもできます
以下のように .tf ファイルを書き換えてみましょう

  • vim main.tf
provider "docker" {
  host = "tcp://127.0.0.1:2376/"
}

# Create a container
resource "docker_container" "foo" {
  image = "${docker_image.ubuntu.latest}"
  name  = "foo2"
}

resource "docker_image" "ubuntu" {
  name = "ubuntu:latest"
}

コンテナの名前を変更しただけです
これで再度 apply するとコンテナの名前が変わっていると思います
docker プロバイダの場合コンテナの名前が変更されたわけではなく実際は前のコンテナが削除されて別のコンテナが作成されています

プロビジョニングする

terraform ではインスタンスなどを構築時にスクリプトを実行してプロビジョニングすることも可能です
ただ、docker プロバイダではプロビジョンの機能は提供されていません (当然ですが)
AWS のリソースなどを扱える aws_instance などでは使うことができます

変数を利用する

場合によっては apply 時に毎回情報を書き換えたい場合があると思います
そんなときは変数を使うことができます
.tf ファイルを以下のように書き換えましょう

  • vim main.tf
variable "container_name" {
  default = "hoge"
}

provider "docker" {
  host = "tcp://127.0.0.1:2376/"
}

# Create a container
resource "docker_container" "foo" {
  image = "${docker_image.ubuntu.latest}"
  name  = "${var.container_name}"
}

resource "docker_image" "ubuntu" {
  name = "ubuntu:latest"
}

variable を使って変数を使用することができます
default を使えばデフォルト値を設定することもできます
参照するときは ${var.container_name} として参照することができます (なぜか var. なので注意)

  • terraform apply

で実行すると default の値が使用されます

  • terraform plan -var container_name="fuga"
  • terraform apply -var container_name="fuga"

とすると fuga というコンテナを作成することができます

また key = value 形式のファイルを作成して -var-file でファイルを参照することもできます
変数には list や map 形式で定義することもできます

特定の結果を表示する

apply で実行した結果を確認したいケースはあると思います
そんなときは output リソースを使用することで指定した結果を取得することができます

  • vim main.tf
variable "container_name" {
  default = "hoge"
}

provider "docker" {
  host = "tcp://127.0.0.1:2376/"
}

# Create a container
resource "docker_container" "foo" {
  image = "${docker_image.ubuntu.latest}"
  name  = "${var.container_name}"
}

resource "docker_image" "ubuntu" {
  name = "ubuntu:latest"
}

output "id" {
  value = "${docker_container.foo.id}"
}

最後の output リソースがそれに当たります
上記の場合は作成されたコンテナの id を取得します

  • terraform apply

で実行したあとに

  • terraform output id

とすることで id の情報を取得することができます

モジュール化する

terraform では .tf ファイルをモジュールにすることができます
モジュール化した .tf ファイルを参照することでモジュール内のリソースを使用することができるようになります

.tf ファイル内で modules の定義をして terraform get を実行するとモジュールの .tf ファイルを取得できます

今回は試さないので詳しくはこちらを試してみてください
サンプルは consul 用の module を使用しています

Remote Backends

それ以外には Remote Backends という機能があり terraform で実行した履歴や状態を保存しておくことができます
自分一人で使っている場合には不要なのですが、例えばプロダクションなどの環境でいろんなホストから実行される場合などにどこまで apply しているかを確認することができようになります

こちらも今回は試していないので興味があれば公式を見ながら試してみてださい

最後に

terraform を試してみました
公式の Getting Started は AWS 環境を使っていますが準備が大変だったのでさらっとできる docker プロバイダで試してみました

正直 docker-compose で足りるような気もしますが docker コマンドのオペレーションもこれを使えばコード化できるのが嬉しい点かなと思います
ただ docker build はできないっぽいので、それは terraform 以外の世界で事前に作成する必要があります

参考サイト

0 件のコメント:

コメントを投稿