【问题标题】:Ansible yum: Loop over Mirrors, Stop on SuccesAnsible yum:循环镜像,成功时停止
【发布时间】:2017-02-02 12:29:58
【问题描述】:

我最近尝试在运行 rhel 的远程主机上安装带有 ansible 的无 rpmfusion 存储库。突然之间,服务器无法访问了。

运行 ansible 的 PC 在 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"

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

失败 - 重试:任务:install-backend-rpms:免费安装 RPM-Fusion(还剩 4 次重试)。 失败 - 重试:任务:install-backend-rpms:免费安装 RPM-Fusion(还剩 3 次重试)。 失败 - 重试:任务:install-backend-rpms:免费安装 RPM-Fusion(还剩 2 次重试)。 失败 - 重试:任务:install-backend-rpms:免费安装 RPM-Fusion(还剩 1 次重试)。 失败:[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": "下载失败http://dow nload1.rpmfusion.org/free/el/updates/6/i386/rpmfusion-free-release-6-1.noarch.rpm, 'NoneType' 对象没有属性 'read'"}

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

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

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

【问题讨论】:

    标签: ansible ansible-2.x


    【解决方案1】:

    晚了两年,但我遇到了类似的问题,所以我将答案留在这里以供将来参考。

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

    - 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 }}"
    

    【讨论】:

      【解决方案2】:

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

      failed_when: false
      

      ignore_errors: true
      

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

      【讨论】:

        【解决方案3】:

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

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

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

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

        # 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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-01-11
          • 1970-01-01
          • 2020-03-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-19
          • 2015-03-18
          相关资源
          最近更新 更多