我是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,
})
}
我得到了一个空指针异常。在这种情况下,没有太多的例子可以真正起到帮助作用。我错了吗?对于Vault的每个操作,我都需要调用NewClient
?正如我之前提到的,它对我来说看起来很奇怪,这就是为什么我决定在这里发布我的问题,将很高兴得到任何答案。
致最好的问候
发布于 2018-10-23 03:48:57
因此,正如@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)
}
https://stackoverflow.com/questions/47281295
复制相似问题