Terraform脚本与清单文件中单引号转义问题咨询
针对你遇到的Terraform脚本和模板文件里单引号保留的问题,我分两种场景给你具体的解决方法:
一、Terraform脚本中的转义处理
你原来的代码行因为嵌套的双引号和单引号混写,导致Terraform解析出错,而且无法正确保留目标单引号。这里的核心是在Terraform的双引号字符串中,单引号不需要转义,但要输出的双引号需要用反斜杠\转义,同时确保格式化字符串的语法正确。
修正后的代码如下:
list_compute = "${join("\n", formatlist("%s openshift_node_labels=\"{'region': 'primary', 'zone': 'east'}\"", module.compute.ops_compute_names))}"
如果觉得转义双引号看着混乱,也可以改用Terraform的heredoc字符串语法,完全避免转义烦恼:
list_compute = join("\n", formatlist("%s openshift_node_labels='{\"region\": \"primary\", \"zone\": \"east\"}'", module.compute.ops_compute_names))
这里用单引号包裹整个openshift_node_labels的值,里面的双引号转义后会被输出为双引号,最终结果和你想要的一致。
二、模板文件中的单引号保留
对于你用于渲染的模板文件内容(比如openshift_master_identity_providers=[{'name': 'htpasswd_auth', 'login': 'true', 'challenge': 'true', 'kind': 'HTPasswd...'}),如果是用Terraform的templatefile函数渲染,模板里的单引号直接保留即可——因为模板文件本身是纯文本,Terraform只会替换其中的变量占位符(比如${var.something}),不会干扰普通的单引号字符。
举个例子,假设你的模板文件是master.tpl,内容可以直接写成:
openshift_master_identity_providers=[{'name': 'htpasswd_auth', 'login': 'true', 'challenge': 'true', 'kind': 'HTPasswdIdentityProvider', 'provider': {'apiVersion': 'v1', 'kind': 'HTPasswdPasswordIdentityProvider', 'file': '/etc/origin/master/htpasswd'}}]
当你用templatefile("${path.module}/master.tpl", {})渲染时,单引号会被完整保留下来,不需要额外转义。
如果模板里需要插入Terraform变量,比如把htpasswd_auth换成变量,写法也很简单:
openshift_master_identity_providers=[{'name': '${var.auth_name}', 'login': 'true', 'challenge': 'true', 'kind': 'HTPasswdIdentityProvider', 'provider': {'apiVersion': 'v1', 'kind': 'HTPasswdPasswordIdentityProvider', 'file': '/etc/origin/master/htpasswd'}}]
变量替换后,单引号依然会正常保留。
内容的提问来源于stack exchange,提问作者Adigun Gbenga

