【问题标题】:Terraform Azure VM SSH KeyTerraform Azure VM SSH 密钥
【发布时间】:2020-12-04 09:19:44
【问题描述】:

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

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

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

【问题讨论】:

  • 有几种方法可以解决这个问题。如果你们都使用同一个用户,则可以将两个公钥组合在一起。不是一个好主意,但有效。另一种是通过cloud-init,您可以在其中添加用户和密钥,但需要告知Azure waagent,并且由于用户数据过时,您可能会在对实例进行快照时遇到问题。我不明白为什么两个团队都在创建相同的资源..
  • 团队没有创建相同的资源。例如,如果我是第一个应用 terraform 的人,我的密钥将与 VM 相关联。但后来,我的队友需要对入站/出站规则进行修改,并制定一个 terraform 计划,它会删除虚拟机并启动一个新虚拟机,即使我们没有对其进行任何更改。当我查看输出时,这是因为 terraform 检测到了不同的密钥(因为我的密钥与我的团队不同)
  • 好的。在这种情况下,将两个键组合在一起。 public_key - (Required) The Public Key which should be used for authentication, which needs to be at least 2048-bit and in ssh-rsa format. Changing this forces a new resource to be created. 参考这个:: terraform.io/docs/providers/azurerm/r/…
  • 这个问题有什么更新吗?它能解决你的问题吗?
  • 是的,您在下面的回答有帮助!感谢大家的参与。

标签: terraform terraform-provider-azure


【解决方案1】:

问题是由于虚拟机的配置造成的。看来您使用资源 azurerm_linux_virtual_machine 并将 SSH 密钥设置为:

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

对于公钥,您可以使用函数file() 从当前机器上加载公钥,路径为~/.ssh/id_rsa.pub。因此,当您在另一台机器上时,也许是您队友的机器,那么公钥应该与您的不同。这就是问题所在。

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

        您可以使用 terraform 配置语言生成新的私钥和公钥。下面是一个例子:

        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"
            }
        }
        

        【讨论】:

          【解决方案5】:

          实现这一点的一种方法是使用 cloud-init 文件,并使用他们自己的公钥添加多个用户,或者填充您的管理员用户的 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 “Ad Hoc”命令 - https://docs.ansible.com/ansible/latest/user_guide/intro_adhoc.html

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-09-19
            • 1970-01-01
            • 2021-08-22
            • 1970-01-01
            • 2019-09-25
            相关资源
            最近更新 更多