Ценность зацикленных ресурсов ссылки Terraform

Я пытаюсь использовать провайдер для записи общедоступного IP-адреса вновь созданного экземпляра Azure в файл.

Мне удалось это сделать в единственном экземпляре.

resource "azurerm_public_ip" "helloterraformips" {
    name = "terraformtestip"
    location = "East US"
    resource_group_name = "${azurerm_resource_group.test.name}"
    public_ip_address_allocation = "dynamic"

    tags {
        environment = "TerraformDemo"
    }
}


resource "null_resource" "ansible-provision" {
depends_on = ["azurerm_virtual_machine.master-vm"]
count = "${var.node-count}"
   provisioner "local-exec" {
    command =  "echo \"[masters]\n ansible_ssh_host=${azurerm_public_ip.helloterraformips.ip_address} \" >> /home/osboxes/ansible-kube/ansible/inventory/testinv"
  }
}

Проблема в том, что когда я пытаюсь сделать то же самое с созданной виртуальной машиной через цикл Terraform, я сталкиваюсь с проблемами при попытке получить к ним доступ.

resource "azurerm_public_ip" "mysvcs-k8sip" {
  count                        = "${var.node-count}"
  name                         = "mysvcs-k8s-ip-${count.index}"
  location                     = "East US"
  resource_group_name          = "${azurerm_resource_group.mysvcs-res.name}"
  public_ip_address_allocation = "dynamic"
}

resource "null_resource" "ansible-provision" {

  provisioner "local-exec" {
    command =  "echo \"[masters]\n${element(azurerm_public_ip.mysvcs-k8sip.*.ip_address,count.index)} \" >> /home/osboxes/ansible-kube/ansible/inventory/inventory"
  }
 }

Я получаю эту ошибку

Ресурс 'azurerm_public_ip.mysvcs-k8sip' не имеет атрибута 'ip_address' для переменной 'azurerm_public_ip.mysvcs-k8sip. *. Ip_address'

Я копаюсь в семантике Terraform и пробую разные вещи, но пока это не работает, и каждая итерация для создания всех ресурсов также требует времени. Любая помощь или подсказка были бы очень полезны.

Спасибо,


person Vikram    schedule 20.04.2017    source источник
comment
Я не думаю, что это полный ответ, поскольку ваше сообщение об ошибке не согласуется с этим решением, но обратите внимание, что вам также необходимо иметь count = "${var.node-count}" на null_resource, чтобы гарантировать, что вы получите один экземпляр этого для каждого экземпляра azurerm_public_ip   -  person Martin Atkins    schedule 21.04.2017
comment
Хороший улов, я пропустил счетчик, когда он редактировал, обновил его сейчас. Похоже, это ограничение в Terraform, и мне пришлось бы обойти github.com/hashicorp/terraform/ issues / 6634   -  person Vikram    schedule 21.04.2017
comment
Эта проблема выглядит актуальной, но я не уверен, почему в этом случае она сработает в ситуации, когда у вас нет count. Если проблема заключается в том, что для выделения IP-адреса требуется некоторое время, вы можете попробовать сначала запустить terraform с -target=azurerm_public_ip.mysvcs=k8sip, временно игнорируя null_resource, а затем снова запустить Terraform без специальных флагов, подождав некоторое время, пока IP-адреса не отобразятся. вверх, чтобы Terraform мог их найти при обновлении. Не идеально, я знаю ...   -  person Martin Atkins    schedule 22.04.2017


Ответы (1)


Один обходной путь, который я смог сделать, и заставить эту работу работать, заключался в запуске «terraform apply -target = azurerm_virtual_machine.master-vm», который сначала создает виртуальную машину. Затем снова запустите terraform apply, чтобы запустить провайдер с этим

resource "null_resource" "ansible-k8snodes"{
  count = "${var.node-count}"

  provisioner "local-exec" {
   command =  "echo \"\n[nodes]\n ${element(azurerm_public_ip.mysvcs-k8sip.*.ip_address,count.index+1)} ansible_ssh_user=testadmin ansible_ssh_pass=Password1234! \"  >>  /home/osboxes/ansible-kube/ansible/inventory/inventory"
  }
}

@Martin - Считай или не считай, это не имеет значения, и каждый раз он терпит неудачу. На самом деле, похоже, что это сработало только один раз для единственного экземпляра кода, опубликованного выше в моем вопросе, когда я попробовал его снова, он не сработал. Спасибо за вашу помощь.

person Vikram    schedule 24.04.2017