如何将ARM模板与CLI脚本转换为Terraform模板?无需手动编写
ARM模板及CLI脚本转Terraform模板的可行方案
一、基于已部署资源的Terraform导入生成配置
如果已经通过azurerm_template_deployment部署了ARM模板,可直接将现有云资源导入Terraform并生成配置:
- 初始化Terraform配置目录,配置AzureRM Provider:
terraform { required_providers { azurerm = { source = "hashicorp/azurerm" version = ">= 3.0.0" } } } provider "azurerm" { features {} } - 使用
terraform import命令将单个资源导入Terraform状态,示例(导入虚拟网络):terraform import azurerm_virtual_network.my_vnet /subscriptions/<订阅ID>/resourceGroups/<资源组名称>/providers/Microsoft.Network/virtualNetworks/<虚拟网络名称> - 导入完成后,执行
terraform show -no-color > main.tf自动生成对应资源的Terraform HCL配置,后续仅需调整变量、依赖和细节逻辑即可。
二、ARM模板直接转换工具
可使用专门的转换工具处理ARM模板文件:
- arm2tf:这款针对Azure的工具能将ARM模板JSON直接转换成Terraform HCL配置,支持大部分Azure资源类型。运行工具时指定ARM模板路径即可生成对应Terraform文件,复杂嵌套模板或自定义函数转换后可能需要手动修正逻辑。
三、CLI脚本转换思路
对于Azure CLI创建资源的脚本,可通过两种方式转换:
- 先执行CLI脚本创建资源,再用上述
terraform import方法将资源导入并生成Terraform配置; - 直接将CLI命令参数映射到Terraform资源块属性:比如
az vm create对应azurerm_linux_virtual_machine资源,将CLI中的--name、--resource-group、--image等参数对应到Terraform的name、resource_group_name、source_image_reference等属性,逐行替换为Terraform资源定义。
注意事项
- 转换后的配置必须通过
terraform plan验证,检查依赖关系、资源属性是否与原ARM/CLI逻辑一致; - 涉及自定义脚本扩展、嵌套部署等复杂逻辑的部分,转换后需要手动调整以匹配Terraform的执行逻辑;
- 导入资源后需确认Terraform状态与实际云资源完全匹配,避免后续部署出现冲突。
内容的提问来源于stack exchange,提问作者alawi25
相关产品推荐
相关产品推荐

