2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

azureのsubnetをimportして使いまわし複数ホストをterraformでたてる

Last updated at Posted at 2017-12-12

タイトル通りの内容のtfファイルや参考サイトなどを備忘録しておきます。
以前やってみたときは複数ではなかったのでした。

tfファイル

Azure上の冗長を意味するのは可用性セットの障害ドメインと更新ドメインらしいのでサブネット分ける意味がどんだけあるのかはアレですがなんとなく分けた感じです。
countで2台たてており、formatで%02dてのは整数2桁って感じの意味合いだと思いますたぶん。なので以下のvarsとtfだとmynode01、mynode02みたいなホスト名がついて上がってきます。

terraform.tf
variable "default_user" {}
variable "default_password" {}
variable "resouce_group_name" {}
variable "location" {}
variable "azurerm_virtual_network_name" {}
variable "azurerm_virtual_network_address_space" {}
variable "azurerm_subnet_name" {}
variable "azurerm_subnet_address_prefix" {}
variable "virtual_machine_name_test" {}
variable "storage_account" {}
variable "account_tier" {}
variable "account_replication_type" {}
variable "vm_size" {}
variable "storage_image_reference_publisher" {}
variable "storage_image_reference_offer" {}
variable "storage_image_reference_sku" {}
variable "storage_image_reference_version" {}
provider "azurerm" {
}
resource "azurerm_resource_group" "test" {
  name = "${var.resouce_group_name}" 
  location = "${var.location}" 
}
resource "azurerm_virtual_network" "test" {
  name = "${var.azurerm_virtual_network_name}" 
  address_space = ["${var.azurerm_virtual_network_address_space}"]
  location = "${azurerm_resource_group.test.location}" 
  resource_group_name = "${azurerm_resource_group.test.name}" 
}
resource "azurerm_subnet" "test" {
  count = 2
  name = "${element(split(",",var.azurerm_subnet_name), count.index%length(split(",", var.azurerm_subnet_name)))}" 
  resource_group_name = "${azurerm_resource_group.test.name}" 
  virtual_network_name = "${azurerm_virtual_network.test.name}" 
  address_prefix = "${element(split(",",var.azurerm_subnet_address_prefix), count.index%length(split(",", var.azurerm_subnet_address_prefix)))}" 
}
resource "azurerm_public_ip" "test" {
  count = 2
  name = "${format("${var.virtual_machine_name_test}%02d", count.index + 1)}-pip" 
  location = "${azurerm_resource_group.test.location}" 
  resource_group_name = "${azurerm_resource_group.test.name}" 
  public_ip_address_allocation = "static" 
  domain_name_label = "${format("${var.virtual_machine_name_test}%02d", count.index + 1)}-pip" 
  tags {
      environment = "test" 
    }
}
resource "azurerm_network_interface" "test" {
  count = 2
  name = "${format("${var.virtual_machine_name_test}%02d", count.index + 1)}-nic1" 
  location = "${azurerm_resource_group.test.location}" 
  resource_group_name = "${azurerm_resource_group.test.name}" 
  ip_configuration {
      name = "${format("${var.virtual_machine_name_test}%02d", count.index + 1)}-ip" 
      subnet_id = "${element(azurerm_subnet.test.*.id, count.index)}" 
      private_ip_address_allocation = "dynamic" 
      public_ip_address_id = "${element(azurerm_public_ip.test.*.id, count.index)}" 
  }
}
resource "azurerm_storage_account" "test" {
    name = "${var.storage_account}" 
    resource_group_name = "${azurerm_resource_group.test.name}" 
    location = "${azurerm_resource_group.test.location}" 
    account_tier = "${var.account_tier}" 
    account_replication_type = "${var.account_replication_type}" 
    tags {
        environment = "staging" 
    }
}
resource "azurerm_storage_container" "test" {
    count = 2
    name = "${format("${var.virtual_machine_name_test}%02d", count.index + 1)}-vhds" 
    resource_group_name = "${azurerm_resource_group.test.name}" 
    storage_account_name = "${azurerm_storage_account.test.name}" 
    container_access_type = "private" 
}
resource "azurerm_virtual_machine" "test" {
  count                 = 2
  name                  = "${format("${var.virtual_machine_name_test}%02d", count.index + 1)}" 
  location              = "${azurerm_resource_group.test.location}" 
  resource_group_name   = "${azurerm_resource_group.test.name}" 
  network_interface_ids = ["${element(azurerm_network_interface.test.*.id, count.index)}"]
  vm_size               = "${var.vm_size}" 
  storage_image_reference {
    publisher = "${var.storage_image_reference_publisher}" 
    offer = "${var.storage_image_reference_offer}" 
    sku = "${var.storage_image_reference_sku}" 
    version = "${var.storage_image_reference_version}" 
  }
  storage_os_disk {
    name              = "${var.virtual_machine_name_test}-osdisk1" 
    vhd_uri = "${azurerm_storage_account.test.primary_blob_endpoint}${element(azurerm_storage_container.test.*.name, count.index)}/myosdisk1.vhd" 
    caching           = "ReadWrite" 
    create_option     = "FromImage" 
    os_type           = "linux" 
  }
  os_profile {
    computer_name  = "${format("${var.virtual_machine_name_test}%02d", count.index + 1)}" 
    admin_username = "${var.default_user}" 
    admin_password = "${var.default_password}" 
  }
  os_profile_linux_config {
    disable_password_authentication = false
  }
  tags {
    environment = "test" 
  }
}

