如何通过http(s)接口方式获取Rancher的[Api & Keys]
PS:本文rancher版本为v2.4.10
在某些情况下,我们可能会制作k3(8)s+rancher+app的shell安装脚本来进行全套软件的安装(或其他目的的脚本)。
有时候,我们在安装好rancher以后,希望继续处理一些其他的工作,而且这个时候我们希望通过rancher cli
或者直接用api/v3
的http接口获取一些东西,就会要求提供Api & Keys
。
我们知道,可以在rancher ui中,通过
得到
但是,这就要求shell安装过程(或其他目的过程)中,必须人工去操作界面,这不符合我们的需求。
Q:那么如何获取到API & Keys
呢?
A:我们可以先获取到rancher的用户名密码,然后通过模仿ui的接口操作来进行处理,也就是通过POST请求来创建并得到这个数据。
下面开始具体步骤:
1、创建默认用户密码
我们知道,如果不进行任何处理,rancher的ui登录密码是一个随机的密码,这就导致了获取密码的难度(有办法,但是太曲折)。
具体办法如下:
在rancher的环境变量中增加:
CATTLE_BOOTSTRAP_PASSWORD=password
至于具体情况是用docker还是helm,就看自己的选择了,docker呢,就-e就好了,如果是用helm通过yaml渲染安装,那就改yaml中的env部分
2、通过ui的登录接口登录,并且获取到Cookie
我们可以通过
curl -i -k -X POST -d '{"username":"admin","password":"{第一步创建的密码}","description":"UI Session","responseType":"cookie","ttl":57600000,"labels":{"ui-session":"true"}}' 'https://{rancher地址}/v3-public/localProviders/local?action=login'
来登录(如果是2.4以上的版本,也可以去浏览器F12看一下登录地址即可)
如果一切正常,会得到一个返回:
HTTP/1.1 200 OK
Set-Cookie: R_SESS=token-q6spl:6rd49xgm9hcvr4854r2mkn5664lsb8zl4svl7nknqmp9cpzz566kd6; Path=/; HttpOnly; Secure
X-Content-Type-Options: nosniff
Date: Thu, 18 Jan 2024 03:04:56 GMT
Content-Length: 0
这里面的
R_SESS=token-q6spl:6rd49xgm9hcvr4854r2mkn5664lsb8zl4svl7nknqmp9cpzz566kd6
就是我们需要的内容
3、使用上述Cookie,完成Api & Keys的创建,然后通过返回值获取
我们在拿到Cookie以后,就可以通过创建接口来进行创建,它会返回创建好的数据
curl -i -k -X POST -H "Cookie: R_SESS=token-q6spl:6rd49xgm9hcvr4854r2mkn5664lsb8zl4svl7nknqmp9cpzz566kd6;" -H "content-type: application/json" -d '{"current":false,"enabled":true,"expired":false,"isDerived":false,"ttl":0,"type":"token","description":"{密钥的名字}"}' https://{rancher地址}/v3/token
通过以上接口,我们就能创建并获取到数据
返回样例如下
{
"authProvider":"local",
"baseType":"token",
"clusterId":null,
"created":"2024-01-18T07:56:53Z",
"createdTS":1705564613000,
"creatorId":null,
"current":false,
"description":"wangxi",
"enabled":true,
"expired":false,
"expiresAt":"",
"groupPrincipals":null,
"id":"token-nbbsd",
"isDerived":true,
"labels":{
"authn.management.cattle.io/token-userId":"user-t67gl",
"cattle.io/creator":"norman"
},
"lastUpdateTime":"",
"links":{
"remove":"https://172.16.148.2:38080/v3/tokens/token-nbbsd",
"self":"https://172.16.148.2:38080/v3/tokens/token-nbbsd",
"update":"https://172.16.148.2:38080/v3/tokens/token-nbbsd"
},
"name":"token-nbbsd",
"token":"token-nbbsd:4gbdwxk7hdcbm4swp64xpv8qdqv2q5fnw2zd2v4cr2nqsrdhkqc5wf",
"ttl":0,
"type":"token",
"userId":"user-t67gl",
"userPrincipal":"map[displayName:Default Admin loginName:admin me:true metadata:map[creationTimestamp:\u003cnil\u003e name:local://user-t67gl] principalType:user provider:local]",
"uuid":"c01c6050-b591-4ffa-b179-e5484124f459"
}
我们最终需要得到就是“token”这个字段中的内容
接下来,就可以用这个apikey来进行处理了,比如使用rancher cli进行登录
rancher login --token "token-nbbsd:4gbdwxk7hdcbm4swp64xpv8qdqv2q5fnw2zd2v4cr2nqsrdhkqc5wf" xxxxxx