通过Splunk API执行搜索查询时遇连接拒绝错误求助
ConnectionRefusedError: [Errno 111] Connection refused 我尝试通过API在Splunk中执行搜索查询,参考官方文档的示例代码,在Jupyter Notebook运行时遇到了连接拒绝的错误。
我的代码如下:
from __future__ import print_function from future import standard_library standard_library.install_aliases() import urllib.request, urllib.parse, urllib.error import httplib2 from xml.dom import minidom baseurl = 'https://localhost:8089' userName = 'username' password = 'password' searchQuery = '| inputcsv foo.csv | where sourcetype=access_common | head 5' # Authenticate with server. # Disable SSL cert validation. Splunk certs are self-signed. serverContent = httplib2.Http(disable_ssl_certificate_validation=True).request(baseurl + '/services/auth/login','POST', headers={}, body=urllib.parse.urlencode({'username':userName, 'password':password}))[1] sessionKey = minidom.parseString(serverContent).getElementsByTagName('sessionKey') [0].childNodes[0].nodeValue # Remove leading and trailing whitespace from the search searchQuery = searchQuery.strip() # If the query doesn't already start with the 'search' operator or another # generating command (e.g. "| inputcsv"), then prepend "search " to it. if not (searchQuery.startswith('search') or searchQuery.startswith("|")): searchQuery = 'search ' + searchQuery print(searchQuery) # Run the search. # Again, disable SSL cert validation. print(httplib2.Http(disable_ssl_certificate_validation=True).request(baseurl + '/services/search/jobs','POST', headers={'Authorization': 'Splunk %s' % sessionKey},body=urllib.parse.urlencode({'search': searchQuery}))[1])
错误信息:
ConnectionRefusedError: [Errno 111] Connection refused
恳请各位提供帮助。
这个错误核心是你的Jupyter Notebook无法成功连接到Splunk的REST API服务,我给你梳理几个最常见的排查和修复方向:
确认Splunk服务是否正常运行
先检查你的Splunk实例是否已经启动。如果Splunk在本地机器,可以通过命令行(Linux用systemctl status splunk,Windows打开服务管理器)查看状态;如果在远程服务器,联系运维确认服务状态。没启动的话先启动Splunk再重试。检查API端口是否正确且未被拦截
Splunk默认REST API端口是8089,但如果你的Splunk修改过端口配置,那baseurl里的端口就不对了。可以去Splunk安装目录下的etc/system/local/server.conf文件,找到[httpServer]段的sslPort配置确认端口号。另外,如果是跨机器连接,要检查Splunk所在机器的防火墙是否开放了8089端口,避免连接被防火墙阻断。确认
localhost是否匹配Splunk部署位置
如果你的Splunk不是运行在Jupyter Notebook所在的本地机器上,那baseurl里的localhost就错了,得换成Splunk所在机器的实际IP地址或主机名。比如Splunk部署在192.168.1.100,就把baseurl改成https://192.168.1.100:8089。测试端口连通性
在Jupyter所在机器上用telnet localhost 8089或者curl -k https://localhost:8089/services/auth/login命令测试端口是否能连通。如果这些命令也连不上,那基本是网络或Splunk服务的问题,和代码无关;如果能连通,再回头排查代码里的认证参数是否正确。临时排查SSL配置问题(可选)
虽然你代码里禁用了SSL证书验证,但极端情况下Splunk的SSL配置异常也可能导致连接失败。可以先尝试关闭Splunk的SSL:修改server.conf里[httpServer]段的enableSplunkWebSSL为false,重启Splunk后,把baseurl改成http://localhost:8080(默认非SSL端口)试试。如果能正常连接,再针对性排查SSL证书或配置的问题。
内容的提问来源于stack exchange,提问作者DIVYA C

