Ansible:忽略循环中的错误

Ali*_*orm 2 linux yum ansible

我需要在linux机器上安装一些软件包.由于各种原因,一些(少数)软件包可能会丢失(操作系统版本,基本上)

 - vars:
      pkgs:
         - there_1
         - not_there_1
         - there_2
           ...
Run Code Online (Sandbox Code Playgroud)

但我也希望从一本剧本中管理它们.所以我不能把它们全部集中在一起

yum: state=latest name="{{pkgs}}"
Run Code Online (Sandbox Code Playgroud)

因为丢失的包会弄乱事务,所以什么也没有安装.

然而,明显(和缓慢)一个一个安装也失败了,因为第一个丢失的包将整个循环从水中吹出,因此:

  - name Packages after not_there_1 are not installed
    yum: state=latest name="{{item}}" 
    ignore_errors: yes
    with_items: "{{ pkgs  }}"
Run Code Online (Sandbox Code Playgroud)

有没有办法忽略循环中的错误,以便所有项目都有机会?(即安装错误表现为continue循环中的一个)

Tj *_*lie 5

如果你需要将一组任务循环到一个单元,那么如果我们可以在错误处理块上使用with_items就可以了吗?

在该功能出现之前,您可以使用include_tasks和with_items完成相同的操作.这样做应该允许块处理失败的包,或者如果需要,甚至可以在子任务中包含一些检查和包安装.

首先设置sub-tasks.yml以包含您的安装任务:

子Tasks.yml

  - name: Install package and handle errors
    block:
      - name Install package
        yum: state=latest name="{{ package_name }}"
    rescue:
      - debug:
          msg: "I caught an error with {{ package_name }}" 
Run Code Online (Sandbox Code Playgroud)

然后你的剧本将设置这些任务的循环:

  - name: Install all packages ignoring errors
    include_tasks: Sub-Tasks.yml 
    vars:
      package_name: "{{ item }}"
    with_items:
      - "{{ pkgs }}"
Run Code Online (Sandbox Code Playgroud)

  • 对.那是我(不祥)的感觉.Ansible必须是我用过的最脆弱但同时最方便的管理工具. (2认同)