为何无法通过SSH向Proxmox PVE上传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

