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



寻找通过SSH在私有Azure DevOps git存储库中托管的Terraform模块的正确/工作方法(请参阅TF Docs关于通过ssh获取Git存储库)。

拥有PAT令牌是不可取的,因为它最终会过期并且续订还不能自动化(尽管显然很快就会推出)。尽管如此,我已经验证了 https 方法,但如果可以的话,我想避免需要编辑源代码,因为模块源引用不能在初始化时包含 terraform vars。

我已按照以下步骤生成 ssh 私钥/公钥对,这些文件已添加到我的本地.ssh文件夹 @C:WindowsUsers<username>.ssh.

地形代码示例如下:

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

<ref>测试的地方:

  • git::https://<pat token>:dev.azure.com/<org name>/<project name>/_git/<repo name>//<sub path>?ref=<version ref>- 作为最后手段的有效/验证的HTTPS方法
  • git::ssh://git@ssh.dev.azure.com:v3/<org name>/<project name>/_git/<repo name>//<sub path>?ref=<version ref>
  • git::ssh://git@ssh.dev.azure.com/v3/<org name>/<project name>/_git/<repo name>//<sub path>?ref=<version ref>- 见地形/问题/18869

在这里阅读了多个键后:

通常,如果为 SSH 客户端配置多个密钥并连接到 SSH 服务器,则客户端可以一次尝试一个密钥,直到服务器接受一个密钥。但是,由于与 SSH 协议以及我们的 Git SSH URL 结构相关的技术原因,这不适用于 Azure DevOps。Azure DevOps 将盲目接受客户端在身份验证期间提供的第一个密钥。如果该密钥对于请求的存储库无效,则请求将失败并显示以下错误:远程:公钥身份验证失败。 致命:无法从远程存储库读取。

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

  • 删除除我想专门用于这种情况的automationssh 密钥对之外的所有其他密钥(而不是我自己的个人 SSH 密钥来识别我)
  • .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>尝试:

  • git::ssh://git@automation/v3/<org name>/<project name>/_git/<repo name>//<sub path>?ref=<version ref>
  • git::ssh://automation/v3/<org name>/<project name>/_git/<repo name>//<sub path>?ref=<version 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>并取回我可以确认存在于 Azure DevOps 下的 SSH 密钥下的 Azure DevOps 中的2048 MD5:ab:e2:... automation (RSA)来验证它是否已注册到 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。

几乎可以肯定我错过了一些明显的东西,但是经过广泛的谷歌搜索和许多不同的配置,我一生都无法让它工作。感谢帮助/指针/建议

工具版本:

  • 地形 v0.13.4
  • git 版本 2.17.1.Windows.2
  • OpenSSH_for_Windows_7.7p1, LibreSSL 2.6.5

是的,这是可能的,我已经在多个项目中成功地完成了:

对于 VSTS 网址:

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-keysscan 以获取已知主机条目。

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

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

在这个问题和 Terraform 文档之后,我会尝试 URL

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

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

  • 确保先将 Git 升级到 2.31.1。
  • 尝试在 terraform 命令之前set GIT_SSH_COMMAND="ssh -Tv",以查看使用了什么键。
  • 检查直接引用OpenSSH是否有帮助(除非它已经在您的%PATH%中:请与where ssh核实)

OP Jamie执行以下步骤:

  • 将 Git 更新为上述版本
  • 使用 MS 文档中的步骤重新生成了一些新密钥
  • 使用 ssh-add 添加了所有密钥
  • 向 Azure DevOps 添加了公钥
  • 对文件进行了以下更改.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文档并发现了以下内容:

代理 - 设置为 false 可禁用使用 ssh 代理进行身份验证。在Windows上,唯一受支持的SSH身份验证代理是Pageant。

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

相关内容

  • 没有找到相关文章

最新更新