You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何无法通过SSH向Proxmox PVE上传Cloudinit Snippets?

无法通过Terraform的bpg/proxmox-provider上传Cloudinit Snippets的问题

已完成的PVE用户与API密钥配置

我在Proxmox PVE中创建了专用用户及API密钥:

sudo pveum user add terraform@pve
sudo pveum role add Terraform -privs "Datastore.Allocate Datastore.AllocateSpace Datastore.AllocateTemplate Datastore.Audit Pool.Allocate Sys.Audit Sys.Console Sys.Modify SDN.Use VM.Allocate VM.Audit VM.Clone VM.Config.CDROM VM.Config.Cloudinit VM.Config.CPU VM.Config.Disk VM.Config.HWType VM.Config.Memory VM.Config.Network VM.Config.Options VM.Migrate VM.Monitor VM.PowerMgmt User.Modify"
sudo pveum aclmod / -user terraform@pve -role Terraform
sudo pveum user token add terraform@pve provider --privsep=0

生成的令牌信息:

┌──────────────┬──────────────────────────────────────┐
│ key          │ value                                │
╞══════════════╪══════════════════════════════════════╡
│ full-tokenid │ terraform@pve!provider               │
├──────────────┼──────────────────────────────────────┤
│ info         │ {"privsep":"0"}                      │
├───

Terraform配置

我使用bpg/terraform-provider-proxmox模块,尝试上传经过模板替换的Cloud-init YAML文件到不同环境:

provider "proxmox" {
   endpoint  = "https://78.100.100.10:8006"
   api_token = "terraform@pve!provider=<my-api-key>"
   insecure  = true
   
   ssh {
      agent    = true 
      username = "terraform"
   }
}

resource "proxmox_virtual_environment_file" "cloud_init" {
   for_each          = var.VM_CONFIG
   node_name     = "pve"
   content_type  = "snippets"
   datastore_id   = "snippets"

   source_raw {
      data = templatefile("${path.module}/cloud-init-template.yaml", {
         ENVIRONMENT = each.value.ENVIRONMENT
      })
      file_name = "/snippets/snippets/${each.value.ENVIRONMENT}-init.yaml"
   }
}

遇到的错误

执行terraform apply时出现SSH认证错误:

failed to open SSH client: unable to authenticate user "terraform" over SSH to "192.168.100.10:22". Please verify that ssh-agent is correctly loaded with an authorized key via 'ssh-add -L' (NOTE: configurations in ~/.ssh/config are not considered by the provider): failed to dial 192.168.100.10:22: dial tcp 192.168.100.10:22:

我困惑的是,provider配置的是PVE的外部IP78.100.100.10,但错误里显示的是内部IP192.168.100.10,两者仅通过路由器端口转发关联,这应该和问题无关。

已排查的内容

  • 跳板机的SSH密钥已添加到PVE中,ssh-add -L输出的密钥与PVE中~/.ssh/authorized_keys内的内容完全一致。
  • PVE用户及域信息显示terraform属于pve域,root属于pam域。

尝试过的解决方案

看到文档提到:

非PAM账户无法上传Snippets

受Proxmox VE API限制,部分文件(如snippets、备份)需要通过SFTP上传,这要求使用PAM账户(标准Linux账户)。

我猜测这是问题根源,于是改用root@pam账户配置provider:

provider "proxmox" {
   endpoint  = "https://78.100.100.10:8006"
   password = "<my-pass>"
   username = "root@pam"
   insecure  = true
   
   ssh {
      agent    = true
   }
}

但仍然出现完全相同的SSH错误。

奇怪的现象

我可以通过手动SFTP命令成功上传文件:

sftp root@78.100.100.10 << EOF
    put cloud-init-template.yaml  /root   
EOF

为什么我无法通过Terraform provider上传Snippets?


内容的提问来源于stack exchange,提问作者parliament

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 06:56:07