问题描述
我是terraform的新手,希望获得一些帮助。我已经成功创建了一个VM,并且可以手动将它毫无问题地通过SSH导入到其中。问题是我正在与一个项目团队合作,如果不使terraform删除所有资源并重新创建它们,他们将无法对Tf文件进行任何更改。我认为这是因为它们的密码与我的不同。
admin_ssh_key {
username = "azureroot"
public_key = file("~/.ssh/id_rsa.pub")}
由于我的ssh密钥的内容不同于我的队友,它将破坏VM并使用地形应用人员的密钥重新创建它。有什么办法可以解决这个问题?这引起了很多问题,因为由于密钥不同,我们破坏了多个虚拟机。
解决方法
问题是由于VM的配置所致。似乎您使用了资源kubectl get deploy test-deploy -o yaml | sed "s/find/replace/g" | kubectl replace -f -
并将SSH密钥设置为:
azurerm_linux_virtual_machine
对于公用密钥,可以使用功能admin_username = "azureroot"
admin_ssh_key {
username = "azureroot"
public_key = file("~/.ssh/id_rsa.pub")
}
从当前计算机上使用路径file()
加载公用密钥。因此,当您使用另一台机器(可能是队友的机器)时,公用密钥应该与您的不同。这就是问题所在。
在这里,我有两个建议给您。一种是像这样使用静态公钥:
~/.ssh/id_rsa.pub
然后,无论您在哪里执行Terraform代码,公钥都不会引起问题。您可以根据需要更改内容,例如NSG规则。
,Terraform不是解决您问题的好用例。引导或更新的系统用户应将密钥锁定。为了实现可追溯性,我将锁定私钥,仅在break-glass场景中使用。
如果您希望每个人都使用不同的密钥但使用同一用户,那么我建议您查看一个配置管理工具,例如puppet,chef,ansible,salt,然后再继续。否则,您应该共享密钥。
,您可以简单地将每个人的公共密钥添加到用于创建根ssh密钥的同一文件中。这是实用的方法,但不应作为标准进行推广。 为了获得最佳做法,您应该将每个用户添加为一个单独的用户,以便他们的用户和公钥由我们的资源调配创建,然后他们以自己的用户身份登录并根据需要升级特权
,也许这会帮助和我有同样问题的人。
您可以使用 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"
}
}