首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Ansible比较zip列表到目录

Ansible比较zip列表到目录
EN

Stack Overflow用户
提问于 2018-12-05 22:06:22
回答 1查看 853关注 0票数 0

编辑:通过获得7z内容的校验和并检查,我以不同的方式解决了这个问题。

( a)如果目录存在,b)如果存在,那么目录的内容校验和匹配吗?

我有一个ansible剧本,它使用了一个7zip shell命令,但是我想检查一下7z是否已经膨胀了,所以我有以下内容

代码语言:javascript
运行
复制
- 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: ???

我希望发生以下情况:

  1. 第一次results.stat.exists == False时停止比较任务( 7z有许多文件,然后继续比较是没有意义的)
  2. 如果文件需要充气,请注册,并根据需要进行登记。
EN

Stack Overflow用户

回答已采纳

发布于 2018-12-06 09:43:56

听起来,您想要使提取任务取决于比较任务是成功还是失败,并且希望比较任务在找到不存在的文件时立即失败。

我们大部分的路都能到那里。

通常,当stat模块指向不存在的路径时,它不会触发失败。例如,下面的剧本:

代码语言:javascript
运行
复制
- hosts: localhost
  gather_facts: false
  tasks:
    - stat:
        path: /does-not-exist
      register: result

    - debug:
        var: result

产量:

代码语言:javascript
运行
复制
TASK [stat] ***********************************************************************************
ok: [localhost]

TASK [debug] **********************************************************************************
ok: [localhost] => {
    "result": {
        "changed": false,
        "failed": false,
        "stat": {
            "exists": false
        }
    }
}

Ansible为我们提供了failed_when指令,用于控制任务失败时的情况。这意味着我们可以重写您的比较任务,以便在缺少的文件上失败:

代码语言:javascript
运行
复制
- 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指令对这个任务条件进行提取:

代码语言:javascript
运行
复制
- name: Inflate 7z file if needed
  shell: 7z x {{ sz_file }}
  when: result is failed

这个解决方案的唯一问题是,当单个项导致失败时,Ansible不会退出循环,因此它将检查所有的sz_contents.stdout_lines

更新

我在irc上讨论了这个问题,@bcoca指出when是在register之前进行评估的,所以我们可以通过这样的比较任务来获得您想要的行为:

代码语言:javascript
运行
复制
- 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语句将导致跳过第一次失败后的所有循环迭代。

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53641481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档