错误:不支持的属性。此对象没有名为“nsg_name”的属性

Posted

技术标签:

【中文标题】错误:不支持的属性。此对象没有名为“nsg_name”的属性【英文标题】:Error: Unsupported attribute. This object does not have an attribute named "nsg_name" 【发布时间】:2021-05-07 04:57:35 【问题描述】:

NSG 创建得很好,所以我在 env/dev 和 modules 文件夹中创建并输入 nsg 规则的所有配置 我运行 terraform plan,这是我得到的错误:

错误:不支持的属性

在 nsg_rules.tf 第 6 行,模块“nsgrules_app1”中:

6:nsg_name = module.nsg_app1.nsg_name

此对象没有名为“nsg_name”的属性。

我知道我的代码不正确,我只是不确定如何使用映射变量编写 nsg_rule 模块,然后将其附加到我的另一个模块中的 NSG。

任何帮助将不胜感激:)

我的 terraform 相关文件夹结构是:

dev
    |_ backend.tf
    |_ outputs.tf
    |_ provider.tf
    |_ resource_groups.tf
    |_ nsg.tf
    |_ nsg_rules.tf
    |_ storage.tf
    |_ subnets.tf
    |_ variables.tf
    |_ vnets.tf
    |_ vms_lin.tf

modules
|_ nsg
          |_ outputs.tf
          |_ variables.tf
          |_ main.tf

|_ nsg_rules
          |_ outputs.tf
          |_ variables.tf
          |_ main.tf

|_ resource_group
          |_ outputs.tf
          |_ variables.tf
          |_ main.tf
|_ storage
          |_ outputs.tf
          |_ variables.tf
          |_ main.tf
|_ network
          |_ vnet
                 |_ outputs.tf
                 |_ variables.tf
                 |_ main.tf
          |_ subnet
                 |_ outputs.tf
                 |_ variables.tf
                 |_ main.tf

开发/nsg.tf

module "nsg_app1" 
  source                    = "git::ssh://git@ssh.dev.azure.com/v3/myorg/my_code/terraform_modules//nsg"
  nsg_name                  = "nsg-ansible"
  rg_name                   = module.rg_app1.rg_name
  location                  = module.rg_app1.rg_location

dev/nsg_rules.tf

module "nsgrules_app1" 
  source                    = "git::ssh://git@ssh.dev.azure.com/v3/myorg/my_code/terraform_modules//nsg_rule"
  rg_name                   = module.rg_app1.rg_name
  nsg_name                  = module.nsg_app1.nsg_name
  # rules_map                 = var.rules_map     
  # rules_map = 
  #   http_inbound  =  priority = 150, direction = "Inbound", access = "Allow", protocol = "TCP", destination_port_range = "80" ,
  #   https_inbound =  priority = 151, direction = "Inbound", access = "Allow", protocol = "TCP", destination_port_range = "443" 
  # 

模块/nsg/main.tf

resource "azurerm_network_security_group" "nsg" 
  name                = var.nsg_name
  location            = var.location
  resource_group_name = var.rg_name

模块/nsg/v​​ariables.tf

variable "rg_name" 
  description = "name of resource group"


variable "location" 
  description = "location of resource group"


variable "nsg_name" 
  description = "name of nsg group"

模块/nsg_rule/main.tf

resource "azurerm_network_security_rule" "nsg-rule-rdp" 
    
  name                        = "RDP"
  priority                    = "105"
  direction                   = "Inbound"
  access                      = "Allow"
  protocol                    = "TCP"
  source_port_range           = "*"
  destination_port_range      = "3389"
  source_address_prefixes     = var.default_ip_whitelist
  destination_address_prefix  = "*"
  resource_group_name         = var.rg_name
  network_security_group_name = var.nsg_name

模块/nsg_rule/variables.tf

variable "rg_name" 
  description = "name of resource group"


variable "default_ip_whitelist" 
  description = "List of IPs to whitelist on all RDP | SSH enabled NSG rules."
  default     = []


variable "nsg_name" 
  description = "name of nsg group"


variable "rules_map" 
  type    = map
  default = 
        rule1 = priority = 105, direction = "Inbound", access = "Allow", protocol = "TCP", source_port_range = "*", destination_port_range = "*",source_address_prefix = "*", destination_address_prefix = "*"   ,
        rule2 = priority = 105, direction = "Outbound", access = "Deny", protocol = "TCP", source_port_range = "*", destination_port_range = "*",source_address_prefix = "*", destination_address_prefix = "*"      
    


【问题讨论】:

【参考方案1】:

您正在使用的模块module.nsg_app1 没有nsg_name 属性。这意味着它不输出这样的变量。

您要么必须修改 module.nsg_app1 模块以输出此类变量,要么在module.nsgrules_app1 中硬编码名称:

module "nsgrules_app1" 
  source                    = "git::ssh://git@ssh.dev.azure.com/v3/myorg/my_code/terraform_modules//nsg_rule"
  rg_name                   = module.rg_app1.rg_name
  nsg_name                  = "nsg-ansible"
  # rules_map                 = var.rules_map     
  # rules_map = 
  #   http_inbound  =  priority = 150, direction = "Inbound", access = "Allow", protocol = "TCP", destination_port_range = "80" ,
  #   https_inbound =  priority = 151, direction = "Inbound", access = "Allow", protocol = "TCP", destination_port_range = "443" 
  # 

【讨论】:

非常感谢 Marcin,当我对它的工作值进行硬编码时。输出对我来说仍然有点混乱。想尽可能地自动化这个,你能帮我写出来吗:) @Cyborganizer 您可以创建一个变量nsg_name 并在需要时使用var.nsg_name 感谢哥们对值进行硬编码,稍后将创建变量 @Cyborganizer 没问题。如果答案有帮助,我们将不胜感激。

以上是关于错误:不支持的属性。此对象没有名为“nsg_name”的属性的主要内容,如果未能解决你的问题,请参考以下文章

js错误提示:对象不支持此属性或方法。

IE11中的“对象不支持此属性或方法”错误

收件箱中 Outlook 对象的 ReceivedTime 生成错误“对象不支持此属性或方法”

TypeError:对象不支持此属性或方法

js中使用indexOf()方法是提示(对象不支持此属性或方法)如何解决?

在所有浏览器中使用jQuery Gmap插件“对象不支持此属性或方法”