Ansible比较zip列表到目录

时间:2018-12-05 22:06:23

标签: ansible

编辑:通过获取7z内容的校验和并检查

,我以不同的方式解决了此问题

a)如果目录存在 b)如果匹配-内容校验和是否匹配


我有一本使用7zip shell命令的ansible剧本,但我想检查7z是否已经充气,所以我有以下内容

{% if large_items %}

<h1>Tree</h1>

{% endif %}

我希望发生以下情况:

  1. 第一次停止“比较”任务result.stat.exists == False(7z有很多文件,在那之后继续比较毫无意义)
  2. 注册文件是否需要充气,并根据需要进行充气

1 个答案:

答案 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指出了whenregister之前进行评估,因此我们实际上可以得到 您可以这样编写比较任务:

- 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语句将导致第一个循环之后的所有循环迭代 无法跳过。