それなりに適当にやってます

なんとなくそれっぽいメモとか備忘録とか適当に。 2018年5月にブログ移転しました。 古い記事は未整理です。

terraform-inventory を試した

terraform-inventory を使って、Terraform で生成された .tfstate を元に Ansible を実行してみたのでメモを残しとく

やりたかったこと

  1. VMware vCenter で動作している VM または テンプレートの複製
  2. 複製したVMに対する Ansible の実行

これはやろうと思えば Ansible で全部出来ると思う。 ただ Ansible だけでごちゃっと頑張るよりは Terraform と Ansible で役割を分担させたかったし、Terraform の実行した結果に対して Ansible を実行できるのなら VMware に拘らず他の環境にも適用しやすいでのは〜とも思い、 Terraform と Ansible の連携方法を探したところ terraform-invenroty を見つけた。

やったこと

以降で作ってみたものは GitHub に置いてる

Terraform の実行

とりあえず Terraform のバイナリを取得して、実行可能なパスに置く。

yum -y install wget unzip
mkdir ~/bin ; cd $_
wget https://releases.hashicorp.com/terraform/0.11.11/terraform_0.11.11_linux_amd64.zip
unzip terraform_0.11.11_linux_amd64.zip
cd ~
which terraform

GitHub に置いたコードを編集して Terraform を実行

git clone https://github.com/pochio/terraform-inventory-example.git
cd terraform-inventory-example

# vCenter のアクセス情報を反映
vi variables.tf

# vCenter のDatacenter, Cluster, Network, Datastore, Clone元のVM, Clone先のVMなどを設定
vi vmware.tf

# Terraform の実行 (vCenter上でVMクローンを実行)
terraform init
terraform plan
terraform apply


terraform-inventory の実行

Terraform と同じく、バイナリを落としてパスの通っている場所に設置する。

cd ~/bin
wget https://github.com/adammck/terraform-inventory/releases/download/v0.8/terraform-inventory_v0.8_linux_amd64.zip
unzip terraform-inventory_v0.8_linux_amd64.zip
cd ~
which terraform-inventory

コマンド単体で実行すると、下記のように .tfstate から生成したインベントリを返してくれる。 デフォルトはカレントディレクトリの terraform.tfstate を参照するので、別のパスを指定したい場合はTF_STATE環境変数で指定する。

TF_STATE=terraform.tfstate terraform-inventory -inventory
...
[all]
192.168.2.1

[all:vars]

[type_vsphere_virtual_machine]
192.168.2.1

[vm]
192.168.2.1

[vm.0]
192.168.2.1


Ansible の実行

サンプルとして Apache をインストール / 起動するだけの Playbook を作成・実行してみる。

vi apache-playbook.yaml
---
- hosts: all
  become: yes
  tasks:
   - name: install apache
     yum: name=httpd
   - name: start apache
     systemd: name=httpd state=restarted

ansible-playbook コマンドのインベントリに terraform-inventory を指定して実行する。 terraform-inventory はフルパスで指定しないとダメだったので注意

ansible-playbook \
    --ask-pass \
    --ask-su-pass \
    --become-method=su \
    --inventory-file=~/bin/terraform-inventory \
    apache-playbook.yaml

結果

  • やりたかった事は実現できた ( Terraform > terraform-inventory > Ansible の適用)
  • Terraform でクローンしたVMのNIC設定が DHCP でも .tfstate に情報があるのでそのまま Ansible を適用できた。
  • 不要になったら terraform destroy で捨てるだけで済む。

これで、これまで vCenter にログインして、VMをクローンして、IPを設定して、Ansible を〜という手間のかかっていた工程を省略できるし、Ansible のテストもしやすくなったかも??

以上、c⌒っ゚д゚)っφ メモメモ...

Infrastructure as Code ―クラウドにおけるサーバ管理の原則とプラクティス

Infrastructure as Code ―クラウドにおけるサーバ管理の原則とプラクティス