Рейтинг:0

Подсеть не создается с помощью terraform на Azure, как это исправить?

флаг cn

Я пытаюсь создать две машины Centos 8 с terraform на Azure.

Мои шаблоны гитхаб соединять

Когда я пытаюсь подать заявку, я получаю следующую ошибку, связанную с политикой. Не могли бы вы подсказать, как это исправить?

> • Ошибка: создание подсети: (Имя «subnetforAutomation» / Имя виртуальной сети «vnetforAutomation» / Группа ресурсов «automation_mart»):
> network.SubnetsClient#CreateOrUpdate: Ошибка отправки запроса:
> StatusCode=0 -- Исходная ошибка: Code="RequestDisallowedByPolicy"
> Message="Ресурс "subnetforAutomation" запрещен политикой.
> Идентификаторы политик:
> '[{\"policyAssignment\":{\"name\":\"Deny-Subnet-Without-Nsg\",\"id\":\"/providers/Microsoft.Management/managementGroups/QSFT-landingzones/ провайдеры/Microsoft.Authorization/policyAssignments/Deny-Subnet-Without-Nsg\"},\"policyDefinition\":{\"name\":\"Подсети
> должна быть группа безопасности сети
> \",\"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" ,"оператор":"Равно","путь":"тип","результат":"Истина","целевое значение":"Microsoft.Network/virtualNetworks/subnets"},{"выражение":"Microsoft.Network/ virtualNetworks/subnets/networkSecurityGroup.id","expressionKind":"Поле","оператор":"Существует","путь":"properties.networkSecurityGroup.id","результат":"True","targetValue":" false"}]},"policyAssignmentDisplayName":"Deny-Subnet-Without-Nsg","policyAssignmentId":"/providers/Microsoft.Management/managementGroups/QSFT-landingzones/providers/Microsoft.Authorization/policyAssignments/Deny-Subnet- Without-Nsg","policyAssignmentName":"Deny-Subnet-Without-Nsg","policyAssignmentScope":"/providers/Microsoft.Management/managementGroups/QSFT-landingzones","policyDefinitionDisplayName":"Подсети
> должна быть группа безопасности сети
> ","policyDefinitionEffect":"Запретить","policyDefinitionId":"/providers/Microsoft.Management/managementGroups/QSFT/providers/Microsoft.Authorization/policyDefinitions/Deny-Subnet-Without-Nsg","policyDefinitionName":"Запретить -Subnet-Without-Nsg"},"type":"PolicyViolation"}]
> 
>
> с azurerm_subnet.subnet,
> в строке 24 main.tf, в ресурсе "azurerm_subnet" "подсеть":
> 24: ресурс "azurerm_subnet" "подсеть" {
>

Я пытался сохранить встроенную подсеть внутри vnet. И проблема возникает теперь при обращении к подсети из блока ресурсов экземпляра виртуальной машины на самом этапе планирования.

 Ошибка: неподдерживаемый атрибут
✓
✓ в строке 26 network.tf в ресурсе "azurerm_network_interface" "example":
26: subnet_id = azurerm_virtual_network.vnet.subnet.id #azurerm_subnet.subnet.id
✓
• Не удается получить доступ к атрибутам набора объектов. Вы имели в виду доступ к атрибуту во всех элементах набора?
âµ

//main.tf

## <https://www.terraform.io/docs/providers/azurerm/r/windows_virtual_machine.html>
ресурс "azurerm_windows_virtual_machine" "пример" {
  имя = var.machine_details.name
  имя_компьютера = var.machine_details.name
  resource_group_name = azurerm_resource_group.rg.name
  местоположение = azurerm_resource_group.rg.location
  размер = var.machine_details.size
  admin_username = var.machine_details.username
  admin_password = var.machine_details.password
  network_interface_ids = [
    azurerm_network_interface.example.id,
  ]

  ОС_диск {
    кэширование = "Чтение-Запись"
    storage_account_type = "Стандартный_LRS"
  }

  source_image_reference {
    издатель = "MicrosoftWindowsServer"
    предложение = "WindowsServer"
    sku = "2019-ЦОД"
    версия = "последняя"
  }
}

//network.tf

## <https://www.terraform.io/docs/providers/azurerm/r/virtual_network.html>
ресурс "azurerm_virtual_network" "vnet" {
  имя = "виртуальная сеть"
  адресное_пространство = ["10.0.0.0/16"]
  местоположение = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name

подсеть{
 имя = "внутренний"
 адрес_префикс = "10.0.2.0/24"
 security_group = azurerm_network_security_group.example.id
}

}


## <https://www.terraform.io/docs/providers/azurerm/r/network_interface.html>
ресурс "azurerm_network_interface" "пример" {
  имя = "пример-ник"
  местоположение = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name

  ip_configuration {
    имя = "внутренний"
    subnet_id = azurerm_virtual_network.vnet.subnet.id #azurerm_subnet.subnet.id
    private_ip_address_allocation = "Динамический"
    public_ip_address_id = azurerm_public_ip.myvm1publicip.id
  }
}

ресурс "azurerm_public_ip" "myvm1publicip" {
  имя = var.public_ip.name
  местоположение = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
  метод_распределения = var.public_ip.метод_распределения
  sku = var.public_ip.sku
}

ресурс "azurerm_network_security_group" "пример" {
  имя = var.nsg
  местоположение = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
  безопасность_правило {
    имя = "тест123"
    приоритет = 100
    направление = "Входящий"
    доступ = "Разрешить"
    протокол = "TCP"
    source_port_range = "*"
    диапазон_порта_назначения = "*"
    исходный_адрес_префикс = "*"
    префикс_адреса_назначения = "*"
  }
}

//провайдер.tf

## <https://www.terraform.io/docs/providers/azurerm/index.html>
провайдер "азурерм" {
  Особенности {}
}

//rg.tf

## <https://www.terraform.io/docs/providers/azurerm/r/resource_group.html>
ресурс "azurerm_resource_group" "rg" {
  имя = "ТерраформТестинг2"
  местоположение = var.location
}

//переменные.tf

переменная "местоположение" {
  тип = строка
  description = "Регион Azure, в котором будут предоставлены все эти ресурсы"
  по умолчанию = "eastus2"
}

переменная "public_ip" {
 

  по умолчанию = {
      имя = "пип1"
      распределение_метод = "Динамический"
      артикул = "Базовый"
    }
  
  
}

переменная "nsg" {
  тип = строка
  описание = "Azure NSG"
  по умолчанию = "пример-nsg"
}

переменная "machine_details" {
  
  по умолчанию = {
      имя = "пример-vm2"
      размер = "Стандарт_E2s_v3" #"Стандарт_F2"
      имя пользователя = "adminname"
      пароль = "MyPaword!@3"
    }
  
}
Mat avatar
флаг cn
Mat
«Подсети должны иметь группу безопасности сети»
Sara June avatar
флаг cn
я добавил, все еще возникает та же проблема
Рейтинг:1
флаг ng

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

Это недостаток того, как Terraform строится поверх ARM API. Для этого нет отличного решения, кроме как заставить ваших администраторов ослабить эту политику.

Редактировать:

Итак, глядя на Эта проблема что очень похоже на то, что вы видите, кажется, вы можете обойти это, определив свои подсети внутри вашего виртуальная_сеть ресурс, а не как отдельные ресурсы подсети. Используя это, вы можете определить встроенную ассоциацию NSG, и это может быть сделано в одном кале:

ресурс "azurerm_virtual_network" "пример" {
  имя = "виртуальная сеть1"
  location = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name
  адресное_пространство = ["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
    включить = правда
  }


  подсеть {
    имя = "подсеть3"
    адрес_префикс = "10.0.3.0/24"
    security_group = azurerm_network_security_group.example.id
  }

  теги = {
    среда = "Производство"
  }
}
Sara June avatar
флаг cn
Спасибо за ответ, Сэм, но наша команда безопасности не разрешает это решение, есть ли другой способ, кроме как пропустить эту политику?
флаг ng
См. редактирование, определяющее все, что встроено в объект виртуальной сети, который, как я думаю, может работать. Если нет, то единственным способом сделать это будет создание шаблона ARM и вызов его с использованием ресурса шаблона Terraform ARM или сценария с использованием параметра local exec.
Sara June avatar
флаг cn
Привет @ sam-cogan. Я пытался сохранить подсеть в части vnet, но получил ошибку во время самого плана. не могли бы вы увидеть детали, которые я добавил выше.
Sara June avatar
флаг cn
кажется, работает, если я получаю доступ к этому как azurerm_virtual_network.vnet.subnet.*.id[0]
Рейтинг:0
флаг al

Столкнувшись с той же проблемой, мы переназначили политику с действием «Аудит» вместо «Запретить». Если у вас есть на это права.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.