如何检查文件是否已在ansible中下载
我正在从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文件的情况下这样做。目前系统每次都在下载它。这里至少有两个选项 如果文件存在,可以注册变量,然后
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 advicedargs:{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