带有 Terraform 的 KVM:SSH 权限被拒绝(Cloud-Init)

Posted

技术标签:

【中文标题】带有 Terraform 的 KVM:SSH 权限被拒绝(Cloud-Init)【英文标题】:KVM with Terraform: SSH permission denied (Cloud-Init) 【发布时间】:2020-07-12 04:15:14 【问题描述】:

我有一个 KVM 主机。我正在使用 Terraform 创建一些使用 KVM 提供程序的虚拟服务器。以下是 Terraform 文件的相关部分:

provider "libvirt" 
  uri = "qemu+ssh://root@192.168.60.7"


resource "libvirt_volume" "ubuntu-qcow2" 
  count = 1
  name = "ubuntu-qcow2-$count.index+1"
  pool = "default"
  source = "https://cloud-images.ubuntu.com/bionic/current/bionic-server-cloudimg-amd64.img"
  format = "qcow2"


resource "libvirt_network" "vm_network" 
   name = "vm_network"
   mode = "bridge"
   bridge = "br0"
   addresses = ["192.168.60.224/27"]
   dhcp 
    enabled = true
   


# Use CloudInit to add our ssh-key to the instance
resource "libvirt_cloudinit_disk" "commoninit" 
    name = "commoninit.iso"
    pool = "default" 
    user_data = "data.template_file.user_data.rendered"
    network_config = "data.template_file.network_config.rendered"


data "template_file" "user_data" 
  template = file("$path.module/cloud_config.yaml")


data "template_file" "network_config" 
  template = file("$path.module/network_config.yaml")

cloud_config.yaml 文件包含以下信息:

manage_etc_hosts: true
users:
  - name: ubuntu
    sudo: ALL=(ALL) NOPASSWD:ALL
    groups: users, admin
    home: /home/ubuntu
    shell: /bin/bash
    lock_passwd: false
    ssh-authorized-keys:
      - $file("/path/to/keyfolder/homelab.pub")
ssh_pwauth: false
disable_root: false
chpasswd:
  list: |
     ubuntu:linux
  expire: False
package_update: true
packages:
    - qemu-guest-agent
growpart:
  mode: auto
  devices: ['/']

服务器创建成功,我可以从运行 Terraform 脚本的主机 ping 设备。尽管我通过 cloud-init 文件传递​​了我的 SSH 密钥,但我似乎无法通过 SSH 登录。

从存储我所有密钥的文件夹中运行:

homecomputer:keyfolder wim$ ssh -i homelab ubuntu@192.168.80.86
ubuntu@192.168.60.86: Permission denied (publickey).

在这个命令中,homelab 是我的私钥。

我无法登录的任何原因?有什么办法调试吗?我现在无法登录服务器进行调试。我尝试在 cloud-config 文件中设置passwd,但这也不起作用

*** 附加信息

1) 渲染的模板如下:

 > data.template_file.user_data.rendered

manage_etc_hosts: true
users:
  - name: ubuntu
    sudo: ALL=(ALL) NOPASSWD:ALL
    groups: users, admin
    home: /home/ubuntu
    shell: /bin/bash
    lock_passwd: false
    ssh-authorized-keys:
      - ssh-rsa AAAAB3NzaC1y***Homelab_Wim
ssh_pwauth: false
disable_root: false
chpasswd:
  list: |
     ubuntu:linux
  expire: False
package_update: true
packages:
    - qemu-guest-agent
growpart:
  mode: auto
  devices: ['/']

【问题讨论】:

渲染的模板是什么样的?您应该能够输出它以帮助调试。 我用这些信息更新了原始问题。似乎显示了正确的 SSH 密钥。 ssh -vvv ... 的输出可能也很有用,以防显示某些内容。 【参考方案1】:

我也遇到了同样的问题,因为我错过了第一行

#cloud-config 

在 cloudinit.cfg 文件中

【讨论】:

【参考方案2】:

您需要添加libvirt_cloudinit_disk 资源才能将ssh-key 添加到VM, 我的 TF 脚本中的代码:

# Use CloudInit ISO to add ssh-key to the instance
resource "libvirt_cloudinit_disk" "commoninit" 
          count = length(var.hostname)
          name = "$var.hostname[count.index]-commoninit.iso"
          #name = "$var.hostname-commoninit.iso"
          # pool = "default"
          user_data = data.template_file.user_data[count.index].rendered
          network_config = data.template_file.network_config.rendered

【讨论】:

以上是关于带有 Terraform 的 KVM:SSH 权限被拒绝(Cloud-Init)的主要内容,如果未能解决你的问题,请参考以下文章

CentOS 7搭建KVM在线管理面板WebVirtMgr之使用SSH授权登录

如何在 Terraform 中创建 SSH 密钥?

在 Terraform 管理的 AWS EC2 SSH 堡垒实例上处理多个用户的 SSH 密钥

SSH 密钥未受保护的 terraform ansible jenkins

我可以在 terraform 创建的 ec2 实例中执行 ssh 吗?

KVM 迁移