Je crée le groupe de ressources et le réseau virtuel dans le main.tf et le module de référence dans le même fichier. Le problème est que le module ne peut pas accéder à ces ressources à partir du module. code associé (la plupart du code a été supprimé, il ne reste que les parties pertinentes):

main.tf:

module "worker" {
  source = "./vmLoop"

  vmName = "worker"
  prefix = "${var.reference["name"]}"
  loop   = "${var.reference["workerCount"]}"
}

resource "azurerm_resource_group" "rg" {
  name     = "${var.reference["name"]}"
  location = "${var.reference["location"]}"
}

Comment référencer ce groupe de ressources dans le module? à l'intérieur de main.tf je peux faire ceci: "${azurerm_resource_group.rg.name}". Non seulement cela, si je veux utiliser des données à l'intérieur du module, cela échouerait car la ressource n'est pas encore créée (la plupart du code a été supprimé, il ne reste que les parties pertinentes):

Module.tf:

data "azurerm_resource_group" "rg" {
  name = "${var.prefix}"
}

Tout fonctionne bien si je précrée le groupe de ressources \ vnet.

Dans le modèle de bras, j'ajouterais une propriété dependsOn. Cependant, les modules de terraform ne prennent pas en charge depends_on.

1
4c74356b41 20 nov. 2018 à 15:45

3 réponses

Meilleure réponse

Il existe une solution de contournement assez hackish à cela.

Vous pouvez utiliser depend_on sur les variables de sortie du module en amont en aval, MAIS vous devez vous assurer que vous utilisez la variable dans le module en aval, pas seulement l'utiliser dans la clause depend_on.

Malheureusement, ce n'est pas une solution idéale et elle peut ne pas être applicable dans certaines situations.

0
AlexK 20 nov. 2018 à 16:17

Vous devez transmettre le nom du groupe de ressources au module. c'est à dire.:

module "worker" {
  source = "./vmLoop"

  rg     = "${azurerm_resource_group.rg.name}"    
  vmName = "worker"
  prefix = "${var.reference["name"]}"
  loop   = "${var.reference["workerCount"]}"
}

Ensuite, dans le code du module de travail lui-même, vous utiliseriez la variable rg pour le groupe de ressources du travailleur.

0
KJH 20 nov. 2018 à 15:39

Dans le module, vous devez transmettre le subnetID ou le groupe de ressources, ou tout ce que vous créez en tant que variable. Par exemple, dans votre configuration principale, vous pouvez appeler ce qui suit:

module "vnet" {
  source              = "Azure/network/azurerm"
  resource_group_name = "${var.resource_group}"
  vnet_name           = "${terraform.workspace}-vnet"
  location            = "${var.arm_region}"
  address_space       = "${var.arm_network_address_space}"
  subnet_prefixes     = ["${var.arm_subnet1_address_space}", "${var.arm_subnet2_address_space}"]
  subnet_names        = ["subnet1", "subnet2"]

  tags = {
    environment = "${terraform.workspace}"
  }
}

Appelez ensuite votre module vmdeploy en utilisant le subnetID comme suit:

module "vmdeploy" {
 source = "./vmdeploy"
 subnetID = "${module.vnet.vnet_subnets[0]}"
}

En référençant l'autre module en tant que valeur pour le module vmdeploy, vous créez une dépendance implicite que Terraform reconnaîtra et inclura dans le graphique de ressources.

Dans le module lui-même, vous définiriez une variable appelée subnetID comme ceci:

var "subnetID" {}

Est ce que ça aide?

1
Ned Bellavance 21 nov. 2018 à 16:06