git - 通过 ssh key 转发进行身份验证时克隆 git 存储库的最佳方法

标签 git ansible git-clone

先决条件:

  • 通过 ssh key 进行主机和 git 身份验证
  • 已启用 ssh key 转发
  • 我们团队的每个用户都使用专用用户帐户 - 无法通过 headless 用户帐户登录

现在我们要从 git 存储库部署应用程序。这应该很简单,但事实并非如此。

- name: Clone app repo
  git:
    repo: githost:org/repo.git
    dest: /some/location
    version: HEAD
    force: yes
    ssh_opts: -o StrictHostKeyChecking=no
  notify:
    - Restart app

githost 是我们的 .ssh/config

中的一个条目

上述任务有效。但是存储库(当然)被克隆为执行剧本的用户。我们需要的是:

  • 所有文件都应归 headless 用户所有,我们称他为 zaphod
  • 只有 zaphod 被允许读取 文件。我们说的是 0600/0700 权限。

以下任务将不起作用,因为通过使用 become 我们将丢失转发的 ssh key ,因此 git 身份验证将失败:

- name: Clone app repo
  git:
    repo: githost:org/repo.git
    dest: /some/location
    version: HEAD
    force: yes
    ssh_opts: -o StrictHostKeyChecking=no
  notify:
    - Restart app
  become: yes
  become_user: zaphod

以下变体将首先调用一个处理程序,该处理程序在(重新)启动应用程序之前更改 checkout 的所有权:

- name: Clone app repo
  git:
    repo: githost:org/repo.git
    dest: /some/location
    version: HEAD
    force: yes
    ssh_opts: -o StrictHostKeyChecking=no
  notify:
    - Fix ownership
    - Restart app

这一次有效。但是,如果您第二次运行该剧本,则 git 任务会失败,因为运行该剧本的用户没有修改克隆的权限。

我们有一个非常丑陋的解决方案:

  • 克隆到/tmp/foo
  • 修复/tmp/foo 的所有权
  • rm -rf/some/location
  • mv/tmp/foo/some/location
  • 最终(重新)启动应用程序

问题是这样会:

  • 每次执行 playbook 时触发重启
  • Ansible 摘要显示了 5 个已更改的任务,尽管什么也没发生——除了一开始不需要的重启

我在这里有点挑剔,但我只想在某些事情真的发生变化时改变状态,所以在一个完美的世界中,即使是 git 任务也不会有改变的状态。为此,我看不到解决方案。因为我们要求克隆的文件只能由 zaphod 访问 - 但 zaphod 自己无法克隆 repo。所以必须有一些操纵是某种形式导致变化。

关于如何以干净的方式改进它有什么建议吗?我不想再添加 20 个临时副本、临时更改权限、手动比较文件等等的任务......

当然,自定义编写的模块能够处理所有这些 - 但我更感兴趣的是不需要 2 天的开发和战斗测试。 ;-)

最佳答案

看起来您正在尝试通过简单地克隆包含您需要的内容的存储库来部署应用程序/网页,而不是需要能够将任何更改从该服务器推送回存储库。

如果是这种情况,那么您可以完成一个本地任务到 git archive将 repo 打包成 tarball 之类的,然后使用 unarchive将生成的存档复制到目标机器并解压缩。 unarchive 将允许您设置权限和所有权。

所以你的游戏看起来像这样:

- name: locally clone repo
  git:
    repo: githost:org/repo.git
    dest: /some/tmp/location
    version: HEAD
    force: yes
  delegate_to: localhost
  changed_when: false #

- name: archive app repo
  command: git archive --format zip --output /path/to/archive master
    chdir: /some/tmp/location
  delegate_to: localhost
  changed_when: false

- name: unarchive app repo
  unarchive:
    src: /path/to/archive
    dest: /some/location
    owner: zaphod
    mode: 0700
    creates: /some/location
  notify:
    - Restart app

关于git - 通过 ssh key 转发进行身份验证时克隆 git 存储库的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34740271/

相关文章:

ansible - 如何使用 Ansible 复制与 glob 模式匹配的文件

directory-structure - 将 git 存储库克隆到它自己的 .git 目录中是否安全?

git - 为什么 GitHub 不是 Azure Web App 部署的选项?

git - 仅在有更改时如何让 Jenkins git 提交?

android - 我在哪里可以浏览 java.lang.String 的 Android 2.2 Froyo 源代码?

python - 如何为Python虚拟环境配置Ansible?

Ansible - 有没有办法使用 Ansible 更改 Windows Server IP 地址?

git - 有没有办法在克隆 Git 存储库时自动包含多个 Remote ?

windows - 如何在 Windows 上通过 ssh 阻止 git 解析错误的路径?

git - 如果文件在特定目录下被修改,则运行预提交 Hook