我可以通过 Terraform 管理 Azure 中已创建的资源吗

问题描述 投票:0回答:2

我可以通过 Terraform 管理 Azure 中已创建的资源吗?我可以使用 terraform 将其用作恢复备份文件的工具吗(这些 RSV 已创建) 我的主要要求之一是在灾难恢复发生时进行恢复,并通过 terraform 使用备份恢复资源,以便实现自动化

只是为了全面了解如何实施 Terraform 以便将来在 Azure 中配置资源以及已配置的资源

azure terraform terraform-provider-azure
2个回答
0
投票

通过 Terraform 管理我在 Azure 中已创建的资源

这里要达到这个要求我们可以使用两种方式

导入资源:

正如 Rui Jarimba 建议的那样,使用 Terraform 管理现有资源需要首先将它们导入 Terraform 的状态。这是通过使用

terraform import
命令以及 Azure 中的资源地址及其 ID 来完成的。您还必须编写与现有资源相对应的 Terraform 配置。每个资源都必须使用
terraform import
命令单独导入。

未来供应

对于新资源,您可以照常编写 Terraform 配置并使用

terraform apply
应用它们。这种方法允许您定义基础设施的所需状态,并让 Terraform 处理供应和配置

Terraform 配置:

provider "azurerm" {
  features {}
}

resource "azurerm_resource_group" "rg" {
  name     = "vksbbtest-rg"
  location = "east us"
}

resource "azurerm_virtual_network" "vnet" {
  name                = "vksVNet"
  address_space       = ["10.0.0.0/16"]
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
}

resource "azurerm_subnet" "subnet" {
  name                 = "vksSubnet"
  resource_group_name  = azurerm_resource_group.rg.name
  virtual_network_name = azurerm_virtual_network.vnet.name
  address_prefixes     = ["10.0.1.0/24"]
}

resource "azurerm_network_interface" "nic" {
  name                = "vkNIC"
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name

  ip_configuration {
    name                          = "internal"
    subnet_id                     = azurerm_subnet.subnet.id
    private_ip_address_allocation = "Dynamic"
  }
}

resource "azurerm_linux_virtual_machine" "vm" {
  name                = "testvkvm"
  resource_group_name = azurerm_resource_group.rg.name
  location            = azurerm_resource_group.rg.location
  size                = "Standard_DS1_v2"
  admin_username      = "adminvk"
  admin_password      = "INtel@19091994"
  disable_password_authentication = "false"
  network_interface_ids = [
    azurerm_network_interface.nic.id,
  ]

  os_disk {
    caching              = "ReadWrite"
    storage_account_type = "Premium_LRS"
  }

  source_image_reference {
    publisher = "Canonical"
    offer     = "UbuntuServer"
    sku       = "18.04-LTS"
    version   = "latest"
  }
}

resource "azurerm_recovery_services_vault" "rsv" {
  name                = "vksRecoveryServicesVault"
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
  sku                 = "Standard"
}

resource "azurerm_backup_policy_vm" "policy" {
  name                = "vmBackupPolicy"
  resource_group_name = azurerm_resource_group.rg.name
  recovery_vault_name = azurerm_recovery_services_vault.rsv.name

  backup {
    frequency = "Daily"
    time      = "23:00"
  }

  retention_daily {
    count = 30
  }
}

resource "azurerm_backup_protected_vm" "backupVm" {
  resource_group_name = azurerm_resource_group.rg.name
  recovery_vault_name = azurerm_recovery_services_vault.rsv.name
  source_vm_id        = azurerm_linux_virtual_machine.vm.id
  backup_policy_id    = azurerm_backup_policy_vm.policy.id
}

resource "azurerm_storage_account" "storage_account" {
  name                     = "vkstoraccvksbll"
  resource_group_name      = azurerm_resource_group.rg.name
  location                 = azurerm_resource_group.rg.location
  account_tier             = "Standard"
  account_replication_type = "LRS"
}

部署成功:

enter image description here


0
投票

我可以通过 Terraform 管理 Azure 中已创建的资源吗

是的。有两种方法。第一种方法是使用

terraform import
语句。第二种方法是使用地形块

import {
  to = resource.name
  id = "id.12345"
}

在任何一种情况下,您都必须在导入之前了解资源提供者提供的资源 ID。

在代码中使用

import
通常是基于 PR 的 CI/CD 或 Gitops 风格部署的首选。例如,您正在回填一些手动管理的资源。您可以评估 id 的字符串,但它必须在导入计划时已知。所以你可以传入一个变量,我没有尝试使用数据源,但如果数据源在规划期间可用,这似乎是可行的。

通过 CLI 使用

terraform import
对于手动编写脚本或在您可能需要获取 id 并且只想在 DR 场景中使用现有代码和一组不同的资源的场景(如您的场景)非常有用。 (大概你想失败恢复)

在 DR secario 中需要考虑的一件事是确保您为 terraform 状态使用不同的密钥。

我可以使用 terraform 将其用作恢复我的备份文件的工具吗(那些 RSV 已创建)

理论上,您可以通过 https://learn.microsoft.com/en-us/azure/developer/terraform/overview-azapi-provider 传递 API 调用,但我不推荐这样做。这不是 terraform 的设计目的。您确实应该为今天的两种类型操作准备一个 Runbook 脚本。

© www.soinside.com 2019 - 2024. All rights reserved.