Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Terraform 在远程执行中使用file()_Terraform_Terraform Provider Azure - Fatal编程技术网

Terraform 在远程执行中使用file()

Terraform 在远程执行中使用file(),terraform,terraform-provider-azure,Terraform,Terraform Provider Azure,我在Terraform中成功创建了一个Azure Ubuntu VM,在创建完成后运行远程exec provisioner。在这个远程执行块中,我创建了可以通过SSH访问的用户帐户。由于我有公钥,我还想将每个公钥添加到各自的授权密钥文件中。我的做法是: "sudo adduser --quiet --disabled-password --shell /bin/bash --home /home/username--gecos \"Firstname Lastname\&qu

我在Terraform中成功创建了一个Azure Ubuntu VM,在创建完成后运行远程exec provisioner。在这个远程执行块中,我创建了可以通过SSH访问的用户帐户。由于我有公钥,我还想将每个公钥添加到各自的授权密钥文件中。我的做法是:

"sudo adduser --quiet --disabled-password --shell /bin/bash --home /home/username--gecos \"Firstname Lastname\" username", 
"sudo mkdir ~/../username/.ssh",
"sudo chmod 700 ~/../username/.ssh/",
"sudo touch ~/../username/.ssh/authorized_keys",
"sudo echo ${file("userKeys/username.pub")} > ~/../username/.ssh/authorized_keys",
"sudo chmod 600 ~/../username/.ssh/authorized_keys",
"sudo chown -R username.username ~/../username/"
不幸的是,这会导致Terraform在应用后崩溃,可能是由于文件中的双引号。所以我也试过了

"echo ${file("userKeys/username.pub")}"
这很好用


在这一点上,我真的不知道如何解决这个问题。也许在remote exec中使用file()是错误的方法?

在这种情况下,您可以使用Provisioner创建SSH连接,并使用Provisioner将本地文件复制到远程计算机

下面是我这边的一个工作示例,它具有以下配置环境

Terraform v0.15.0
on windows_amd64
+ provider registry.terraform.io/hashicorp/azurerm v2.57.0
+ provider registry.terraform.io/hashicorp/null v3.1.0
对于exmaple

resource "null_resource" "example_provisioner" {

  triggers = {
    public_ip = azurerm_public_ip.example.ip_address
  }

  connection {
    type  = "ssh"
    host  = azurerm_public_ip.example.ip_address
    user  = "testadmin"
    private_key = "${file("~/.ssh/id_rsa")}"
    # password = "${var.root_password}"
    }

  provisioner "file" {
    source  = "test.pub"  # local public key
    destination  = "/tmp/test.pub"  # will copy to remote VM as /tmp/test.pub
  }

  provisioner "remote-exec" {
    inline = [
"sudo adduser --quiet --disabled-password --shell /bin/bash --home /home/username --gecos \"Firstname Lastname\" username", 
"sudo mkdir ~/../username/.ssh",
"sudo chmod 700 ~/../username/.ssh/",
"sudo touch ~/../username/.ssh/authorized_keys",
"sudo cp /tmp/test.pub ~/../username/.ssh/authorized_keys",
"sudo chmod 600 ~/../username/.ssh/authorized_keys",
"sudo chown -R username.username ~/../username/"

    ]
  }

}

文件userKeys/username.pub在哪里?它是在您的远程Azure VM还是本地计算机中?你是说你在本地机器上有公钥吗?在这种情况下,是的,我在执行terraform脚本的同一台本地机器上有公钥。userKeys只是此项目中的一个子文件夹。已修复,非常感谢:)