我正在尝试运行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
答案 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
}
}