Puncte:0

Subrețeaua nu se creează cu terraform pe azure, cum se remediază?

drapel cn

Încerc să creez două mașini centos 8 cu terraform pe azur.

Șabloanele mele github legătură

Când încerc să aplic, primesc mai jos o eroare legată de politică. Ați putea vă rog să sugerați cum să remediați acest lucru?

> â Eroare: crearea subrețelei: (Nume „subnetforAutomation”/Nume rețea virtuală „vnetforAutomation”/Grup de resurse „automation_mart”):
> network.SubnetsClient#CreateOrUpdate: Eroare la trimiterea cererii:
> StatusCode=0 -- Eroare originală: Code="RequestDisallowedByPolicy"
> Message="Resursa „subnetforAutomation” a fost interzisă de politică.
> Identificatori de politică:
> „[{\"policyAssignment\":{\"name\":\"Deny-Subnet-Without-Nsg\",\"id\":\"/providers/Microsoft.Management/managementGroups/QSFT-landingzones/ providers/Microsoft.Authorization/policyAssignments/Deny-Subnet-Without-Nsg\"},\"policyDefinition\":{\"name\":\"Subnets
> ar trebui să aibă un grup de securitate de rețea
> \",\"id\":\"/providers/Microsoft.Management/managementGroups/QSFT/providers/Microsoft.Authorization/policyDefinitions/Deny-Subnet-Without-Nsg\"}}]'."
> Target="subnetforAutomation"
> AdditionalInfo=[{"info":{"evaluationDetails":{"evaluatedExpressions":[{"expression":"type","expressionKind":"Field","expressionValue":"Microsoft.Network/virtualNetworks/subnets" ,"operator":"Egal","path":"type","result":"True","targetValue":"Microsoft.Network/virtualNetworks/subnets"},{"expression":"Microsoft.Network/ virtualNetworks/subnets/networkSecurityGroup.id","expressionKind":"Field","operator":"Există","path":"properties.networkSecurityGroup.id","rezultat":"True","targetValue":" false"}]},"policyAssignmentDisplayName":"Deny-Subnet-Without-Nsg","policyAssignmentId":"/providers/Microsoft.Management/managementGroups/QSFT-landingzones/providers/Microsoft.Authorization/policyAssignments/-Deny Without-Nsg","policyAssignmentName":"Deny-Subnet-Without-Nsg","policyAssignmentScope":"/providers/Microsoft.Management/managementGroups/QSFT-landingzones","policyDefinitionDisplayName":"Subnets
> ar trebui să aibă un grup de securitate de rețea
> ","policyDefinitionEffect":"Deny","policyDefinitionId":"/providers/Microsoft.Management/managementGroups/QSFT/providers/Microsoft.Authorization/policyDefinitions/Deny-Subnet-Without-Nsg","policyDefinitionName":"Deny -Subnet-Without-Nsg"},"type":"PolicyViolation"}]
> 
> â
> â cu azurerm_subnet.subnet,
> â pe linia main.tf 24, în resursa „azurerm_subnet” „subnet”:
> â 24: resursa „azurerm_subnet” „subnet” {
> â

Am încercat să păstrez în linie, subrețeaua în interiorul vnet. Și problema apare acum când se face trimitere la subrețeaua din blocul de resurse de instanță VM chiar în etapa de plan.

 Eroare: atribut neacceptat
â
â pe linia network.tf 26, în resursa „azurerm_network_interface” „exemplu”:
â 26: subnet_id = azurerm_virtual_network.vnet.subnet.id #azurerm_subnet.subnet.id
â
â Nu pot accesa atributele unui set de obiecte. Ați vrut să accesați un atribut pentru toate elementele setului?
âµ

//main.tf

## <https://www.terraform.io/docs/providers/azurerm/r/windows_virtual_machine.html>
resursă „azurerm_windows_virtual_machine” „exemplu” {
  nume = var.detalii_mașină.nume
  computer_name = var.machine_details.name
  resource_group_name = azurerm_resource_group.rg.name
  locație = azurerm_resource_group.rg.location
  dimensiune = var.machine_details.size
  admin_username = var.machine_details.username
  admin_password = var.machine_details.parola
  network_interface_ids = [
    azurerm_network_interface.example.id,
  ]

  os_disk {
    cache = „Citește scriere”
    storage_account_type = „Standard_LRS”
  }

  source_image_reference {
    editor = „MicrosoftWindowsServer”
    oferta = "WindowsServer"
    sku = „2019-Datacenter”
    versiune = "cel mai recent"
  }
}

//network.tf

## <https://www.terraform.io/docs/providers/azurerm/r/virtual_network.html>
resursă „azurerm_virtual_network” „vnet” {
  nume = "vNet"
  adresa_spațiu = ["10.0.0.0/16"]
  locație = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name

subrețea{
 nume = "intern"
 address_prefix = „10.0.2.0/24”
 security_group = azurerm_network_security_group.example.id
}

}


## <https://www.terraform.io/docs/providers/azurerm/r/network_interface.html>
resursa „azurerm_network_interface” „exemplu” {
  nume = "exemplu-nic"
  locație = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name

  ip_configuration {
    nume = "intern"
    subnet_id = azurerm_virtual_network.vnet.subnet.id #azurerm_subnet.subnet.id
    private_ip_address_allocation = „Dinamic”
    public_ip_address_id = azurerm_public_ip.myvm1publicip.id
  }
}

resursa „azurerm_public_ip” „myvm1publicip” {
  nume = var.public_ip.name
  locație = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
  allocation_method = var.public_ip.allocation_method
  sku = var.public_ip.sku
}

resursă „azurerm_network_security_group” „exemplu” {
  nume = var.nsg
  locație = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
  regulă_securitate {
    nume = "test123"
    prioritate = 100
    directie = "Inbound"
    acces = "Permite"
    protocol = "Tcp"
    source_port_range = "*"
    destination_port_range = "*"
    source_address_prefix = "*"
    destination_address_prefix = "*"
  }
}

//provider.tf

## <https://www.terraform.io/docs/providers/azurerm/index.html>
furnizorul „azurerm” {
  Caracteristici {}
}

//rg.tf

## <https://www.terraform.io/docs/providers/azurerm/r/resource_group.html>
resursa „azurerm_resource_group” „rg” {
  nume = "TerraformTesting2"
  locație = var.locație
}

//variabile.tf

variabila „locație” {
  tip = șir
  description = „Regiunea Azure unde vor fi furnizate toate aceste resurse”
  implicit = "eastus2"
}

variabila „public_ip” {
 

  implicit = {
      nume = "pip1"
      allocation_method = „Dinamic”
      sku = „de bază”
    }
  
  
}

variabila „nsg” {
  tip = șir
  descriere = „Azure NSG”
  implicit = "exemplu-nsg"
}

variabila „detalii_mașină” {
  
  implicit = {
      nume = "exemplu-vm2"
      dimensiune = "Standard_E2s_v3" #"Standard_F2"
      username = "adminname"
      parola = "MyPaword!@3"
    }
  
}
Mat avatar
drapel cn
Mat
„Subrețele ar trebui să aibă un grup de securitate de rețea”
Sara June avatar
drapel cn
am adaugat, inca am aceeasi problema
Puncte:1
drapel ng

Subrețeaua nu poate fi creată deoarece nu este conformă cu o politică aplicată de administratorii dvs. Aceasta indică faptul că subrețeaua trebuie să aibă un NSG aplicat înainte de a putea fi creată. Din păcate, modul în care Terraform creează resurse este că mai întâi creați subrețeaua, apoi asociați NSG-ul cu ea. Acestea sunt două apeluri API, iar primul eșuează deoarece nu are un NSG asociat. Politica nu este conștientă că urmează un al doilea apel pentru a asocia NSG cu subrețeaua.

Acesta este dezavantajul modului în care Terraform se bazează pe API-ul ARM. Nu există o soluție excelentă pentru aceasta, în afară de a-i determina pe administratori să relaxeze această politică.

Editați | ×:

Deci privind această problemă care este destul de asemănător cu ceea ce vedeți, se pare că puteți rezolva asta definindu-vă subrețelele în interiorul dvs. rețea_virtuale resursă, mai degrabă decât ca resurse separate de subrețea. Folosind aceasta, puteți defini asocierea NSG în linie și aceasta o poate face într-o singură cale:

resursa „azurerm_virtual_network” „exemplu” {
  nume = "virtualNetwork1"
  locație = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name
  adresa_spațiu = ["10.0.0.0/16"]
  dns_servers = ["10.0.0.4", "10.0.0.5"]

  ddos_protection_plan {
    id = azurerm_network_ddos_protection_plan.example.id
    enable = adevărat
  }


  subrețea {
    nume = "subnet3"
    address_prefix = „10.0.3.0/24”
    security_group = azurerm_network_security_group.example.id
  }

  etichete = {
    mediu = „Producție”
  }
}
Sara June avatar
drapel cn
Mulțumesc pentru răspuns, Sam, dar echipa noastră de securitate nu permite această soluție, vreo altă modalitate în afară de omiterea acestei politici?
drapel ng
Vedeți editarea, definirea totul în linie, obiectul rețelei virtuale cred că poate funcționa. Dacă nu, atunci singura modalitate de a face acest lucru ar fi să creați un șablon ARM și să îl apelați folosind resursa șablonului Terraform ARM sau un script folosind opțiunea exec locală.
Sara June avatar
drapel cn
Bună @sam-cogan. Am încercat să păstrez subrețeaua în porțiunea vnet, dar am primit o eroare în timpul planului în sine. poti vedea te rog detaliile pe care le-am adaugat mai sus.
Sara June avatar
drapel cn
se pare că funcționează dacă accesez asta ca azurerm_virtual_network.vnet.subnet.*.id[0]
Puncte:0
drapel al

Întâmpinând aceeași problemă, am reatribuit politica cu acțiunea „Audit” în loc de „Refuză”. Dacă aveți permisiunile pentru a face acest lucru.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.