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
我最近试图在远程主机 运行 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