Terraform Azure VM SSH 密钥

Terraform Azure VM SSH Key

我是 Terraform 的新手,需要一些帮助。我已经成功创建了一个 VM,并且可以毫无问题地手动通过 SSH 连接到它。问题是我正在与一个项目团队合作,他们无法在不让 Terraform 删除所有资源并重新创建它们的情况下对 Tf 文件进行任何更改。我认为这是因为他们的 SSH 密钥与我的不同。

admin_ssh_key {
   username = "azureroot"
   public_key = file("~/.ssh/id_rsa.pub")}

因为我的 ssh 密钥的内容与我的队友不同,它会破坏 VM 并使用应用 terraform 的人的密钥重新创建它。有什么办法可以解决这个问题吗?这导致了很多问题,因为我们已经因为密钥不同而销毁了多个虚拟机。

Terraform 不是解决您的问题的好用例。 bootstrap 或更新的系统用户应将密钥锁定。为了可追溯性,我会锁定私钥,仅供在 break-glass 场景中使用。

如果您希望每个人都使用不同的密钥但使用相同的用户,我建议您查看配置管理工具,例如 puppet、chef、ansible、salt,等等。否则你应该分享密钥。

https://serverfault.com/questions/471753/what-are-best-practices-for-managing-ssh-keys-in-a-team/471799

问题出在虚拟机的配置上。您似乎使用资源 azurerm_linux_virtual_machine 并将 SSH 密钥设置为:

admin_username      = "azureroot"
admin_ssh_key {
   username = "azureroot"
   public_key = file("~/.ssh/id_rsa.pub")
}

对于 public 密钥,您可以使用函数 file() 从您当前的计算机加载路径 ~/.ssh/id_rsa.pub 的 public 密钥。所以当你在不同的机器上时,也许是你队友的,那么 public 键应该和你的不同。这会造成问题。

这里我有两个建议给你。一种是像这样使用静态 public 键:

admin_username      = "azureroot"
admin_ssh_key {
   username = "azureroot"
   public_key = "xxxxxxxxx"
}

那么无论在哪里执行Terraform代码,public键都不会出问题。您可以根据需要更改内容,例如 NSG 规则。

您可以简单地将每个人的 public 密钥添加到用于创建 root ssh 密钥的同一个文件中。这是务实的做法,但不应作为标准加以推广。 对于最佳实践,您应该将每个用户添加为个人,以便他们的用户和 public 密钥由我们的配置创建,然后他们以自己的用户身份登录并根据需要提升权限

也许这会对与我有同样问题的人有所帮助。

您可以使用 terraform 配置语言生成新的私钥和 public 密钥。以下是示例:

resource "tls_private_key" "example_ssh" {
    algorithm = "RSA"
    rsa_bits = 4096
}

resource "azurerm_linux_virtual_machine" "myterraformvm" {
    computer_name = "myvm"
    admin_username = "azureuser"
    disable_password_authentication = true

    admin_ssh_key {
        username = "azureuser"
        public_key = tls_private_key.example_ssh.public_key_openssh #The magic here
    }

    tags = {
        environment = "Terraform Demo"
    }
}

实现此目的的一种方法是使用 cloud-init 文件并使用自己的 public 密钥添加多个用户或填充管理员用户的 authorized_keys 文件。然后,您可以使用像 Ansible 这样的工具稍后更新 authorized_keys。

https://learn.hashicorp.com/tutorials/terraform/cloud-init

Ansible 模块 - https://docs.ansible.com/ansible/2.5/modules/authorized_key_module.html

Ansible“临时”命令 - https://docs.ansible.com/ansible/latest/user_guide/intro_adhoc.html