在golang

时间:2017-11-14 08:50:46

标签: go hashicorp-vault

我是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?正如我之前提到的那样,我觉得很奇怪,这就是为什么我决定在这里发表我的问题,很乐意得到任何答案。

祝你好运 阿图尔

1 个答案:

答案 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)
}