Ssh 如何在ansible中检测无法访问的目标主机
如果一个目标主机Ssh 如何在ansible中检测无法访问的目标主机,ssh,ansible,runtime-error,host,Ssh,Ansible,Runtime Error,Host,如果一个目标主机所有\u主机都可访问或不可访问,我希望获取一个变量sshreachable 我也为此写了下面的剧本 - name: Play 3- check telnet nodes hosts: localhost ignore_unreachable: yes - name: Check all port numbers are accessible from current host include_tasks: innertelnet.yml wi
所有\u主机都可访问或不可访问,我希望获取一个变量sshreachable
我也为此写了下面的剧本
- name: Play 3- check telnet nodes
hosts: localhost
ignore_unreachable: yes
- name: Check all port numbers are accessible from current host
include_tasks: innertelnet.yml
with_items: "{{ groups['all_hosts'] }}"
cat innertelnet.yml
---
- name: Check ssh connectivity
block:
- raw: "ssh -o BatchMode=yes root@{{ item }} echo success"
ignore_errors: yes
register: sshcheck
- debug:
msg: "SSHCHECK variable:{{ sshcheck }}"
- set_fact:
sshreachable: 'SSH SUCCESS'
when: sshcheck.unreachable == 'false'
- set_fact:
sshreachable: 'SSH FAILED'
when: sshcheck.unreachable == 'true'
- debug:
msg: "INNERSSH1: {{ sshreachable }}"
不幸的是,我得到如下错误:
输出:
TASK [raw] *********************************************************************
fatal: [localhost]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: Shared connection to 10.9.9.126 closed.", "skip_reason": "Host localhost is unreachable", "unreachable": true}
TASK [debug] ***********************************************************************************************************************************************************
task path:
ok: [localhost] => {
"msg": "SSHCHECK variable:{'msg': u'Failed to connect to the host via ssh: Shared connection to 10.9.9.126 closed.', 'unreachable': True, 'changed': False}"
}
TASK [set_fact] ****************************************************************
skipping: [localhost]
TASK [set_fact] ****************************************************************
skipping: [localhost]
TASK [debug] *******************************************************************
fatal: [localhost]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'sshreachable' is undefined\n\nThe error appears to be in '/app/playbook/checkssh/innertelnet.yml': line 45, column 10, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n - debug:\n ^ here\n"}
PLAY RECAP *********************************************************************
10.0.116.194 : ok=101 changed=1 unreachable=9 failed=0 skipped=12 rescued=0 ignored=95
localhost : ok=5 changed=0 unreachable=1 failed=1 skipped=4 rescued=0 ignored=0
您能建议对我的代码进行更改以使其正常工作吗?当:
条件不匹配时,错误似乎表明sshreachable
变量未设置为。例如,sshcheck.unreachable
可能不是raw
返回的内容
为此,命令
模块应该足够了,我们可以评估命令的返回代码以设置事实
你可以这样做:
-块:
-命令:ssh-o BatchMode=yesuser@host1呼应成功
忽略错误:是
寄存器:sshcheck
-设定事实:
sshreachable:“{{sshcheck is success}”
-调试:
msg:“Host1可访问:{{sshreachable | string}}”
更新:
raw
模块的工作方式似乎相同。示例(包括@mdaniel的宝贵输入):
-块:
-raw:ssh-o BatchMode=yesuser@host1呼应成功
忽略错误:是
寄存器:sshcheck
-设定事实:
sshreachable:SSH成功
何时:sshcheck表示成功
-设定事实:
SSHRACHABLE:SSH失败
当:sshcheck失败时
-调试:
msg:“Host1可访问:{{sshreachable}}”
您的逻辑有故障。sshcheck
变量没有可供决定的unreachable
或reachable
属性。添加调试任务以在raw
命令成功或失败时检查变量,您将对此进行确认。然后,您将能够决定使用哪些字段来确定主机是否启动或关闭,以及是否仍要继续使用当前代码。我可能会考虑使用wait\u for
任务,将delegate\u委托给
本地主机,为您想要的所有服务器循环,以及您希望运行的服务(ssh/telnet)。不过,为了修复代码的逻辑,在我看来,当sshreachable
未定义时,您可以决定服务器关闭。我实际上想知道您是否需要该模块,我经常使用该模块测试主机是否可访问(例如,等待云实例启动)在尝试对其运行任务之前。我已经添加了调试,并在原始更新后共享了输出亲爱的@ilias spI,出于日志记录的目的,我需要它。在自动化运行时,Ansible server的目标服务器ssh连接是否成功或失败@larsk(及其is success
friend)是这方面的首选语法,也缩写为-set\u fact:sshreachable:“{{{sshcheck is success}}”
@mdaniel Seshadri\u您的两个解决方案都有效!!但仅使用命令
模块,该模块对目标主机具有python依赖性。请使用raw
模块来解决这个问题,也就是说,没有python依赖关系???@Ashar,我相信raw
的工作方式是相同的。我会更新答案@mdaniel-谢谢你的好提示!使用raw
模块的解决方案失败->当:ssh不可访问时
成功->当:not ssh不可访问时
在这种情况下@Seshadri_Craw
模块的工作方式与命令
模块不同!!请测试并分享您的经验。