我正在使用Ansible 2.5。我需要从本地(控制器)git仓库部署代码到远程服务器。我试着用一个Ansible-playbook的git模块,它只能把代码从本地仓库部署到另一个本地路径,或者从远程仓库部署到另一个远程路径。
- git: repo: /home/pi/Desktop/kk/Vue-Example/ dest: /home/pi/Desktop/bb
这里repo将是本地(控制器-计算机)Git仓库路径,dest将是远程计算机位置。
repo
dest
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”模块,但我更喜欢一步到位。
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: ...
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来不复制中间编译结果。
.gitignore
3条答案
按热度按时间sh7euo9m1#
这也正是我想要的工作流程--从我可以依赖的本地git存储库中提取文件。在我的例子中,我使用了一个特定的提交ID(一个已经过良好测试的版本)而不是分支名称。如果你想要这样做,只需将下面的'master'替换为提交ID即可。
也许可以使用Ansible的“git”和“unarchive”模块来代替上面的“shell”模块,但我更喜欢一步到位。
2guxujil2#
您错误地理解了ansible的git模块的用法。它被用来克隆目标路径上的远程存储库,即控制器机器或远程主机上的存储库。您指定的本地路径对于git模块来说并不存在,因为git会尝试发送http/ssh请求,但这样的路径并不存在。
Ansible的回购价值报价为
repo:git存储库的git、SSH或HTTP(S)协议地址。
如果你想在控制器机器上克隆ssh密钥,那么你可以使用git模块委托localhost,然后使用copy模块从控制器复制到远程机器
xe55xuns3#
以下是我的看法:
与前面的答案不同,不需要创建中间存档。如果需要进行增量更新,这可能是有利的。
一种完全不同的方法是使用rsync:
这里的想法是主要依靠
.gitignore
来不复制中间编译结果。