udo*_*dan 4 git git-clone ansible ansible-playbook
先决条件:
现在我们要从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中的一个条目
以上任务有效.但是(当然)存储库被克隆为执行该剧本的用户.我们需要的是:
zaphodzaphod允许读取文件.我们正在谈论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任务失败,因为运行该游戏的用户没有修改克隆的权限.
我们有一个非常丑陋的解决方案:
rm -rf /some/locationmv /tmp/foo /some/location这样做的问题是:
我在这里有点挑剔,但我只想改变状态,如果真的发生了变化,那么在一个完美的世界中,甚至git任务都不会改变状态.为此,我没有看到解决方案.因为我们要求克隆文件只能被访问zaphod- 但zaphod他自己无法克隆回购.所以必须有一些操作是某种形式导致变化.
有什么建议如何以干净的方式改善这一点?我不想再添加20个临时副本,临时更改权限,手动比较文件等等的任务......
当然,一个自定义编写的模块将能够处理所有这些 - 但我更感兴趣的是在开发和战斗测试中不需要2天的事情.;-)
看起来你试图通过简单地克隆包含你需要的东西的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)