如何使用Ansible按指定顺序克隆配置文件中定义的多个Git仓库
核心原理
Ansible的loop循环默认严格按照传入列表的元素顺序逐个串行执行,前一个任务执行完成才会运行下一个,所以只要调整传入loop的列表顺序就能控制克隆顺序。
方案1:直接调整config.yml的列表顺序(最简便)
把repo2的配置移到git列表的最顶部即可,原有任务代码不需要做任何修改,执行时就会先克隆repo2,再按顺序克隆剩下的仓库。
修改后的config.yml示例:
git: - dest: /home/Desktop/repo2 name: repo2 repo: gitlab*** branch: master - dest: /home/Desktop/repo1 name: repo1 repo: gitlab*** branch: master - dest: /home/Desktop/repo3 name: repo3 repo: gitlab*** branch: master
方案2:不修改配置文件,在任务层调整循环顺序
如果不能改动原有配置的顺序,可以用Jinja2过滤器重新拼接循环列表,把指定仓库放到最前面,修改后的任务代码:
- name: clone all the git repos with priority git: repo: "{{ item.repo }}" dest: "{{ item.dest }}" version: "{{ item.branch }}" force: yes depth: 1 loop: "{{ [config.git | selectattr('name', 'equalto', 'repo2') | first] + (config.git | rejectattr('name', 'equalto', 'repo2') | list) }}"
该写法会先提取name为repo2的元素放到列表第一位,剩下的元素保留原有配置顺序拼接在后面。
方案3:新增优先级字段适配后续扩展需求
如果后续可能频繁调整克隆优先级,可在配置中新增priority字段,数值越小优先级越高:
修改后的config.yml示例:
git: - dest: /home/Desktop/repo1 name: repo1 repo: gitlab*** branch: master priority: 2 - dest: /home/Desktop/repo2 name: repo2 repo: gitlab*** branch: master priority: 1 - dest: /home/Desktop/repo3 name: repo3 repo: gitlab*** branch: master priority: 2
修改任务代码用sort过滤器按优先级排序:
- name: clone all the git repos sorted by priority git: repo: "{{ item.repo }}" dest: "{{ item.dest }}" version: "{{ item.branch }}" force: yes depth: 1 loop: "{{ config.git | sort(attribute='priority') }}"
内容的提问来源于stack exchange,提问作者stack questions
相关产品推荐
相关产品推荐

