我有一个系统,有多个主机可用。我只需要在一台主机上运行我的Ansible剧本。但是,其中一些主机可能无法访问。让我们说我有host1,host2,host3 ......如果无法访问host1,我想让Ansible尝试host2。如果host2可以访问并且Ansible成功运行了一些bash脚本,我希望Ansible跳过其余的主机。有什么建议吗?
答案 0 :(得分:1)
这可能不是最佳解决方案,但我找不到更好的解决方案。
gather_facts
设置为False
,以完全跳过需要跳过的主机(如果您不需要收集主机事实)。serial
设置为1,因此播放手册一次完全在一台主机上播放,而不是默认的5台主机。set_fact
在播放结束时将主机事实(在示例中名为done
)设置为True
,或者如果您需要更具体的话,请使用register
condition(命令输出)。end_play
meta
,当变量设置为True
(或具有预期值,如果您使用register
)时,将对任何主机执行此操作。我使用Jinja2 template language以这种方式提取值:
for
遍历所有hostvars
(包含为广告资源中所有主机设置的所有变量的Python dict)。if
检查主持人是否将done
变量设置为True
并返回字符串True
(如果是)。default
过滤器设置默认值,如果没有为主机定义done
(这会导致错误'dict object' has no attribute 'done'
)。例如:
- hosts: all
serial: 1
gather_facts: False
tasks:
- meta: end_play
when: "{% for item in hostvars.values() %}{% if item.done|default(False) %}True{% endif %}{% endfor %}"
# The rest of the play goes here
- set_fact:
done: True
答案 1 :(得分:-1)
Ansible并不认为在设置阶段无法访问的主机列表中将丢弃那些无法访问的主机。
在剩余的主机列表中使用' run_once:yes'对于该bash脚本的特定任务。它将从可用主机中选择第一个匹配的主机。