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_C
raw
模块的工作方式与
命令
模块不同!!请测试并分享您的经验。