编辑:通过获得7z内容的校验和并检查,我以不同的方式解决了这个问题。
( a)如果目录存在,b)如果存在,那么目录的内容校验和匹配吗?
我有一个ansible剧本,它使用了一个7zip shell命令,但是我想检查一下7z是否已经膨胀了,所以我有以下内容
- name: Get zip listing
shell: '7z l {{ sz_file }} | tail -n +21 | head -n -2 | cut -c 54-'
register: sz_contents
- name: Compare zip listing to file contents
stat:
path: '{{ extract_dir }}/{{ item }}'
register: result
with_items: '{{ sz_contents.stdout_lines }}'
- name: Inflate 7z file if needed
shell: 7z x {{ sz_file }}
when: ???我希望发生以下情况:
发布于 2018-12-06 09:43:56
听起来,您想要使提取任务取决于比较任务是成功还是失败,并且希望比较任务在找到不存在的文件时立即失败。
我们大部分的路都能到那里。
通常,当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语句将导致跳过第一次失败后的所有循环迭代。
https://stackoverflow.com/questions/53641481
复制相似问题