我是golang和Vault的新人。我试图秘密存储一些价值/密钥对,然后阅读它。但对我而言,客户端创建的工作原理并不是很清楚(实际上我应该为每个操作调用它,或者我可以创建一个)。例如代码:
client, err := api.NewClient(conf)
client.SetToken(token)
c := client.Logical()
sec, err := c.Write("/secret/test/" + name,
map[string]interface{}{
"name": name,
"username": username,
"password": password,
})
完美无缺。但是每次我需要写或读某些内容时,我都很难调用NewClient
。所以我尝试为它创建init
函数。像这样:
var VClient *api.Client // global variable
func InitVault(token string) int{
conf := &api.Config{
Address: "http://127.0.0.1:8200",
}
VClient, err := api.NewClient(conf)
if err != nil {
log.Println(err)
return 0
}
VClient.SetToken(token)
return 1
}
并且,它进行初始化,但是当我尝试进行初始化时:
main (){
r := InitVault("token string")
c := VClient.Logical()
sec, err := c.Write("/secret/test/" + name,
map[string]interface{}{
"name": name,
"username": username,
"password": password,
})
}
我有一个nil指针异常。在这种情况下,没有太多的例子能够真正起作用。我错了,对于Vault的每一项操作,我都需要拨打NewClient
?正如我之前提到的那样,我觉得很奇怪,这就是为什么我决定在这里发表我的问题,很乐意得到任何答案。
祝你好运 阿图尔
答案 0 :(得分:0)
因此,如@ Volker所述,您不更新已创建的全局变量。因此,您应该拥有这样的东西。请注意,客户端是作为另一个变量创建的,然后传递给全局变量。
var VClient *api.Client // global variable
func InitVault(token string) error {
conf := &api.Config{
Address: "http://127.0.0.1:8200",
}
client, err := api.NewClient(conf)
if err != nil {
return err
}
VClient = client
VClient.SetToken(token)
return nil
}
func main() {
err := InitVault("root token")
if err != nil {
log.Println(err)
}
c := VClient.Logical()
secret, err = c.Write("kv/hi",
map[string]interface{}{
"name": name,
"username": username,
"password": password,
})
if err != nil {
log.Println(err)
}
log.Println(secret)
}