Terraform for さくらのクラウド(ブリッジ接続メモ)


**2016/5/24追記**

Terraform for さくらのクラウドのバージョンアップに伴い、
resource項目などが最新バージョンと異なる可能性があります。
最新の情報は[GitHub](https://github.com/yamamoto-febc/terraform-provider-sakuracloud)を参照してください。

#### 関連記事

[Terraform for さくらのクラウド スタートガイド](http://qiita.com/yamamoto-febc/items/ae92cd258cf040957487)

---

自分用メモ。
Terraform for さくらのクラウドで複数ゾーン間(石狩/東京など)での
ブリッジ接続をおこなうまで。

## 作成されるクラウド上のリソース

* サーバー2台(石狩第１・第２）
* ディスク２本(各サーバーに1本ずつ)
* スイッチ2台(石狩第１・第２、ブリッジとの接続用）
* ブリッジ1台

サーバへのSSH接続は公開鍵認証のみとする。


## 前準備

* `terraform`のインストール
* `terraform for さくらのクラウド`のダウンロード
* `ssh-keygen` などでSSH用にキーペア作成(`id_rsa`と`id_rsa.pub`)

* 以下2つのシェルスクリプトを作成しておく。プロビジョニング用

``` provision_sv01.sh
#!/bin/sh

# eth1のIP設定
cat << EOS >> /etc/sysconfig/network-scripts/ifcfg-eth1
BOOTPROTO=static
PREFIX0=24
DEVICE=eth1
IPADDR0=192.168.1.1
ONBOOT=yes
EOS

#反映
ifdown eth1; ifup eth1
```

``` provision_sv02.sh
#!/bin/sh

# eth1のIP設定
cat << EOS >> /etc/sysconfig/network-scripts/ifcfg-eth1
BOOTPROTO=static
PREFIX0=24
DEVICE=eth1
IPADDR0=192.168.1.2
ONBOOT=yes
EOS

#反映
ifdown eth1; ifup eth1
```

* 以下環境変数にAPIキー情報を設定しておく
  * `SAKURACLOUD_ACCESS_TOKEN` ：アクセストークン
  * `SAKURACLOUD_ACCESS_TOKEN_SECRET` ：シークレット  

### terraform設定ファイル(tfファイル)

```sakura.tf
provider "sakuracloud" {}

##################################################
#  サーバー1(石狩第1)
##################################################
resource "sakuracloud_server" "is1a_sv01" {
    name = "sv01"
    disks = ["${sakuracloud_disk.disk01.id}"]
    tags = ["@virtio-net-pci"]
    switched_interfaces = [ "${sakuracloud_switch.sw01.id}" ]

    connection {
       user = "root"
       host = "${sakuracloud_server.is1a_sv01.shared_nw_ipaddress}"
       private_key = "${file("./id_rsa")}"
    }
 
    provisioner "file" {
        source = "provision_sv01.sh"
        destination = "/tmp/script.sh"
    }
 
    provisioner "remote-exec" {
        inline = [
          "chmod +x /tmp/script.sh",
          "/tmp/script.sh"
        ] 
   }
   zone = "is1a"
}
##################################################
#  サーバー2(石狩第2)
##################################################
resource "sakuracloud_server" "is1b_sv02" {
    name = "sv02"
    disks = ["${sakuracloud_disk.disk02.id}"]
    tags = ["@virtio-net-pci"]
    switched_interfaces = [ "${sakuracloud_switch.sw02.id}" ]
    connection {
       user = "root"
       host = "${sakuracloud_server.is1b_sv02.shared_nw_ipaddress}"
       private_key = "${file("./id_rsa")}"
    }
    provisioner "file" {
        source = "provision_sv02.sh"
        destination = "/tmp/script.sh"
    }

    provisioner "remote-exec" {
        inline = [
          "chmod +x /tmp/script.sh",
          "/tmp/script.sh"
        ] 
   }
   zone = "is1b"
}

##################################################
#  サーバー1用ディスク(石狩第1)
##################################################
resource "sakuracloud_disk" "disk01" {
    name = "disk01"
    source_archive_name = "CentOS 7.2 64bit"
    ssh_key_ids = ["${sakuracloud_ssh_key.mykey.id}"]
    disable_pw_auth = true
    zone = "is1a"
}
##################################################
#  サーバー2用ディスク(石狩第1)
##################################################
resource "sakuracloud_disk" "disk02" {
    name = "disk02"
    source_archive_name = "CentOS 7.2 64bit"
    ssh_key_ids = ["${sakuracloud_ssh_key.mykey.id}"]
    disable_pw_auth = true
    zone = "is1b"
}

##################################################
#  スイッチ(石狩第1)：ブリッジに接続
##################################################
resource "sakuracloud_switch" "sw01"{
    name = "sw01"
    zone = "is1a"
    bridge_id = "${sakuracloud_bridge.br.id}"
}
##################################################
#  スイッチ(石狩第2)：ブリッジに接続
##################################################
resource "sakuracloud_switch" "sw02"{
    name = "sw02"
    zone = "is1b"
    bridge_id = "${sakuracloud_bridge.br.id}"
}

##################################################
#  ブリッジ(ゾーン間の接続)
##################################################
resource "sakuracloud_bridge" "br"{
    name = "br01"
    zone = "is1a"
}

/************************
 SSHKey
************************/
resource "sakuracloud_ssh_key" "mykey" {
    name = "key"
    public_key = "${file("./id_rsa.pub")}"
}
```

## 実行

```terraform実行
# 確認
terraform plan

# 実行
terraform apply

# 作ったマシンのグローバルIP確認(２台分表示される)
terraform show | grep "shared_nw_address"

# 作ったマシンへのSSH
ssh root@[先ほど確認したIP] -i id_rsa

# ping(異なるゾーンへつながってることを確認)
ping 192.168.1.1
# または
ping 192.168.1.2

```