我可以通过 Terraform 管理 Azure 中已创建的资源吗?我可以使用 terraform 将其用作恢复备份文件的工具吗(这些 RSV 已创建) 我的主要要求之一是在灾难恢复发生时进行恢复,并通过 terraform 使用备份恢复资源,以便实现自动化
只是为了全面了解如何实施 Terraform 以便将来在 Azure 中配置资源以及已配置的资源
通过 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"
}
部署成功:
我可以通过 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 脚本。