编辑:通过获取7z内容的校验和并检查
,我以不同的方式解决了此问题a)如果目录存在 b)如果匹配-内容校验和是否匹配
我有一本使用7zip shell命令的ansible剧本,但我想检查7z是否已经充气,所以我有以下内容
{% if large_items %}
<h1>Tree</h1>
{% endif %}
我希望发生以下情况:
答案 0 :(得分:0)
听起来您想让提取任务有条件 比较任务是成功还是失败,并且您想要比较 任务一旦发现不存在的文件就会失败。
我们可以在那里获得最大的成功。
通常,stat
模块在您指向时不会触发失败
它以不存在的路径。例如,以下剧本:
- hosts: localhost
gather_facts: false
tasks:
- stat:
path: /does-not-exist
register: result
- debug:
var: result
收益:
TASK [stat] ***********************************************************************************
ok: [localhost]
TASK [debug] **********************************************************************************
ok: [localhost] => {
"result": {
"changed": false,
"failed": false,
"stat": {
"exists": false
}
}
}
Ansible为我们提供了failed_when
指令来控制何时
任务失败。这意味着我们可以重写您的比较任务,以使失败
缺少这样的文件:
- name: Compare zip listing to file contents
stat:
path: '{{ extract_dir }}/{{ item }}'
register: result
failed_when: not result.stat.exists
ignore_errors: true
with_items: '{{ sz_contents.stdout_lines }}'
failed_when
指令告诉Ansible考虑任务
如果传递给stat
的文件不存在,并且
ignore_errors
指令告诉Ansible继续执行
剧本,而不是任务失败后终止。
我们可以用一个简单的条件就此提取任务条件
when
指令:
- name: Inflate 7z file if needed
shell: 7z x {{ sz_file }}
when: result is failed
此解决方案的唯一问题是Ansible不会退出循环
当单个项目导致失败时,将要检查
遍及整个sz_contents.stdout_lines
。
更新
我在irc上讨论了这个问题,@ bcoca指出了when
在register
之前进行评估,因此我们实际上可以得到
您可以这样编写比较任务:
- name: Compare zip listing to file contents
stat:
path: '{{ extract_dir }}/{{ item }}'
register: result
when: result is defined or result is success
failed_when: not result.stat.exists
ignore_errors: true
with_items: '{{ sz_contents.stdout_lines }}'
when
语句将导致第一个循环之后的所有循环迭代
无法跳过。