varsファイル参考

terraform.tfvars.sample
default_user = "ssh-username"
default_password = "ssh-password"
resouce_group_name = "myresource-groupname"
location = "Japan West"
azurerm_virtual_network_name = "my01VNET"
azurerm_virtual_network_address_space = "10.0.0.0/16"
azurerm_subnet_name = "myPub01Subnet,myPub02Subnet"
azurerm_subnet_address_prefix = "10.0.0.0/23,10.0.2.0/23"
virtual_machine_name_test = "mynode"
storage_account = "mystorageaccountname"
account_tier = "Standard"
account_replication_type = "LRS"
vm_size = "Standard_DS1_v2"
storage_image_reference_publisher = "Canonical"
storage_image_reference_offer = "UbuntuServer"
storage_image_reference_sku = "16.04-LTS"
storage_image_reference_version = "latest"

importサンプル

importしないとなんか消してから作り直そうとしよって既存subnet上にVMあるからsubnet消せないエラーが出て使いまわせなくてガッカリしますがimportするとtfstateに既存リソースの値が書かれて既存のsubnetなどをアッサリつかいまわせるようになります。複数の場合は添え字でいけますしtfファイルで取り出すときにはformatとかcountとかelementとかsplitとか使えるということらしいのでそんな感じで工夫すると取り出せます。
importのしかたはググってもAWSの例ばっかりですがリソース毎の公式マニュアルのしたのほうにimportコマンドの例が書いてあったりします。
https://www.terraform.io/docs/providers/azurerm/r/subnet.html

$ vi main.tf
provider "azurerm" {
}
resource "azurerm_virtual_network" "test" {
}
resource "azurerm_subnet" "test" {
}

$ terraform import azurerm_virtual_network.test /subscriptions/<subscription_id>/resourceGroups/<myresource-groupname>/providers/Microsoft.Network/virtualNetworks/my01VNET
$ terraform import azurerm_subnet.test[0] /subscriptions/<subscription_id>/resourceGroups/<myresource-groupname>/providers/Microsoft.Network/virtualNetworks/my01VNET/subnets/myPub01Subnet
$ terraform import azurerm_subnet.test[1] /subscriptions/<subscription_id>/resourceGroups/<myresource-groupname>/providers/Microsoft.Network/virtualNetworks/my01VNET/subnets/myPub02Subnet
$ mv main.tf{,bkup} 
$ terraform plan
$ terraform apply
$ terraform show

NSGを手でNICにくっつける感じなのをどうにかしたいといえばしたいけどマニュアルみてもよくわかんなかったです。
どなたか知ってたらおしえてください。
 コメント欄で教えていただいたので次の機会に善処します。

参考

Terraformで複数台のEC2インスタンスを構築する場合のTIPS | Developers.IO
NSGを作成しようとしているときにリクエストの例外を解析できない・Issue#788・Azure / azure-sdk-for-python
Azure Resource Manager: azure_virtual_network - Terraform by HashiCorp
Terraformで複数台のAzure Virtual Machineを構築する方法 - Change the World!
azure-examples/computes.tf at master · changeworld/azure-examples
Interpolation Syntax - Terraform by HashiCorp
Terraform職人入門: 日々の運用で学んだ知見を淡々とまとめる - Qiita

2
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?