【问题标题】:How to call a variable of string with spaces in a terraform provisioner?如何在 terraform 配置程序中调用带有空格的字符串变量?
【发布时间】:2019-06-25 11:26:01
【问题描述】:

我正在尝试运行调用我的 ansible playbook 的 terraform provisioner,现在我将公钥作为变量从用户传递。传递公钥时,它不需要整个密钥,只需要 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

【问题讨论】:

  • 您的引用看起来有问题,否则应该没问题。然而,这不是一个好的做事方式,您应该考虑如何将这些文件提供给 Ansible 角色,而不是像这样在命令行上将其作为字符串传递。

标签: ansible terraform provisioning


【解决方案1】:

您正在被命令行--extra-args 解释[citation] 中的-e key=value 拆分所困扰。您真正想要的是提供 -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
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-23
    • 2013-10-21
    • 2012-06-13
    • 2020-03-12
    • 2012-06-13
    • 1970-01-01
    • 2012-09-04
    • 2015-06-06
    相关资源
    最近更新 更多