Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何检查文件是否已在ansible中下载_Ansible - Fatal编程技术网

如何检查文件是否已在ansible中下载

如何检查文件是否已在ansible中下载,ansible,Ansible,我正在从ansible下载带有wget的文件 - name: Download Solr shell: wget http://mirror.mel.bkb.net.au/pub/apache/lucene/solr/4.7.0/solr-4.7.0.zip args: chdir: {{project_root}}/solr 但我只想在那个位置不存在zip文件的情况下这样做。目前系统每次都在下载它。这里至少有两个选项 如果文件存在,可以注册变量,然后

我正在从ansible下载带有
wget
的文件

  - name: Download Solr
    shell: wget http://mirror.mel.bkb.net.au/pub/apache/lucene/solr/4.7.0/solr-4.7.0.zip
      args:
        chdir: {{project_root}}/solr 

但我只想在那个位置不存在zip文件的情况下这样做。目前系统每次都在下载它。

这里至少有两个选项

如果文件存在,可以注册变量,然后在文件不存在的情况下执行命令:

- command: /usr/bin/test -e {{project_root}}/solr/solr-4.7.0.zip
  register: solr_zip
  ignore_errors: True
- name: Download Solr
  shell: chdir={{project_root}}/solr /usr/bin/wget http://mirror.mel.bkb.net.au/pub/apache/lucene/solr/4.7.0/solr-4.7.0.zip
  when: solr_zip|failed
您还可以将与
创建
选项一起使用:

- name: Download Solr
  command: /usr/bin/wget http://mirror.mel.bkb.net.au/pub/apache/lucene/solr/4.7.0/solr-4.7.0.zip chdir={{project_root}}/solr  creates={{project_root}}/solr/solr-4.7.0.zip

因此,基本上可以通过从命令注册变量并检查其返回代码来执行此检查。(也可以通过检查其标准输出来执行此操作)

-名称:剧本
主持人:全部
用户:
变量:
项目根目录:/usr/local
任务:
-名称:检查solr zip是否存在。
命令:/usr/bin/test-e{{project_root}}/solr/solr-4.7.0.zip
忽略错误:True
寄存器:solr_存在
-名称:下载Solr
shell:chdir={{project_root}}/solr wgethttp://mirror.mel.bkb.net.au/pub/apache/lucene/solr/4.7.0/solr-4.7.0.zip
当:solr_exists.rc!=0
这基本上是说,如果
/usr/bin/test-e{{project_root}}/solr/solr-4.7.0.zip
命令返回的代码不是0,意味着它不存在,那么执行任务
下载solr


希望有帮助。

除非您有理由使用
wget
为什么不使用
get\u url
模块。它将检查文件是否需要下载

---
- hosts        : all
  gather_facts : no
  tasks:
   - get_url:
       url="http://mirror.mel.bkb.net.au/pub/apache/lucene/solr/4.7.0/solr-4.7.0.zip"
       dest="{{project_root}}/solr-4.7.0.zip"
注意:如果您将目录而不是完整路径放在
dest
ansible中,ansible仍会将文件下载到临时目录,但会执行md5检查以决定是否复制到dest目录

如果您需要保存下载状态,可以使用:

---
- hosts        : all
  gather_facts : no
  tasks:
   - get_url:
       url="http://mirror.mel.bkb.net.au/pub/apache/lucene/solr/4.7.0/solr-4.7.0.zip"
       dest="{{project_root}}/solr-4.7.0.zip"
     register: get_solr

   - debug: 
       msg="solr was downloaded"
     when: get_solr|changed

注:此答案涵盖了“如何检查ansible中是否存在文件”的一般问题,而不是下载文件的具体情况

前面使用“command”或“shell”操作的答案的问题在于它们不能在--check模式下工作。实际上,第一个操作将被跳过,下一个操作将在“when:solr_exists.rc!=0”条件下出错(由于未定义变量)

自从Ansible 1.3以来,有一种更直接的方法来检查文件是否存在——使用“stat”模块。当然,它也可以与“local_action”一起检查本地文件是否存在:

