概要
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 件のコメント:
コメントを投稿