Azure Ansible字符串变量到地形列表(字符串)

Azure Ansible字符串变量到地形列表(字符串),azure,variables,ansible,terraform,Azure,Variables,Ansible,Terraform,我将Ansible和Terraform一起用于MS Azure中的不同部署。现在我想创建一个带有子网的Vnet,子网模块为“azurerm\u虚拟网络和azurerm\u子网”,但我遇到的问题是“地址空间”和“地址前缀”在terraform中定义为“列表(字符串)”,这是在Ansible by“字符串”中完成的 我的问题是如何以正确的形式将此变量从Ansible转换为Terraform,而不获得以下消息: “默认值=\u001b[4m”{{subnet1\u cidr}}”\u001b[0m\n

我将Ansible和Terraform一起用于MS Azure中的不同部署。现在我想创建一个带有子网的Vnet,子网模块为
“azurerm\u虚拟网络和azurerm\u子网”
,但我遇到的问题是
“地址空间”和“地址前缀”
在terraform中定义为
“列表(字符串)”
,这是在Ansible by
“字符串”
中完成的

我的问题是如何以正确的形式将此变量从Ansible转换为Terraform,而不获得以下消息:

“默认值=\u001b[4m”{{subnet1\u cidr}}”\u001b[0m\n\u001b[0m\n” 默认值与变量的类型约束不兼容: 列表\n字符串“

我使用一个ansible角色获取ansible变量
“group\u vars”
,该角色将名为
“terraform.tfvars.j2”
的文件复制到
“{{playbook\u 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 Terraform.tfvars.j2/Terraform.tfvars

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

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

{{ [example_variable] | list | to_json }}
但是,在您的情况下,将有一点不同的配置

在variables.tf文件中,您可以尝试删除默认值,因为在Ansible VAR中似乎没有变量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     = []
}
# Networking
vnet_cidr                       = [ "{{ GV_Virtual_Network_Cidr }}" ]
subnet1_cidr                    = [ "{{ GV_Subnet_Cidr1 }}" ]
subnet2_cidr                    = [ "{{ GV_Subnet_Cidr2 }}" ]
然后文件terraform.tfvars.j2/terraform.tfvars将如下所示:

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

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

variable "subnet2_cidr" {
  type        = list(string)
  default     = []
}
# Networking
vnet_cidr                       = [ "{{ GV_Virtual_Network_Cidr }}" ]
subnet1_cidr                    = [ "{{ GV_Subnet_Cidr1 }}" ]
subnet2_cidr                    = [ "{{ GV_Subnet_Cidr2 }}" ]

初始化阶段运行正常,但现在应用程序出现错误,出现以下错误消息:terraform.tfvars第22行的输入变量值无效:\n 22:vnet\u cidr=\“10.0.0.0/16\”\n\n给定值对变量“vnet\u cidr”无效\":请举例说明vnet_cidr、subnet1_cidr和subnet2_cidr的可转换变量值?可转换组变量:“GV_虚拟网络cidr:10.0.0.0/16”是vnet_cidr您在Ansible中定义了vnet_cidr变量还是在Ansible中使用变量GV_虚拟网络cidr?GV_虚拟网络cidr是可转换变量。vnet_cidr是地形变量