Chef中SFTP远程文件下载功能异常,请求排查解决
解决Chef remote_file SFTP下载的两类常见问题
我来帮你梳理下遇到的这两个问题,给你对应的解决方案和排查思路:
第一个错误:SocketError - getaddrinfo: No such host is known.
这个报错本质是Chef节点没法找到packages.domain.com这个主机,大概率是下面两种情况之一:
- 主机名解析失败:先在Chef节点上手动ping一下
packages.domain.com,看能不能得到IP地址。如果ping不通,要么是DNS配置有问题,要么是这个主机名本身就不对,试试直接用服务器的IP地址替换主机名再测试。 - SFTP URI格式小问题:虽然你写的端口22是SFTP默认端口,但有时候Chef对URI的解析会因为多余的端口号出小问题,你可以先去掉
:22试试,简化成sftp://myusername:mypassword@packages.domain.com/package/Adnet.EASS.zip。另外如果用户名或密码里有特殊字符(比如@、/这类),必须要做URL编码,不然会破坏URI结构。
第二个错误:"no userinfo provided in the sftp URI"
这里要注意:Chef的remote_file资源不支持用remote_user和remote_password这两个参数来传递SFTP的凭据,这俩参数是给HTTP/HTTPS的基础认证用的,SFTP不认。
正确的做法:把凭据嵌入SFTP URI
如果你的用户名和密码都是普通字符(没有特殊符号),直接写在URI里就行,就像你最开始的写法,但要先解决前面的主机解析问题:
remote_file 'C:/adnet/mercury_package/Adnet.EASS.zip' do source 'sftp://myusername:mypassword@packages.domain.com/package/Adnet.EASS.zip' action :create end
要是密码里有特殊字符,比如密码是my@pass/123,得把特殊字符URL编码:@换成%40,/换成%2F,变成sftp://myusername:my%40pass%2F123@packages.domain.com/package/Adnet.EASS.zip。
更安全的方案:用SSH密钥认证
硬写密码在代码里太不安全了,推荐用SSH密钥对来做SFTP认证:
- 先生成一对SSH密钥(Windows可以用PuTTYgen,Linux/macOS用
ssh-keygen),把公钥上传到SFTP服务器的~/.ssh/authorized_keys文件里。 - 修改Chef代码,指定私钥路径:
remote_file 'C:/adnet/mercury_package/Adnet.EASS.zip' do source 'sftp://packages.domain.com/package/Adnet.EASS.zip' ssh_options keys: ['C:/path/to/your/private_key'] action :create end
如果私钥设置了密码短语,再加个passphrase参数就行:
remote_file 'C:/adnet/mercury_package/Adnet.EASS.zip' do source 'sftp://packages.domain.com/package/Adnet.EASS.zip' ssh_options keys: ['C:/path/to/your/private_key'], passphrase: 'your_key_passphrase' action :create end
额外的排查小技巧
在Chef代码跑之前,先手动在节点上测试SFTP连接是否正常:
- Windows可以用PSFTP工具,输入
psftp myusername@packages.domain.com,输入密码看能不能连上。 - Linux/macOS直接在终端敲
sftp myusername@packages.domain.com测试。
同时也要确认节点的防火墙或安全组允许对外访问22端口,不然也会连不上。
内容的提问来源于stack exchange,提问作者Janjko
相关产品推荐
相关产品推荐

