我们使用 ansible 配置一些主机,包括 IP 配置。我们不想使用 DHCP 服务器。有时我们会将新主机添加到网络。这些新主机位于一个 IP 地址范围内,而现有的生产主机位于另一个 IP 地址范围内。我们只需将新主机放入第一个网络中,然后让 ansible 配置它们、测试它们并将 IP 更改为生产范围。Ansible 通过 cron 定期运行。
但是,当没有新主机时,ansible 会报告无法访问的错误。没有新主机是常见情况。我该如何抑制这种情况或使其不那么突出?
我们的剧本基本上是这样的:
---
# configure existing hosts
- hosts: production
tasks:
- name: do regular maintenance
# ...
- hosts: new
# Does not seem to do anything
ignore_errors: True
tasks:
- name: configure freshly discovered host
# ...
- name: test freshly discovered host
# ...
- name: change ip config to production network
# ...
/etc/ansible/hosts 如下所示:
[production]
192.168.2.[11:255]
[new]
# those are firewalled
192.168.2.[1:10]
当我运行这个时我看到一个大红色
PLAY RECAP ****************************************************
192.168.2.1 : ok=0 changed=0 unreachable=1 failed=0
[...]
这让我的同事们感到困惑。
我见过这个问题,并且我认为如果我使用 ignore_errors 但不设置标志,它应该会默默地跳过无法访问的主机,但它似乎没有任何效果。
答案1
要添加这个答案:在 Ansible 2.7 中添加了一个修复程序:https://github.com/ansible/ansible/blob/stable-2.7/changelogs/CHANGELOG-v2.7.rst#major-changes
用于播放和阻止的新关键字 ignore_unreachable。允许忽略由于无法访问主机而失败的任务,并使用无法访问测试检查结果。
编辑:根据个人经验,我需要添加ignore_errors
它才能使剧本真正继续下去。
答案2
附加到您的单行 ansible |grep -A1 'rc=0'
。
这将仅显示传递的播放/
服务器。
答案3
我发现,为了让剧本“成功”(退出代码为 4,请参阅https://jwkenney.github.io/ansible-return-codes/),尽管有些主机无法访问,但您可以执行以下操作:
- name: My playbook
pre_tasks:
# for windows
- win_ping:
ignore_errors: true
# for linux
- ping:
ignore_errors: true
这将从任何后续任务或角色执行中删除未完成任务的主机。
如果您使用ignore_unreachable: true
,那么后续任务仍会为主机执行,这不是我想要的,因为它在几个变量等上失败了。
Gitlab-ci 要求这不会失败:
rc=0
ansible-playbook -i $INVENTORY $PLAYBOOK || rc=$?
if [ $rc -eq 4 -o $rc -eq 0 ]; then echo "ok"; else echo "failure"; exit 1; fi
答案4
我发现的一个方法是运行这个脚本首先针对我的 hosts 文件,然后相应地编辑列表。然后运行 Ansible 脚本。
这是一种解决方法,但仍然比一直关注 Ansible 等待它再次停止要好。