如何通过 ssh 获取托管在 Azure DevOps Repo 中的 Terraform 模块

How to source Terraform module hosted within Azure DevOps Repo via ssh

寻找 correct/working 通过 SSH 获取托管在私有 Azure DevOps git 存储库中的 Terraform 模块的方法(参见 TF Docs on Git repo sourcing via ssh)。

不希望有 PAT 令牌,因为它最终会过期并且无法自动续订(although coming soon apparently). Despite that, have validated the https method but I would like to avoid needing to edit the source if I can as module source references can't include terraform vars at init time

我已按照以下 steps 生成 ssh private/public 密钥对,这些文件已添加到我的本地 .ssh 文件夹 @ C:\Windows\Users\<username>\.ssh.

下面的示例地形代码:

module "test" {
    source = "<ref>"
}

其中 <ref> 已通过以下测试:

在此处阅读 multiple keys 后:

Generally, if you configure multiple keys for an SSH client and connect to an SSH server, the client can try the keys one at a time until the server accepts one. However, this doesn't work with Azure DevOps for technical reasons related to the SSH protocol and how our Git SSH URLs are structured. Azure DevOps will blindly accept the first key that the client provides during authentication. If that key is invalid for the requested repo, the request will fail with the following error: remote: Public key authentication failed. fatal: Could not read from remote repository.

我玩弄了我的 .ssh/config 文件,其中包括

Host automation
    HostName ssh.dev.azure.com
    IdentityFile ~/.ssh/automation_account
    IdentitiesOnly yes
Host azuredevops
    HostName ssh.dev.azure.com
    IdentityFile ~/.ssh/azuredevops
    IdentitiesOnly yes

然后在 <ref> 内尝试:

所有这些尝试都会导致:

Permission denied, please try again.
git@ssh.dev.azure.com: Permission denied (password,publickey).
fatal: Could not read from remote repository.

does not appear to be a git repository
fatal: Could not read from remote repository.

我正在使用的 ssh 密钥已通过获取指纹 ssh-keygen -E md5 -lf <path to private key> 并返回 2048 MD5:ab:e2:... automation (RSA) 验证它已在 Azure DevOps 中注册,我可以确认它存在于我的 SSH 下的 Azure DevOps 中键。

我已验证该密钥允许我通过使用该特定密钥添加新的 git 远程访问我的目标 TF 存储库之一。 git remote -v 给我:

aorigin       git@automation:v3/<org name>/<project name>/_git/<repo name> (fetch)
aorigin       git@automation:v3/<org name>/<project name>/_git/<repo name> (push)
origin  git@ssh.dev.azure.com:v3/<org name>/<project name>/_git/<repo name> (fetch)
origin  git@ssh.dev.azure.com:v3/<org name>/<project name>/_git/<repo name> (push)

并且 git pull aorigin 按预期工作。 Origin 是来自 Azure DevOps gui 的原始 SSH 克隆 url。

几乎可以肯定我遗漏了一些明显的东西,但是在大量谷歌搜索和许多不同的配置之后,我无法让它正常工作。 Help/pointers/suggestions赞赏

工具版本:

this issue and the Terraform documentation 之后,我会尝试 URL

git::automation:v3/<org name>/<project name>/_git/<repo name>//<sub path>?ref=<version ref>

(在 Hostname 之后将 User git 添加到我的 .ssh/config 文件中,以便不必添加用户)

  • 确保 upgrade Git first to 2.31.1.
  • 在您的 terraform 命令之前尝试 set GIT_SSH_COMMAND="ssh -Tv",以查看使用的密钥。
  • 检查是否 (除非它已经在您的 %PATH% 中:检查 where ssh

OP Jamie执行了以下步骤:

  • 已将 Git 更新为提到的版本
  • 使用 MS Docs
  • 中的步骤重新生成了一些新密钥
  • 使用 ssh-add 添加了所有密钥
  • 向 Azure DevOps 添加了 public 个密钥
  • .ssh/config 文件进行了以下更改:
Host ssh.dev.azure.com 
  IdentityFile ~/.ssh/me
  IdentitiesOnly yes

Host automation
  HostName ssh.dev.azure.com
  User git
  IdentityFile ~/.ssh/auto 
  IdentitiesOnly yes 

Host automationsec 
  HostName ssh.dev.azure.com 
  User git 
  IdentityFile ~/.ssh/auto_sec 
  IdentitiesOnly yes 

测试了以下两种情况:

module "test" {
  source     = "git::automation:v3/<org name>/<project name>/_git/<repo name>//<sub path>?ref=<version ref>"
}

module "test" {
  source     = "git::automationsec:v3/<org name>/<project name>/_git/<repo name>//<sub path>?ref=<version ref>"
}

第一种无密码输入有效,第二种情况无效。不确定为什么不接受带密码的 ssh 密钥的根本原因

关于使用带密码的 ssh 密钥,我们通常为此使用 ssh-agent 和 ssh-add 来加载密钥。在尝试使用上述@Vonc 的解决方案解决同样的问题后,我进一步研究了 terraform 文档并发现了以下内容:

agent - Set to false to disable using ssh-agent to authenticate. On Windows the only supported SSH authentication agent is Pageant.

( https://www.terraform.io/docs/language/resources/provisioners/connection.html )

是的,这是可能的,我自己在多个项目上都成功地做到了:

对于 VSTS URL:

source = "git::ssh://OrgName@vs-ssh.visualstudio.com/v3/OrgName/ProjectName/RepoName//DirectoryName"

或 Azure DevOps URL:

source = "git::ssh://git@ssh.dev.azure.com/v3/OrgName/ProjectName/RepoName//DirectoryName"

请注意,即使您正确设置了源,如果您的已知主机文件不是最新的,您可能会收到一条错误消息,提示您检查您的权限,这是非常具有误导性的。

运行 在 ssh.dev.azure.com 或 vs-ssh.visualstudio.com 上进行 ssh-keyscan 以获取已知主机条目。

您也可以使用 SSH 从私有 Github 存储库中提取数据。

参考:https://jimferrari.com/2022/01/12/use-terraform-modules-from-private-github-in-azure-devops/