【问题标题】:Ansible: ignoring errors in a loopAnsible:忽略循环中的错误
【发布时间】:2018-04-10 14:12:57
【问题描述】:

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

 - vars:
      pkgs:
         - there_1
         - not_there_1
         - there_2
           ...

但我也想通过一个单一的剧本来管理它们。所以我不能把它们都粘在一个地方

yum: state=latest name="{{pkgs}}"

因为缺少包会弄乱事务,因此没有安装任何东西。

但是,明显(且缓慢)的逐个安装也失败了,因为第一个丢失的包将整个循环吹出水面,因此:

  - name Packages after not_there_1 are not installed
    yum: state=latest name="{{item}}" 
    ignore_errors: yes
    with_items: "{{ pkgs  }}"

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

【问题讨论】:

  • 似乎是一个糟糕的设计。您的系统应该处于理想状态,而不是“尝试去做,但我不在乎”。
  • @KonstantinSuvorov:期望的状态是“安装了 php 和支持包”。但是,如果 php 版本是 5.6(我的一些盒子需要它),我需要拉入 mcrypt 和 pecl-mcache;这些在 7.2 中不存在(见图)。我可以根据版本(最终根据操作系统版本)来判断这些东西,但它让我觉得这是不必要的拖累。

标签: linux ansible yum


【解决方案1】:

如果您需要以一个单元循环一组任务,那么如果我们可以在错误处理块上使用 with_items 那就太好了,对吧?

在该功能出现之前,您可以使用 include_tasks 和 with_items 完成同样的事情。这样做应该允许一个块来处理失败的包,或者如果你愿意,你甚至可以在子任务中包含一些检查和包安装。

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

子任务.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 }}" 

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

  - name: Install all packages ignoring errors
    include_tasks: Sub-Tasks.yml 
    vars:
      package_name: "{{ item }}"
    with_items:
      - "{{ pkgs }}"

【讨论】:

  • 对。那是我的(不祥的)感觉。 Ansible 一定是我用过的最脆弱但同时也是最方便的管理工具。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
  • 1970-01-01
  • 1970-01-01
  • 2022-12-28
  • 2014-06-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多