如何使用Ansible将代码从本地git仓库部署到远程服务器

wztqucjr  于 2022-11-20  发布在  Git
关注(0)|答案(3)|浏览(316)

我正在使用Ansible 2.5。我需要从本地(控制器)git仓库部署代码到远程服务器。
我试着用一个Ansible-playbook的git模块,它只能把代码从本地仓库部署到另一个本地路径,或者从远程仓库部署到另一个远程路径。

- git:
    repo: /home/pi/Desktop/kk/Vue-Example/
    dest: /home/pi/Desktop/bb

这里repo将是本地(控制器-计算机)Git仓库路径,dest将是远程计算机位置。

sh7euo9m

sh7euo9m1#

这也正是我想要的工作流程--从我可以依赖的本地git存储库中提取文件。在我的例子中,我使用了一个特定的提交ID(一个已经过良好测试的版本)而不是分支名称。如果你想要这样做,只需将下面的'master'替换为提交ID即可。

- tasks:
    - name: Make temp directory
      tempfile:
        state: directory
      register: temp_git_archive
      delegate_to: localhost
      become: no
      changed_when: False
    - name: Extract latest git commit on branch master
      shell: git archive master |tar --extract --directory={{ temp_git_archive.path }}
      args:
        chdir: /home/pi/Desktop/kk/Vue-Example/  # YOUR LOCAL GIT REPO
      delegate_to: localhost
      become: no
      changed_when: False
    - name: Copy to remote
      copy:
        src: "{{ temp_git_archive.path }}"
        dest: /home/pi/Desktop/bb  # YOUR DESTINATION DIRECTORY
    - name: Delete temp directory
      file:
        path: "{{ temp_git_archive.path }}"
        state: absent
      when: temp_git_archive.path is defined
      delegate_to: localhost
      become: no
      changed_when: False

也许可以使用Ansible的“git”和“unarchive”模块来代替上面的“shell”模块,但我更喜欢一步到位。

2guxujil

2guxujil2#

您错误地理解了ansible的git模块的用法。它被用来克隆目标路径上的远程存储库,即控制器机器或远程主机上的存储库。您指定的本地路径对于git模块来说并不存在,因为git会尝试发送http/ssh请求,但这样的路径并不存在。
Ansible的回购价值报价为
repo:git存储库的git、SSH或HTTP(S)协议地址。
如果你想在控制器机器上克隆ssh密钥,那么你可以使用git模块委托localhost,然后使用copy模块从控制器复制到远程机器

---
- name: play to checkout
  hosts: remote-hosts
  tasks:
    - name: git checkout
      repo: "{{ repo_url }}"
      dest: /tmp
      delegate_to: localhost
    - name: copy module
      synchronize:
        src: ...
        dest: ...
xe55xuns

xe55xuns3#

以下是我的看法:

---
- name: Create repo directory
  file:
    path: "{{project_src_destination}}"
    state: directory
- name: Init repo
  command: git init {{project_src_destination}}
  args:
    creates: "{{project_src_destination}}/.git"
- name: Test repo state
  command: git show {{project_branch}}
  args:
    chdir: "{{project_src_destination}}"
  register: result
  ignore_errors: true
  changed_when: result.rc != 0
- name: Upload the repo
  local_action:
    module: command git push ssh://{{inventory_hostname}}/{{project_src_destination}} {{project_branch}}
    chdir: "{{project_src_source}}"
  when: 'result.rc != 0'
- name: Checkout the newly created branch
  command: git checkout {{project_branch}}
  args:
    chdir: "{{project_src_destination}}"
  register: result
  changed_when: "'Switched' in result.stdout"

与前面的答案不同,不需要创建中间存档。如果需要进行增量更新,这可能是有利的。
一种完全不同的方法是使用rsync:

- name: Copy sources
  ansible.posix.synchronize:
    src: "{{project_src_host}}"
    dest: "{{project_src_destination}}"
    delete: true
    rsync_opts:
      - "--exclude=.git"
      - "--exclude=*.pb.go"
      - "--exclude=*.o"
      - "--exclude=*.d"
      - "--filter=:- .gitignore"

这里的想法是主要依靠.gitignore来不复制中间编译结果。

相关问题