在 Terraform local exec provisioner 中转义字符

Escape chars in Terraform local exec provisioner

我想使用 local-exec 配置器链接 Terraform 和 Ansible;

然而,由于这需要输入 to Ansible from Terraform,我坚持使用以下复杂命令:

provisioner "local-exec" {
        command = 'sleep 60; ansible-playbook -i ../ansible/inventory/ ../ansible/playbooks/site.yml --extra-vars "rancher_server_rds_endpoint="${aws_db_instance.my-server-rds.endpoint}" rancher_server_elastic_ip="${aws_eip.my-server-eip.public_ip}""'
    }

不断返回

illegal char

错误;

关于正确转义有什么建议吗?

如果 ansible-playbook 命令是直接在 shell 中 运行 它将是:

ansible-playbook -i inventory playbooks/site.yml --extra-vars "my_server_rds_endpoint=my-server-db.d30ikkj222.us-west-1.rds.amazonaws.com rancher_server_elastic_ip=88.148.17.236"

(路径不同)

Terraform syntax 表示:

Strings are in double-quotes.

所以需要把单引号换成双引号,然后在里面转义引号,例如:

provisioner "local-exec" {
  command = "sleep 60; ansible-playbook -i ../ansible/inventory/ ../ansible/playbooks/site.yml --extra-vars \"rancher_server_rds_endpoint='${aws_db_instance.my-server-rds.endpoint}' rancher_server_elastic_ip='${aws_eip.my-server-eip.public_ip}'\""
}

我知道的唯一适用于变量中任何特殊字符的方法是使用环境,例如:

provisioner "local-exec" {
  command = join(
    " ", [
      "sleep 60;",
      "ansible-playbook -i ../ansible/inventory/",
      "../ansible/playbooks/site.yml",
      "--extra-vars",
      "rancher_server_rds_endpoint=\"$RANCHER_SERVER_RDS_ENDPOINT\"",
      "rancher_server_elastic_ip=\"$RANCHER_SERVER_ELASTIC_IP\""
    ]
  )
  environment = {
    RANCHER_SERVER_RDS_ENDPOINT = aws_db_instance.my-server-rds.endpoint
    RANCHER_SERVER_ELASTIC_IP   = aws_eip.my-server-eip.public_ip
  }
}