Terraform导入元数据
导入环境信息到本地状态文件
方案一: 小批量逐个导入
核心逻辑是在配置文件中先声明一个空的资源块, 然后通过命令将远程资源的状态关联进来, 最后再根据实际属性补齐配置
适合导入单个资源
# 注意: 括号内先留空, 不写任何参数
resource "alicloud_vpc" "pro-vpc" {}
resource "alicloud_instance" "app-2" {}执行导入
# 命令格式: terraform import resource_type.resource_name 线上实际的资源ID
terraform import alicloud_vpc.pro-vpc vpc-abc12345
terraform import alicloud_instance.app-2 i-2ze0kcfjzxynv4545yuz补齐代码
# 查看当前状态文件内的资源的属性, 并将属性信息选择性拷贝到代码中
terraform show
terraform state show alicloud_vpc.pro-vpc
terraform state show alicloud_instance.app-2
# 补齐代码内的内容, 剔除只读参数(如 id, creation_time 等)
# 直到运行显示 "No changes" 为止
terraform plan方案二: 小批量逐个导入 - 模块方式导入
module "testmodule" {
source = "../modules/instance"
environment = "xxx"
vswitch_info = "xxxx"
vpc_id = "xxxx"
instance_type = "xxxx"
security_groups = "xxxx"
service = "xxxx"
instance_count = "xxxxx"
system_disk_size = "xxxxx"
system_disk_category = "xxxxx"
alicloud_availability_zones = "xxxxx"
}terraform import module.testmodule.alicloud_instance.instance i-xxxxxxxxxxxxxx
# 如果该服务有多个实例,则要指定下标
terraform import module.testlistmodule.alicloud_instance."instance[0]" i-xxxxxxxxxxxxxx方案三: import 代码块导入
优点是导入这个动作被记录在了代码中
import {
to = alicloud_vpc.vpc1 # 本地新的资源名称
id = "vpc-2zekv3mnatn04rognc9sy" # 真实线上资源ID
}# 生成指定的资源配置文件 tf
# Terraform 会读取远程 VPC 的属性, 并自动生成一个包含完整参数定义的 generated_vpc.tf 文件
# 注意, 这里并不会更改状态文件; 只是生成了代码
# 这里这个代码文件不一定完全合适, 可能还需要手工调整一下
terraform plan -generate-config-out=generated_vpc.tf
# 检查生成的配置文件内容, 确认无误后
# 将真实资源关联到状态文件 - 即写入状态文件
terraform import alicloud_vpc.vpc1 vpc-2zekv3mnatn04rognc9sy
# 验证 - 此时应该是 No changes
terraform plan
terraform state list方案四: Terraformer
https://github.com/GoogleCloudPlatform/terraformer
terraformer-alicloud-linux-amd64import # 将当前状态导入 Terraform configuration; 默认输出在 generated 目录下
plan # 预览导入
--resources # 指定要导入的资源集合
--regions # 指定资源所在地域
--path-pattern # 生成的目录模式
--path-output # 目录文件路径
--compact # 将资源都输出到 resources.tf 一个文件中terraformer-alicloud-linux-amd64 plan alicloud list
# 扫描阿里云北京区域的所有 ECS 实例
# 会在本地生成一个包含 terraform.tfstate 和 *.tf 文件的文件夹
terraformer import alicloud --resources=ecs --regions=cn-beijing
# 指定安全组
terraformer import alicloud --resources=sg --ids=sg-abc12345
# 区域的全部安全组
terraformer import alicloud --resources=sg --regions=cn-beijing
# 导入多种资源
terraformer import alicloud --resources=vpc,sg --regions=cn-beijingaws
terraformer import aws -r sg,vpc \
--filter Type=sg;Name=vpc_id;Value=VPC_ID --filter Type=vpc;Name=id;Value=VPC_ID
terraformer import aws --resources=vpc,subnet --filter=vpc=myvpcid --regions=eu-west-1
terraformer import aws --resources=s3 --filter="Name=tags.Abc" --regions=eu-west-1terraformer plan google --resources=networks,firewall --projects=my-project --regions=europe-west1-d方案五: aliterraformer 阿里云
是 Terraformer 的阿里云版本
https://help.aliyun.com/zh/terraform/import-resources-into-terraform
wget https://terraform-share.oss-cn-hangzhou.aliyuncs.com/aliterraformer/aliterraformer_linux_amd64.zip配置供应商
terraform {
required_providers {
alicloud = {
source = "aliyun/alicloud"
version = "~>1.272.1"
}
}
}cli
# 若本地的 Terraform 版本 >=0.13.0,需要执行以下命令来对状态文件进行修改以适配新版本 Terraform
terraform state replace-provider -auto-approve "registry.terraform.io/-/alicloud" "aliyun/alicloud"
# 查看当前版本支持导入的产品列表
aliterraformer products
# 查看当前版本某一产品下支持导入的资源列表
aliterraformer resources -p <productName>
# 查看导入参数
aliterraformer import alicloud -h
# 导入 vpc、vswitch、ECS 实例
aliterraformer import alicloud -r=vpc,vswitch,instance
# 导入 ACK、ALB 产品下所有资源
aliterraformer import alicloud --products=ACK,ALB
# 导入 ACK、ECS 产品下所有资源以及所有 vpc、vswitch
aliterraformer import alicloud --products=ACK,ECS -r=vpc,vswitch
# 导入 ACK 下除 alicloud_cs_kubernetes 外所有资源
aliterraformer import alicloud --products=ACK --excludes=cs_kubernetes
# products 输入 ALL 代表所有的产品
aliterraformer import alicloud --products=ALL
# 导入除 VPNGateway,WAF 外的所有产品
aliterraformer import alicloud --products=ALL --excludes-products=VPNGateway,WAF
# 导入除 VPNGateway,WAF 外的所有产品,排除 alicloud_cs_kubernetes 资源
aliterraformer import alicloud --products=ALL --excludes-products=VPNGateway,WAF --excludes=cs_kubernetes实践
export ALICLOUD_REGION=cn-beijing
# 查看 ack 模块可以导入的资源
aliterraformer resources -p ACK
# 多个资源 导入 - 有失败的
aliterraformer import alicloud --products=ACK,ALB,AutoScaling,VPC,EIP,ECS,NATGateway,OSS,CDN,RAM,Alidns,SLS
# 按模块单独导入
aliterraformer resources -p VPC
aliterraformer import alicloud --products=VPC --excludes=vpc_ha_vip
aliterraformer import alicloud --products=ALB --excludes=alb_listener_additional_certificate_attachment
aliterraformer resources -p ECS
aliterraformer import alicloud --products=ECS
aliterraformer resources -p EIP
aliterraformer resources -p NATGateway
aliterraformer import alicloud --products=EIP,NATGateway
aliterraformer resources -p OSS
aliterraformer import alicloud --products=OSS
aliterraformer resources -p Alidns
aliterraformer import alicloud --products=Alidns
aliterraformer resources -p CDN
aliterraformer import alicloud --products=CDN
最后更新于