Terraform Azure VM SSH密钥

Terraform Azure VM SSH密钥,terraform,terraform-provider-azure,Terraform,Terraform Provider Azure,我是Terraform的新手,希望得到一些帮助。我已经成功地创建了一个VM,并且可以毫无问题地手动SSH到它中。问题是我正在与一个团队合作一个项目,他们不能在不让Terraform删除所有资源并重新创建它们的情况下对Tf文件进行任何更改。我认为这是因为他们的SSH密钥与我的不同 admin_ssh_key { username = "azureroot" public_key = file("~/.ssh/id_rsa.pub")} 因为我的

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

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

因为我的ssh密钥的内容与我的队友不同,它将销毁VM并使用应用terraform的人的密钥重新创建它。有没有办法绕过这个问题?这导致了许多问题,因为我们有多个虚拟机因为密钥不同而被销毁。

Terraform不是解决问题的好用例。用于引导或更新的系统用户应将密钥锁定。为了便于跟踪,我会锁定私钥,只在场景中使用

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


对于您的问题,Terraform不是一个好的用例。用于引导或更新的系统用户应将密钥锁定。为了便于跟踪,我会锁定私钥,只在场景中使用

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


问题是由于VM的配置造成的。似乎您使用了资源azurerm\u linux\u虚拟机,并将SSH密钥设置为:

admin_username      = "azureroot"
admin_ssh_key {
   username = "azureroot"
   public_key = file("~/.ssh/id_rsa.pub")
}
对于公钥,可以使用函数
file()
从当前机器加载公钥,路径为
~/.ssh/id\u rsa.pub
。因此,当您在不同的机器中时,可能是您的队友的机器,那么公钥应该与您的不同。这就是问题所在

这里我有两个建议给你。一种是使用静态公钥,如下所示:

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

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

问题在于虚拟机的配置。似乎您使用了资源azurerm\u linux\u虚拟机,并将SSH密钥设置为:

admin_username      = "azureroot"
admin_ssh_key {
   username = "azureroot"
   public_key = file("~/.ssh/id_rsa.pub")
}
对于公钥,可以使用函数
file()
从当前机器加载公钥,路径为
~/.ssh/id\u rsa.pub
。因此,当您在不同的机器中时,可能是您的队友的机器,那么公钥应该与您的不同。这就是问题所在

这里我有两个建议给你。一种是使用静态公钥,如下所示:

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

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

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

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

有几种方法可以解决此问题。如果两者使用同一用户,则可以将两个公钥组合在一起。这不是个好主意,但很管用。另一种方法是通过
cloud init
添加用户和密钥,但是需要告知Azure
waagent
,并且由于过时的用户数据,在快照实例时可能会出现问题。我不明白为什么两个团队都在创建相同的资源。两个团队没有创建相同的资源。例如,如果我是第一个执行terraform应用的人,我的密钥将与VM关联。但是稍后,我的队友需要修改入站/出站规则,并执行一个terraform计划,它将删除vm并启动一个新的vm,即使我们没有对其进行任何更改。当我查看输出时,这是因为terraform检测到了不同的密钥(因为我的密钥与我的团队不同),好的。那样的话,用棍棒把两把钥匙插在一起
public_key-(必选)应用于身份验证的公钥,至少需要2048位,且为ssh rsa格式。更改此选项将强制创建新资源。
请参阅此::有关此问题的任何更新?它解决了你的问题吗?是的,你下面的答案很有帮助!谢谢大家的来电。有几种方法可以解决这个问题。如果两者使用同一用户,则可以将两个公钥组合在一起。这不是个好主意,但很管用。另一种方法是通过
cloud init
添加用户和密钥,但是需要告知Azure
waagent
,并且由于过时的用户数据,在快照实例时可能会出现问题。我不明白为什么两个团队都在创建相同的资源。两个团队没有创建相同的资源。例如,如果我是第一个执行terraform应用的人,我的密钥将与VM关联。但是稍后,我的队友需要修改入站/出站规则,并执行一个terraform计划,它将删除vm并启动一个新的vm,即使我们没有对其进行任何更改。当我查看输出时,这是因为terraform检测到一个不同的密钥(因为我的密钥是