You need to enable JavaScript to run this app. 如何从Terraform模块中提取私有IP地址传入Ansible执行任务
优惠活动
大模型
产品
解决方案
定价
更多

如何从Terraform模块中提取私有IP地址传入Ansible执行任务

问题原因

  • 你错误地直接引用了子模块内部的azurerm_network_interface资源,Terraform 中子模块内部的资源默认是封装不对外暴露的,根模块不能直接访问子模块内定义的资源属性,因此触发「资源未声明」报错。
  • 你调用的VM模块内部定义的网络接口资源名为azurerm_network_interface.main,而你根代码中写的azurerm_network_interface.centos-vm-author-2不存在,centos-vm-author-2是你声明的子模块名,不是网络接口资源名。

解决方案

步骤1:修改子模块,添加输出变量

在你使用的temp-linux-vm模块的代码根目录下找到outputs.tf文件,没有就新建一个,添加如下输出配置,将虚拟机私有IP对外暴露给调用方:

output "vm_private_ips" {
  type        = list(string)
  description = "创建的虚拟机私有IP列表"
  value       = azurerm_network_interface.main[*].ip_configuration[0].private_ip_address
}

步骤2:修改根模块null_resource配置,引用模块输出的IP

将你原来的null_resource代码修改为如下形式,直接调用子模块输出的私有IP列表即可:

resource "null_resource" "centos-vm-author-ansible" {
  provisioner "local-exec" {
    command = <<EOF
ansible-playbook -i '${join(",", module.centos-vm-author-2.vm_private_ips)},' -e ansible_user=${var.admin_username} -e "role_name=automate-author" main.yaml
EOF
  }
  depends_on = [
    module.centos-vm-author-2
  ]
}

补充说明:如果你没有权限修改公共子模块的代码,也可以在子模块已经输出VM实例资源的前提下,通过VM实例关联的网络接口ID间接查取私有IP,相比而言给子模块加指定输出的方案更符合Terraform模块封装规范,可读性和可维护性更高。

内容的提问来源于stack exchange,提问作者learner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 00:45:06