我想使用 Ansible 仅在可以 ssh 进入的主机上运行某些任务。因此,我希望 Ansible 可以 ssh 进入我指定的所有主机。如果它可以成功 ssh 进入,则继续在这些主机上运行任务;对于无法 ssh 进入的主机,跳过其余的 play/playbook。顺便说一句,我对 Ansible 不是很有经验。
谢谢你,迈克
答案1
如果您有一个包含特定主机组(全部)任务的剧本并运行 Ansible,则 Ansible 首先尝试根据清单中的 Ansible 连接配置(通过收集事实)连接到主机。如果 Ansible 可以通过该连接类型访问主机,它会针对主机运行任务。如果它无法访问主机,服务器将进入故障状态(并且不会尝试在该机器上执行任务。
当然 - 对于该主机来说,在游戏结束时会出现错误/失败状态。
如果您不想在剧本结束时出现任何失败状态,您可以使用带有wait_for_connection
模块的简单第一个任务,注册输出并忽略任何错误。并且不收集事实。然后所有后续任务都可以检查失败输出。
- name: "Bootstrap"
hosts: all
gather_facts: false
tasks:
- name: "Check, if server can be reached"
wait_for_connection:
delay: 1
sleep: 1
ignore_errors: true
register: _bootstrap_result
- name: "Gather facts on available hosts"
setup:
when:
- "_bootstrap_result is not failed"
- name: "Run my tasks"
include_tasks: "setup.yml"
when:
- "_bootstrap_result is not failed"
如果您想在第一次连接尝试出现错误的情况下切换到其他连接类型wait_for_connection
,那么只需为故障状态下的主机设置具体事实。
- name: "Check, if server can be reached on ssh port 2222"
vars:
ansible_port: 2222
wait_for_connection:
delay: 1
sleep: 1
ignore_errors: true
register: _bootstrap2_result
when: "_bootstrap_result is failed"
当然这只是切换 SSH 端口的一个例子。
答案2
一种方法是将 moduleping
与register
和结合起来使用ignore_errors
。然后使用 moduleadd_host
构建一个新的内存主机组,并执行仅when
注册结果成功的任务。
开始新的play,使用上一步创建的内存主机组执行所有在线主机上的任务。