如何在Terraform Provisioner中调用带空格的字符串变量?

时间:2019-06-25 11:26:01

标签: ansible terraform provisioning

我正在尝试运行terraform设置程序,该程序正在调用我的ansible剧本,现在我正在从用户传递公钥作为变量。当传递公钥时,它并不会获取整个密钥,而只是ssh-rsa,而不是完整的字符串。 我想将完整的字符串传递为“ ssh-rsa Aghdgdhfghjfdh”

我正在运行的terraform中的预配器是:

resource "null_resource" "bastion_user_provisioner" {
  provisioner "local-exec" {
    command = "sleep 30 && ansible-playbook ../../../../ansible/create-user.yml --private-key ${path.module}/${var.project_name}.pem -vvv -u ubuntu -e 'username=${var.username}' -e 'user_key=${var.user_key}' -i ${var.bastion_public_ip}, -e 'root_shell=/bin/rbash' -e 'raw_password=${random_string.bastion_password.result}'"
  }
}

如果我以以下方式单独运行剧本:

ansible-playbook -i localhost create-user.yml --user=ubuntu --private-key=kkk000.pem -e "username=kkkkk" -e 'user_key='ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC+GWlljlLzW6DOEo"' -e root_shell="/bin/bash"

有效, 但我希望该字符串位于在预配器中传递的terraform变量中。

我想将密钥复制为

ssh-rsa AWRDkj;jfdljdfldkf'sd.......

而不仅仅是

ssh-rsa

1 个答案:

答案 0 :(得分:0)

在命令行-e key=value解释[citation]上进行的--extra-args拆分给您带来了很大的麻烦。您真正想要的是提供-e一些JSON文本,以阻止它尝试在空白上进行拆分。对于足够复杂的随机字符串密码,这也将派上用场,否则,当尝试在命令行上传递密码时,将会产生非常糟糕的结果。

很幸运,有一个jsonencode()函数可以帮助您解决该问题:

resource "null_resource" "bastion_user_provisioner" {
  provisioner "local-exec" {
    command = <<SH
set -e
sleep 30
ansible -vvv -i localhost, -c local -e '${jsonencode({
   "username"="${var.username}",
   "user_key"="${var.user_key}",
   "raw_password"="${random_string.bastion_password.result}",
})}' -m debug -a var=vars all
SH
  }
}