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_{{

是否可以使用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_{{ 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….**谢谢