如何使用Ansible检查服务器列表的SSH连接权限
解决Ansible检查SSH连通性的方案
一、替代check_ssh模块的可行方法
Ansible并没有专门的check_ssh模块,以下两种方法可以直接实现SSH连通性检查:
方法1:优化现有ping模块方案
ping模块依赖SSH连接成功才能执行,因此可以用它间接验证SSH连通性,同时修正你现有playbook的逻辑错误:
- 原playbook存在表头重复写入、条件判断逻辑错误、
delegate_to格式问题 - 优化后版本:
--- - name: 检查SSH连通性并生成CSV报告 hosts: all gather_facts: no # 关闭事实收集,提升执行速度 tasks: - name: 测试目标主机SSH可达性 ansible.builtin.ping: register: test_ssh ignore_unreachable: true - name: 初始化CSV文件(仅当文件不存在时创建) ansible.builtin.file: path: /home/list.csv state: touch mode: '0644' delegate_to: localhost run_once: true # 仅执行一次,避免多主机重复操作 - name: 写入CSV表头(仅当文件为空时) ansible.builtin.lineinfile: dest: /home/list.csv line: "Server;access" state: present insertbefore: BOF delegate_to: localhost run_once: true when: lookup('file', '/home/list.csv') | length == 0 - name: 记录SSH连通成功的主机 ansible.builtin.lineinfile: dest: /home/list.csv line: "{{ inventory_hostname }};OK" state: present delegate_to: localhost when: test_ssh is successful - name: 记录SSH连通失败的主机 ansible.builtin.lineinfile: dest: /home/list.csv line: "{{ inventory_hostname }};KO" state: present delegate_to: localhost when: test_ssh.unreachable is defined and test_ssh.unreachable
方法2:直接用command模块执行SSH测试
如果想跳过目标主机的Python环境依赖,直接在master上执行SSH命令测试:
--- - name: 直接测试SSH连通性 hosts: all gather_facts: no tasks: - name: 执行SSH连接测试 ansible.builtin.command: ssh -o ConnectTimeout=3 -o StrictHostKeyChecking=no {{ inventory_hostname }} exit 0 register: ssh_test ignore_errors: true delegate_to: localhost # 在master本地执行SSH命令 - name: 生成CSV记录 ansible.builtin.lineinfile: dest: /home/list.csv line: "{{ inventory_hostname }};{{ 'OK' if ssh_test.rc == 0 else 'KO' }}" state: present delegate_to: localhost
二、关于ansible.builtin.ssh的说明
ansible.builtin.ssh是Ansible的连接插件,用于定义Ansible通过SSH连接目标主机的方式,并非可在tasks中调用的任务模块,因此无法直接用于连通性测试。
内容的提问来源于stack exchange,提问作者anthony tarenta
相关产品推荐
相关产品推荐

