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

使用Terraform自动化创建VM并克隆私有GitHub仓库的权限问题

针对Hetzner VM + Terraform + 私有GitHub仓库克隆的解决方案

你提到的两种思路都可行,但预先生成并管理SSH密钥对是更通用、更安全的标准方案,下面分场景给出具体实现:

推荐方案:预生成密钥对(长期稳定场景)

这种方式密钥完全由你掌控,避免API操作带来的权限风险,步骤如下:

  1. 本地生成专用SSH密钥对
    专门为这个VM生成密钥,避免复用个人密钥:
    ssh-keygen -t ed25519 -C "hetzner-vm-github-clone" -f ~/.ssh/hetzner_vm_github
    
  2. 手动将公钥添加到GitHub账户
    把~/.ssh/hetzner_vm_github.pub里的内容复制到GitHub账户的「Settings -> SSH and GPG keys」页面,添加为新的SSH密钥。
  3. Terraform中配置cloud-init部署私钥
    通过Terraform读取本地私钥,写入VM的用户目录并设置正确权限,再执行克隆:
    # 读取本地私钥
    data "file" "github_ssh_private_key" {
      filename = pathexpand("~/.ssh/hetzner_vm_github")
    }
    
    # 创建Hetzner VM
    resource "hcloud_server" "github_clone_vm" {
      name        = "github-clone-vm"
      image       = "ubuntu-22.04"
      server_type = "cx11"
      user_data   = <<-EOF
                    #cloud-config
                    users:
                      - name: ubuntu
                        ssh_authorized_keys:
                          - ${file(pathexpand("~/.ssh/your_local_public_key"))} # 用于你远程登录VM的公钥
                        sudo: ['ALL=(ALL) NOPASSWD:ALL']
                    write_files:
                      - content: ${data.file.github_ssh_private_key.content}
                        path: /home/ubuntu/.ssh/id_ed25519
                        permissions: '0600' # 必须设为600,否则SSH会拒绝使用
                        owner: ubuntu:ubuntu
                    runcmd:
                      # 提前添加GitHub到known_hosts,避免交互式确认
                      - ssh-keyscan github.com >> /home/ubuntu/.ssh/known_hosts
                      - chown ubuntu:ubuntu /home/ubuntu/.ssh/known_hosts
                      # 克隆私有仓库
                      - sudo -u ubuntu git clone git@github.com:your-username/your-private-repo.git /home/ubuntu/repo
                    EOF
    }
    

备选方案:动态生成并通过GitHub API添加密钥(临时VM场景)

如果需要完全自动化且VM是短期临时使用的,可以用Terraform的GitHub Provider动态管理密钥:

  1. 配置GitHub Provider
    需要一个拥有admin:public_key权限的GitHub个人访问令牌:
    provider "github" {
      token = var.github_pat # 从变量传入令牌,不要硬编码
    }
    
  2. Terraform生成密钥对
    resource "tls_private_key" "vm_github_key" {
      algorithm = "ED25519"
    }
    
  3. 自动添加公钥到GitHub
    resource "github_ssh_key" "vm_key" {
      title = "Hetzner Temp VM ${hcloud_server.github_clone_vm.name}"
      key   = tls_private_key.vm_github_key.public_key_openssh
    }
    
  4. cloud-init中使用私钥克隆
    把生成的私钥写入VM,执行克隆命令。Terraform销毁VM时会自动删除GitHub上的对应密钥,无需手动清理。
    注意:这种方式的风险是GitHub令牌如果泄露,攻击者可以修改你的账户SSH密钥,仅适合临时场景。

关键注意点

  • 克隆命令必须用目标用户(比如ubuntu)执行,不要用root,否则密钥权限不匹配。
  • 一定要设置私钥权限为0600,SSH会拒绝使用权限过宽的私钥。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 02:06:28