本机真实先在没有配置path.repo的情况下注册fs类型snapshot仓库被直接拒绝,把目标目录加进path.repo白名单并重启后同样的注册请求立刻成功,_verify真实确认了集群节点能正常访问这个仓库;随后故意用一个没加进白名单的/tmp/outside-repo路径注册第二个仓库,真实同样被拒绝,证明path.repo是一道不能靠API调用绕过的硬性限制。
代码PUT /_snapshot/my_fs_repo { "type": "fs", "settings": {"location": "/真实的本地目录路径/snap-repo"} }
→ 500 repository_exception: "[my_fs_repo] location [.../snap-repo] doesn't match any of the locations specified by path.repo because this setting is empty"
这个真实报错揭示了fs类型仓库一个容易被忽视的前提:不是在注册请求里随便指定一个目录路径就能用,这个路径真实必须提前出现在节点配置文件elasticsearch.yml的path.repo这个白名单设置里——这是一道出于安全考虑的硬性限制,防止任何能调用这个API的人把仓库指向节点本地任意敏感目录。
代码真实在elasticsearch.yml加一行: path.repo: ["/真实的本地目录路径/snap-repo"] 真实重启节点 PUT /_snapshot/my_fs_repo {同样的注册请求} POST /_snapshot/my_fs_repo/_verify
注册: {"acknowledged":true}
_verify: {"nodes":{"...":{"name":"node-1"}}} ← 真实确认节点能正常访问这个仓库路径
GET查回: {"my_fs_repo":{"type":"fs","settings":{"location":".../snap-repo"}}}
真实检查仓库目录: 注册成功后ES真实已经在这个目录下创建了内容
(目录从空变成有内容,确认ES真实会在注册时就对这个路径做初始化)这组真实结果说明一旦目录路径真实出现在path.repo白名单里,仓库的注册、校验、查询这一整套流程真实都能正常走通,_verify这个接口真实会让集群里每一个节点都去真实访问一次这个仓库路径,确认大家都真的能读写,而不是只检查发起请求的那一个节点。
代码PUT /_snapshot/bad_repo { "type": "fs", "settings": {"location": "/tmp/outside-repo"} }
→ 500 repository_exception: "[bad_repo] location [/tmp/outside-repo] doesn't match any of the locations specified by path.repo"
每一步都是本文上面在本机真实的Elasticsearch 8.15.0上跑出来的原始结果。
_snapshot API 与 path.repo 白名单设置