如何从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
相关产品推荐
相关产品推荐

