Ansible:仅从git repo克隆一个文件
是否可以使用git ansible module从git中克隆一个文件?据我所知,ansible的git归档文件似乎只在本地克隆的repo中工作 目前我使用的是:Ansible:仅从git repo克隆一个文件,ansible,Ansible,是否可以使用git ansible module从git中克隆一个文件?据我所知,ansible的git归档文件似乎只在本地克隆的repo中工作 目前我使用的是: - name: Bring file from git shell: git archive --remote=git://git.example.com/project.git HEAD:{{ test }} filename | tar -x -C folder1 -s /filename/filename_{{
- name: Bring file from git
shell: git archive --remote=git://git.example.com/project.git HEAD:{{ test }} filename | tar -x -C folder1 -s /filename/filename_{{ test }}/
delegate_to: localhost
test
变量在每个组下的inventory
文件中定义为其他值:
[group1:vars]
test=abc
[group1]
host1
host2
[group2:vars]
test=xyz
[group2]
host5
host6
是否有可能将shell模块设置为幂等,以便在文件已下载且存在的情况下,不会在同一主机组的主机上再次运行相同任务,使用相同的test变量值
例如:
如果我从上面为group1运行任务,任务将运行在group1下的第一台主机上,并从git获取文件,然后运行在group1下的第二台主机上,并再次从git获取相同的文件
我想做的是,如果任务从git为group1下的第一个主机带来文件,就不会从git为group1的host2带来相同的文件
谢谢
Q:“如果任务从git为group1下的第一台主机带来文件,则不会从git为group1下的host2再次带来相同的文件。”
A:完成这项任务是可能的。比如说
- name: Bring file from git
shell: git ...
run_once: true
Q:“Playbook以:-hosts:all开头。我希望每个组下的第一个主机都运行shell:git….”
答:可以将任务分为不同的重头戏。从第一个播放中的所有组中创建一组第一个主机。在第二个重头戏中,使用创建的组从git下载文件。准备好数据后,为所有主机运行第三个重头戏。比如说
- name: Create group of hosts my_git_group
hosts: localhost
gather_facts: false
tasks:
- add_host:
name: "{{ groups[item]|first }}"
groups: 'my_git_group'
loop: "{{ groups.keys()|difference(['ungrouped', 'all']) }}"
- name: Download files from git
hosts: my_git_group
gather_facts: false
tasks:
- debug:
msg: "{{ inventory_hostname }} shell git"
- name: Proceed
hosts: all
gather_facts: false
tasks:
- debug:
msg: Proceed
run_once: true
Q:“如果任务从git为group1下的第一台主机带来文件,则不会从git为group1下的host2再次带来相同的文件。”
A:完成这项任务是可能的。比如说
- name: Bring file from git
shell: git ...
run_once: true
Q:“Playbook以:-hosts:all开头。我希望每个组下的第一个主机都运行shell:git….”
答:可以将任务分为不同的重头戏。从第一个播放中的所有组中创建一组第一个主机。在第二个重头戏中,使用创建的组从git下载文件。准备好数据后,为所有主机运行第三个重头戏。比如说
- name: Create group of hosts my_git_group
hosts: localhost
gather_facts: false
tasks:
- add_host:
name: "{{ groups[item]|first }}"
groups: 'my_git_group'
loop: "{{ groups.keys()|difference(['ungrouped', 'all']) }}"
- name: Download files from git
hosts: my_git_group
gather_facts: false
tasks:
- debug:
msg: "{{ inventory_hostname }} shell git"
- name: Proceed
hosts: all
gather_facts: false
tasks:
- debug:
msg: Proceed
run_once: true
shell
根据定义,模块不是幂等的。这就是为什么不能在基于模型的配置管理方法中使用shell
模块的原因。问题不在于shell
,而在于您的命令shell
模块不能保证任何命令都是幂等的@azbarcea使用语句“shell模块根据定义不是幂等的”
”太快了。使用参数创建:filename
是幂等的。@VladimirBotka,你的名字太亲切、太正确了。确实,creates:filename
将确保如果文件存在(如问题中所要求的),则不会执行shell
命令。但是如果文件被远程更改,shell
命令也不会执行,因为我认为最终目的是@azbarcea,任务从git为group1下的第一台主机带来文件时,以及从git为group1下的host2再次带来相同文件时,点之间的代码段是关键部分。再次携带更改过的文件会带来数据危险。这不可能是最终目的。是的。我明白你的意思。好奇@HusdupBogdan说了些什么。可能是受我过去被要求的影响:-)shell
模块的定义不是幂等的。这就是为什么不能在基于模型的配置管理方法中使用shell
模块的原因。问题不在于shell
,而在于您的命令shell
模块不能保证任何命令都是幂等的@azbarcea使用语句“shell模块根据定义不是幂等的”
”太快了。使用参数创建:filename
是幂等的。@VladimirBotka,你的名字太亲切、太正确了。确实,creates:filename
将确保如果文件存在(如问题中所要求的),则不会执行shell
命令。但是如果文件被远程更改,shell
命令也不会执行,因为我认为最终目的是@azbarcea,任务从git为group1下的第一台主机带来文件时,以及从git为group1下的host2再次带来相同文件时,点之间的代码段是关键部分。再次携带更改过的文件会带来数据危险。这不可能是最终目的。是的。我明白你的意思。好奇@HusdupBogdan说了些什么。也许是受过去我被要求的影响:-)我下个星期会试试,让你知道他是不是这样工作的。谢谢你的提示!我尝试过,但在我的场景中没有按预期工作,因为我的剧本以:-主机:全部,我希望每个组下的每个第一个主机都运行**shell:git….**谢谢,我下星期会试试,如果是这样的话,我会告诉你的。谢谢你的提示!我尝试过,但在我的场景中没有按预期工作,因为我的剧本以:-主机:全部,我希望每个组下的每个第一个主机都运行**shell:git….**谢谢