- local_action: stat path={{secrets_dir}}/secrets.yml
  register: secrets_exist

- fail: msg="Production credentials not found"
  when: secrets_exist.stat.exists == False

许多模块已经知道结果,如果结果已经存在,则将跳过这些模块,如
file
geturl
。其他类似于
command
的命令有一个
creates
选项,如果该文件已经存在(或者不存在,如果使用
removes
选项),该选项将跳过该命令

因此,您应该首先检查可用的模块,如果它们已经足够智能。如果不是:我建议使用
stats
模块。与其他解决方案相比的优势:输出中没有“红色错误但被忽略”

- name: Check MySQL data directory existence
  stat: path=/var/lib/mysql-slave
  register: mysql_slave_data_dir

- name: Stop MySQL master to copy data directory
  service: name=mysql state=stopped
  sudo: yes 
  when: not mysql_slave_data_dir.stat.exists
可能有用

下面是一个例子:

tasks:
  - shell: if [[ -f "/etc/monitrc" ]]; then /bin/true; else /bin/false; fi
    register: result
    ignore_errors: True

  - command: /bin/something
    when: result|failed

  - command: /bin/something_else
    when: result|success

  - command: /bin/still/something_else
    when: result|skipped

使用
创建
参数

- name: Download Solr
  shell: creates={{working_directory}}/solr/solr-4.7.0.zip chdir={{working_directory}}/solr wget http://mirror.mel.bkb.net.au/pub/apache/lucene/solr/4.7.0/solr-4.7.0.zip

我最喜欢的是仅下载比本地文件新的文件(包括本地文件不存在时)

wget的
-N
选项执行以下操作:

遗憾的是,我认为
get\u url

所以一个很小的变化:


-名称:下载Solr
shell:chdir={{project_root}}/solr wget-Nhttp:///solr-4.7.0.zip

虽然这个答案肯定是下载文件的最佳方法,但问题是“如何在ansible中检查文件是否存在”,而不是“如何在ansible中下载文件”。很好地理解了OP真正想要的东西,但从技术上来说,这并不能回答问题。引用的问题“如果zip文件不存在于该位置,我只想这样做”代码就是这样做的。第二个任务是调试,如果你看一下,只有在文件不存在且已下载的情况下才会执行调试。DomaNitro:@BenWhaley说你没有回答这个问题是正确的。不要以曾经问过一个问题的单身汉的角度来思考,要以数百万人的角度来思考,他们将永远在谷歌上搜索这个问题。你的回答只会浪费他们的时间。一句话:问题发起者不应该接受你的答案,所以它不是第一个。@pfalcon感谢你的评论,但我不同意提问者对他在特定情况下提问感到满意。因此,在get_url之后添加另一层检查是多余的。如果您想检查文件是否存在,请再次询问问题或检查@DomaNitro,感谢您积极采纳建议。“问题”是,在谷歌输出的“ansible check file existence”中,问题是#2,因此,问另一个标题相同的问题在很长一段时间内对其他人没有帮助(很可能会被视为dup关闭)。无论如何,我能做的最有成效的事情就是发布另一个答案,并提供最新的方法。我相信local_action不受欢迎,您可以直接使用
stat:path={{secrets_dir}}/secrets.yml
。这回答了我在这里的问题,谢谢。在我看来,objectstat寄存器可以使用更多的文档(或者我可以用ipython检查它)/lazymeWhy nowner adviced
args:{creates:filename}
?下载大文件时使用
wget-nv
wget-q
,否则进度条的恒定输出将导致ansible中的内存错误。这一点在回答中已经说过:在原始问题的注释中也提到过,但是它需要更多的可见性
如果为true,则返回true,否则返回false endif
- name: Download Solr
  shell: creates={{working_directory}}/solr/solr-4.7.0.zip chdir={{working_directory}}/solr wget http://mirror.mel.bkb.net.au/pub/apache/lucene/solr/4.7.0/solr-4.7.0.zip