ansible:默默跳过无法访问的主机

ansible:默默跳过无法访问的主机

我们使用 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 等待它再次停止要好。

相关内容