我需要在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循环中的一个)
如果你需要将一组任务循环到一个单元,那么如果我们可以在错误处理块上使用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)