【问题标题】:Ansible string variable to Terraform list(string)Ansible 字符串变量到 Terraform 列表(字符串)
【发布时间】:2021-04-21 20:46:56
【问题描述】:

我将 Ansible 和 Terraform 一起用于 MS Azure 中的不同部署。现在我想使用模块“azurerm_virtual_network and azurerm_subnet”. 创建一个带有子网的Vnet,只是我遇到了“Address_space” and “address_prefixes” 在terraform 中定义为“list (string)” 的问题,这是由“string” 在Ansible 中完成的。

我的问题是如何以正确的形式将该变量从 Ansible 获取到 Terraform,而不会收到以下消息:

“默认 = \u001b[4m”{{subnet1_cidr}}“\u001b[0m\n\u001b[0m\n这 默认值与变量的类型约束不兼容: 列出\n个字符串”

我使用 ansible 角色获取 ansible vars “group_vars”,该角色将名为 “terraform.tfvars.j2” 的文件复制到 “{{playbook_dir}} / terraform / terraform.tfvars "。在“variables.tf” 中,变量加载如下

variable "vnet_cidr" {
  type        = list(string)
  default     = "{{ [vnet_cidr] | list | to_json }}"
}

variable "subnet1_cidr" {
  type        = list(string)
  default     = "{{ [subnet1_cidr] | list | to_json }}"
}

variable "subnet2_cidr" {
  type        = list(string)
  default     = "{{ [subnet2_cidr] | list | to_json }}"
}

Ansible Group_Vars,

VNET_Name: AZ-Venet
GV_Virtual_Network_Cidr: 10.0.0.0/16

SNET1_Name: AZ-FrontEnd
GV_Subnet_Cidr1: 10.0.1.0/24
Survey_SNET2_Name: Az-Backend
GV_Subnet_Cidr2: 10.0.2.0/24

地形 terraform.tfvars.j2 /terraform.tfvars

# Networking
vnet_cidr                       = "{{ GV_Virtual_Network_Cidr }}"
subnet1_cidr                    = "{{ GV_Subnet_Cidr1 }}"
subnet2_cidr                    = "{{ GV_Subnet_Cidr2 }}"

【问题讨论】:

    标签: azure variables ansible terraform


    【解决方案1】:

    如果您只需要将字符串转换为包含一项的列表,则可以使用 Ansible 过滤器。 这是一个例子:

    {{ [example_variable] | list | to_json }}
    

    但是在你的情况下会有一些不同的配置。

    在 variables.tf 文件中,您可以尝试删除默认值,因为您似乎在 Ansible vars 中没有变量 vnet_cidr、subnet1_cidr 和 subnet2_cidr。

    variables.tf 文件将如下所示:

    variable "vnet_cidr" {
      type        = list(string)
      default     = []
    }
    
    variable "subnet1_cidr" {
      type        = list(string)
      default     = []
    }
    
    variable "subnet2_cidr" {
      type        = list(string)
      default     = []
    }
    

    然后文件 terraform.tfvars.j2 /terraform.tfvars 将如下所示:

    # Networking
    vnet_cidr                       = [ "{{ GV_Virtual_Network_Cidr }}" ]
    subnet1_cidr                    = [ "{{ GV_Subnet_Cidr1 }}" ]
    subnet2_cidr                    = [ "{{ GV_Subnet_Cidr2 }}" ]
    

    【讨论】:

    • 初始化阶段运行良好,但现在应用出错并出现以下错误消息: terraform.tfvars 第 22 行上输入变量的值无效\n\n:\n 22: vnet_cidr = \"10.0.0.0/16\"\n\n给定的值对于变量 \"vnet_cidr\" 无效:列表
    • 能否举一个 Ansible 变量值的示例,用于 vnet_cidr、subnet1_cidr 和 subnet2_cidr?
    • Ansible group_var: 'GV_Virtual_Network_Cidr: 10.0.0.0/16' is vnet_cidr
    • 您是否在 Ansible 中定义了 vnet_cidr 变量,或者您在 Ansible 中使用了变量 GV_Virtual_Network_Cidr?
    • GV_Virtual_Network_Cidr 是 Ansible 变量。 Vnet_cidr 是地形变量
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-08
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多