Ansible yum:循环镜像,成功停止

Ansible yum: Loop over Mirrors, Stop on Succes

我最近试图在远程主机 运行 rhel 上使用 ansible 安装 rpmfusion-free repo。突然之间,服务器无法访问了。

PC 运行 ansible 在 Ubuntu 16.10 上运行:

$> ansible --version                                                                                                            
   ansible 2.2.1.0
   config file =
   configured module search path = Default w/o overrides

我决定通过使用 ansible 迭代 rpmfusion 存储库的镜像列表来解决这个问题,并使用第一个有效的,也就是循环镜像列表,并在成功时停止。

这是之前的代码:

- name: Install RPM-Fusion free
  yum:
    name: http://download1.rpmfusion.org/free/el/updates/6/i386/rpmfusion-free-release-6-1.noarch.rpm
    state: present
    disable_gpg_check: true
  become: true

这是我尝试过的:

- name: Install RPM-Fusion free
  yum:
    name: "{{ item }}"
    state: present
    disable_gpg_check: true
  become: true
  register: result
  until: result | succeeded
  retries: 4
  with_items: "{{ rpmfusion_free_mirrors }}"


rpmfusion_free_mirrors:
  - "http://download1.rpmfusion.org/free/el/updates/6/i386/rpmfusion-free-release-6-1.noarch.rpm"
  - "http://mirrors.netix.net/rpmfusion/free/el/rpmfusion-free-release-6.noarch.rpm"
  - "http://ftp-stud.hs-esslingen.de/pub/Mirrors/rpmfusion.org/free/el/rpmfusion-free-release-6.noarch.rpm"
  - "http://mirror.de.leaseweb.net/rpmfusion/free/el/rpmfusion-free-release-6.noarch.rpm"

正如您可能已经猜到的那样,此操作失败并输出:

FAILED - RETRYING: TASK: install-backend-rpms : Install RPM-Fusion free (4 retries left). FAILED - RETRYING: TASK: install-backend-rpms : Install RPM-Fusion free (3 retries left). FAILED - RETRYING: TASK: install-backend-rpms : Install RPM-Fusion free (2 retries left). FAILED - RETRYING: TASK: install-backend-rpms : Install RPM-Fusion free (1 retries left). failed: [backend_ans_test] (item=[u'http://download1.rpmfusion.org/free/el/updates/6/i386/rpmfusion-free-release-6-1.noarch.rpm', u'http://mirrors.netix.net/rpmfusion/free/ el/rpmfusion-free-release-6.noarch.rpm', u'http://ftp-stud.hs-esslingen.de/pub/Mirrors/rpmfusion.org/free/el/rpmfusion-free-release-6.noarch.rpm', u'http://mirror.de.leasew eb.net/rpmfusion/free/el/rpmfusion-free-release-6.noarch.rpm']) => {"attempts": 4, "failed": true, "item": ["http://download1.rpmfusion.org/free/el/updates/6/i386/rpmfusion -free-release-6-1.noarch.rpm", "http://mirrors.netix.net/rpmfusion/free/el/rpmfusion-free-release-6.noarch.rpm", "http://ftp-stud.hs-esslingen.de/pub/Mirrors/rpmfusion.org/ free/el/rpmfusion-free-release-6.noarch.rpm", "http://mirror.de.leaseweb.net/rpmfusion/free/el/rpmfusion-free-release-6.noarch.rpm"], "msg": "Failure downloading http://dow nload1.rpmfusion.org/free/el/updates/6/i386/rpmfusion-free-release-6-1.noarch.rpm, 'NoneType' object has no attribute 'read'"}

在我看来,当其中一个镜像不可访问时,ansible 认为任务失败了。但是,我希望 ansible 通过镜子并停止循环,直到其中一个成功。

我偶然发现了 2014 年的 google-groups 线程 (GoogleGroups),指出这根本行不通。你们有谁知道,如果现在有这样的功能,或者我是否可以用不同的方式实现一些类似的功能?

提前致以最良好的祝愿和感谢!

由于 Ansible 将评估每次循环迭代的状态,您应该添加:

failed_when: false

ignore_errors: true

但是 Ansible 总是会继续下一个任务,所以如果你想在所有镜像都失败的情况下中断流程,你应该添加另一个来检查 result

晚了两年,但我也在为类似的事情苦苦挣扎,所以我把我的答案留在这里以供将来参考。

我相信您正在寻找这样的东西:

- name: Install RPM-Fusion free
  yum:
    name: "{{ item }}"
    state: present
    disable_gpg_check: true
  become: true
  register: result
  when: result is undefined or result.failed
  with_items: "{{ rpmfusion_free_mirrors }}"

如果没有弃用警告,我无法让 Ocab19 的解决方案工作:

[弃用警告]:不推荐在通过 squash_actions 使用循环时仅调用一次 "yum"。而不是使用 提供多个项目并指定 name: "{{ item }}" 的循环,请使用 name: ... 并删除循环。 此功能将在 2.11 版本中删除。可以通过设置禁用弃用警告 deprecation_warnings=在 ansible.cfg 中为假。

但是我看不出如何实现相同的行为post弃用。

所以我尝试从每个来源下载,然后在成功下载后安装:

# download the source if it's not in the images mount
 - name: grab RPM-fusion repo image
   get_url:
     url: "https://download1.rpmfusion.org/free/el/rpmfusion-free-release-7.noarch.rpm"
     dest: /misc/images/rpmfusion-free-release-7.noarch.rpm
     force: no
   ignore_errors: true

 - name: grab RPM-fusion repo image from alternate source
   get_url:
     url: "http://mirror.math.princeton.edu/pub/rpmfusion/free/el/rpmfusion-free-release-7.noarch.rpm"
     dest: /misc/images/rpmfusion-free-release-7.noarch.rpm
     force: no
   ignore_errors: true

 - name: Install RPM-Fusion free for vlc
   yum: 
     name: /misc/images/rpmfusion-free-release-7.noarch.rpm
     state: present