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

udo*_*dan 4 git git-clone ansible ansible-playbook

先决条件:

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

现在我们要从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
Run Code Online (Sandbox Code Playgroud)

githost是我们的.ssh/config中的一个条目

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

  • 所有文件都应由无头用户拥有,让我们给他打电话 zaphod
  • zaphod允许读取文件.我们正在谈论0600/0700权限.

以下任务将不起作用,因为通过使用become我们将丢失转发的ssh密钥,因此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
Run Code Online (Sandbox Code Playgroud)

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

- 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
Run Code Online (Sandbox Code Playgroud)

这个工作一次.但是如果第二次运行playbook git任务失败,因为运行该游戏的用户没有修改克隆的权限.

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

  • 克隆到/ tmp/foo
  • 修复/ tmp/foo的所有权
  • rm -rf /some/location
  • mv /tmp/foo /some/location
  • 最后(重新)开始申请

这样做的问题是:

  • 每次执行playbook时都会触发重启
  • Ansible摘要显示了5个已更改的任务,即使没有发生任何事情 - 除了首先不需要的重启

我在这里有点挑剔,但我只想改变状态,如果真的发生了变化,那么在一个完美的世界中,甚至git任务都不会改变状态.为此,我没有看到解决方案.因为我们要求克隆文件只能被访问zaphod- 但zaphod他自己无法克隆回购.所以必须有一些操作是某种形式导致变化.

有什么建议如何以干净的方式改善这一点?我不想再添加20个临时副本,临时更改权限,手动比较文件等等的任务......

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

yda*_*coR 6

看起来你试图通过简单地克隆包含你需要的东西的repo而不是需要能够将任何更改从该服务器推回到repo来部署应用程序/网页.

如果是这种情况,那么你可以将一个本地任务转移git archive到一个taro或者其他东西,然后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
Run Code Online (Sandbox Code Playgroud)