基本上可以通过 SSH 隧道调用 Openstack API 端点,而无需任何公共可访问的 API 端点。因为我没有使用 .NET 核心框架的经验,所以这个答案在没有 C# 代码的情况下是非常通用的。无论如何,我希望它对你有所帮助。
重要提示:您只能使用以下步骤,当您拥有 openstack-deployment 的管理员登录名并且您应该只使用!!!使用这种方式,当 openstack-deployment 是 test-deployment 时,中断部署不会影响其他用户。
1。 SSH 隧道
您可以使用以下命令转发端口:
ssh -L 127.0.0.1:<PORT>:<IP_REMOTE>:<PORT> <USER_JUMPHOST>@<IP_JUMPHOST> -fN
-
<PORT> = 您要远程访问的 Openstack-Component 的端口(例如 keystone 为 5000)
-
<IP_REMOTE> = 运行 openstack 部署的主机 IP
-
<USER_JUMPHOST>@<IP_JUMPHOST> = ssh 访问跳转主机,它位于您和您的 openstack 部署之间
这必须为每个 openstack 组件完成。如果您不希望在 backgroup 中使用此命令,请删除末尾的 -fN。
这里首先你必须用端口5000转发Keystone。
例如:ssh -L 127.0.0.1:5000:192.168.62.1:5000 deployer@192.168.67.1 -fN
您可以通过本地电脑上的 curl 或 webbrowser 测试访问:
curl http://127.0.0.1:5000
{"versions": {"values": [{"id": "v3.13", "status": "stable", "updated": "2019-07-19T00:00:00Z", "links": [{"rel": "self", "href": "http://127.0.0.1:5000/v3/"}], "media-types": [{"base": "application/json", "type": "application/vnd.openstack.identity-v3+json"}]}]}}
2。更改 openstack-endpoints
为了还能够通过隧道登录 openstack 部署,您必须更改端点以监听远程系统上的 localhost,您的 openstack 部署在哪里:
-
以管理员用户身份在您的 openstack 部署中正常登录。
-
列出所有端点:openstack endpoint list
-
将keystone的public和internal-endpoint改为localhost:
openstack endpoint set --url http://127.0.0.1:5000 <ID_OF_INTERNAL_KEYSTONE_ENDPOINT>
更改内部端点后,它会暂时破坏远程系统上的 openstack-login,但不要担心。
-
现在您可以从本地电脑通过 openstack-client 登录到 openstack。在这里,您必须对本地主机进行授权。如果使用 rc-file 登录,则必须将 auth-url 更改为 export OS_AUTH_URL=http://127.0.0.1:5000/v3
-
通过在本地电脑上运行 openstack endpoint set --url "http://127.0.0.1:8774/v2.1" <ID> 来更改 nova 端点,为 nova 的 internal 和 public 端点通过你的 ssh-tunnel 运行像 openstack server list 这样的命令(当然你还需要一个 ssh-tunnel对于端口 8774) 来执行此操作。
3。对 openstack-deployment 进行授权
当您在没有 openstack-client 的情况下发送 HTTP-Requests 时,您必须手动从部署中请求身份验证令牌:
-
在您的 openstack 部署上正常登录
-
发出令牌请求:
curl -v -s -X POST "$OS_AUTH_URL/auth/tokens?nocatalog" -H "Content-Type: application/json" -d '{ "auth": { "identity": { "methods": ["password"],"password": {"user": {"domain": {"name": "'"$OS_USER_DOMAIN_NAME"'"},"name": "'"$OS_USERNAME"'", "password": "'"$OS_PASSWORD"'"} } }, "scope": { "project": { "domain": { "name": "'"$OS_PROJECT_DOMAIN_NAME"'" }, "name": "'"$OS_PROJECT_NAME"'" } } }}' --stderr - | grep X-Subject-Token
此命令无需更改即可使用。 Key X-Subject-Token 后面的 Value 是来自 Keystone 的 token。复制此值并将令牌导出为环境变量OS_TOKEN。比如下面这行
export OS_TOKEN=gAAAAABZuj0GZ6g05tKJ0hvihAKXNJgzfoT4TSCgR7cgWaKvIvbD66StJK6cS3FqzR2DosmqofnR_N-HztJXUcVhwF04HQsY9CBqQC7pblGnNIDWCXxnJiCH_jc4W-uMPNA6FBK9TT27vE5q5AIa487GcLLkeJxdchXiDJvw6wHty680eJx3kL4
- 使用令牌发出请求。
例如带有 curl 的 GET 请求:
curl -s -X GET -H "X-Auth-Token: $OS_TOKEN" http://127.0.0.1:5000/v3/users | python -m json.tool