HashiCorp Vault Go 客户端库使用指南
1. 项目的目录结构及介绍
vault-client-go
是一个由 HashiCorp 开发的 Go 语言客户端库,用于与 Vault 服务器进行交互。项目目录结构如下:
api_auth.go
:包含认证相关的 API 方法。api_helpers.go
:包含一些帮助函数,用于处理 API 请求和响应。api_identity.go
:包含身份验证相关的 API 方法。api_secrets.go
:包含密钥管理相关的 API 方法。api_system.go
:包含系统级别的 API 方法。client.go
:包含客户端配置和初始化相关的代码。client_configuration.go
:包含客户端配置选项。client_option.go
:包含客户端的选项设置。client_requests.go
:包含客户端请求的构建和发送。errors.go
:包含错误处理相关的代码。replication_consistency.go
:包含复制一致性相关的代码。request_modifiers.go
:包含请求修改器,用于自定义请求。request_option.go
:包含请求选项的设置。response.go
:包含响应处理相关的代码。user_agent.go
:包含用户代理字符串相关的代码。Makefile
:包含构建项目的 makefile 文件。README.md
:项目说明文件。go.mod
:Go 依赖管理文件。go.sum
:Go 依赖校验文件。openapi.json
:OpenAPI 规范文件。
每个文件和目录都包含了项目运行所必需的代码和资源。
2. 项目的启动文件介绍
vault-client-go
的启动通常从 main.go
文件开始,以下是启动文件的简单介绍:
package main
import (
"context"
"log"
"time"
"github.com/hashicorp/vault-client-go"
"github.com/hashicorp/vault-client-go/schema"
)
func main() {
ctx := context.Background()
// 初始化客户端
client, err := vault.New(vault.WithAddress("http://127.0.0.1:8200"), vault.WithRequestTimeout(30*time.Second))
if err != nil {
log.Fatal(err)
}
// 使用 root token 进行认证(不推荐用于生产环境)
if err := client.SetToken("my-token"); err != nil {
log.Fatal(err)
}
// 写入密钥
if _, err := client.Secrets.KvV2Write(ctx, "foo", schema.KvV2WriteRequest{Data: map[string]any{"password1": "abc123", "password2": "correct horse battery staple"}}, vault.WithMountPath("secret")); err != nil {
log.Fatal(err)
}
log.Println("secret written successfully")
// 读取密钥
s, err := client.Secrets.KvV2Read(ctx, "foo", vault.WithMountPath("secret"))
if err != nil {
log.Fatal(err)
}
log.Println("secret retrieved:", s.Data.Data)
}
这段代码展示了如何创建一个 Vault 客户端实例,使用 root token 进行认证,以及如何写入和读取一个密钥。
3. 项目的配置文件介绍
vault-client-go
的配置主要通过代码进行设置,但也可以使用环境变量来加载配置。以下是一个配置文件的示例,它可以通过环境变量来设置客户端的配置:
// 设置环境变量
os.Setenv("VAULT_ADDRESS", "http://127.0.0.1:8200")
os.Setenv("VAULT_TOKEN", "my-token")
os.Setenv("VAULT_MOUNT_PATH", "secret")
// 在代码中读取环境变量
address := os.Getenv("VAULT_ADDRESS")
token := os.Getenv("VAULT_TOKEN")
mountPath := os.Getenv("VAULT_MOUNT_PATH")
// 使用环境变量中的值来配置客户端
client, err := vault.New(vault.WithAddress(address), vault.WithRequestTimeout(30*time.Second))
if err != nil {
log.Fatal(err)
}
if err := client.SetToken(token); err != nil {
log.Fatal(err)
}
通过这种方式,你可以在不修改代码的情况下,通过改变环境变量来调整客户端的行为,使得配置更加灵活。