golang实现Vault文件夹操作功能的CLI和API插件库vaku的使用
Golang实现Vault文件夹操作功能的CLI和API插件库vaku的使用
Vaku简介
Vaku是一个CLI和API工具,用于在Vault Key/Value秘密引擎上执行路径和文件夹操作。Vaku扩展了现有的Vault CLI和API功能,允许您对文件夹执行相同的基于路径的列表/读取/写入/删除操作。Vaku还允许您搜索、复制和移动秘密和文件夹。
安装方法
Homebrew安装
brew install lingrino/tap/vaku
Scoop安装
scoop bucket add vaku https://github.com/lingrino/scoop-vaku.git
scoop install vaku
Docker安装
docker run ghcr.io/lingrino/vaku --help
二进制安装
从发布页面下载适合您操作系统/架构的最新二进制文件或deb/rpm包。
使用示例
CLI使用
Vaku CLI文档可以通过命令行使用vaku help [cmd]
或vaku [cmd] --help
查看。
API使用
以下是使用Vaku API的Golang示例代码:
package main
import (
"context"
"fmt"
"log"
"github.com/hashicorp/vault/api"
"github.com/lingrino/vaku/v2/api"
)
func main() {
// 创建标准Vault客户端
vaultClient, err := api.NewClient(api.DefaultConfig())
if err != nil {
log.Fatal(err)
}
// 创建Vaku客户端
vakuClient := vaku.NewClient()
vakuClient.Client = vaultClient
// 示例1: 列出文件夹中的所有路径
ctx := context.Background()
paths, err := vakuClient.PathList(ctx, "secret/data/path/to/folder")
if err != nil {
log.Fatal(err)
}
fmt.Printf("Paths in folder: %v\n", paths)
// 示例2: 读取文件夹中的所有秘密
secrets, err := vakuClient.FolderRead(ctx, "secret/data/path/to/folder")
if err != nil {
log.Fatal(err)
}
fmt.Printf("Secrets in folder: %v\n", secrets)
// 示例3: 复制文件夹
err = vakuClient.FolderCopy(ctx, "secret/data/source/folder", "secret/data/dest/folder")
if err != nil {
log.Fatal(err)
}
fmt.Println("Folder copied successfully")
}
测试
Vaku有完善的测试,仅使用标准的Go测试工具:
$ go test -cover -race ./...
ok github.com/lingrino/vaku/v2 0.095s coverage: 100.0% of statements
ok github.com/lingrino/vaku/v2/api 12.065s coverage: 100.0% of statements
ok github.com/lingrino/vaku/v2/cmd 0.168s coverage: 100.0% of statements
贡献
欢迎任何形式的建议和贡献!如果您希望在Vaku中看到某些功能,请提交Issue或Pull Request。
Vaku提供了强大的文件夹操作功能,扩展了标准Vault CLI/API的能力,使秘密管理更加高效和灵活。
更多关于golang实现Vault文件夹操作功能的CLI和API插件库vaku的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang实现Vault文件夹操作功能的CLI和API插件库vaku的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
使用vaku实现Vault文件夹操作的Golang CLI和API插件库
vaku是一个用于HashiCorp Vault的Golang库,专门用于处理Vault中的文件夹操作。它提供了一套简洁的API来执行批量操作,如复制、移动、删除文件夹等。
安装vaku
go get github.com/lingrino/vaku/v2
基本使用示例
1. 初始化vaku客户端
package main
import (
"context"
"fmt"
"log"
"github.com/hashicorp/vault/api"
"github.com/lingrino/vaku/v2"
)
func main() {
// 创建标准Vault客户端
vaultClient, err := api.NewClient(api.DefaultConfig())
if err != nil {
log.Fatal(err)
}
// 使用Vault客户端创建vaku客户端
vakuClient := vaku.NewClient(vaultClient)
// 设置上下文
ctx := context.Background()
// 现在可以使用vakuClient执行操作...
}
2. 文件夹操作示例
列出文件夹内容
func listFolder(vakuClient *vaku.Client, path string) {
entries, err := vakuClient.PathList(ctx, path)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Contents of %s:\n", path)
for _, entry := range entries {
fmt.Println(entry)
}
}
复制文件夹
func copyFolder(vakuClient *vaku.Client, src, dst string) {
err := vakuClient.PathCopy(ctx, src, dst)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Successfully copied %s to %s\n", src, dst)
}
移动文件夹
func moveFolder(vakuClient *vaku.Client, src, dst string) {
err := vakuClient.PathMove(ctx, src, dst)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Successfully moved %s to %s\n", src, dst)
}
删除文件夹
func deleteFolder(vakuClient *vaku.Client, path string) {
err := vakuClient.PathDelete(ctx, path)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Successfully deleted %s\n", path)
}
3. 构建CLI工具
下面是一个简单的CLI工具示例,使用cobra库:
package main
import (
"fmt"
"log"
"os"
"github.com/hashicorp/vault/api"
"github.com/lingrino/vaku/v2"
"github.com/spf13/cobra"
)
var (
vakuClient *vaku.Client
ctx = context.Background()
)
func main() {
// 初始化Vault客户端
vaultClient, err := api.NewClient(api.DefaultConfig())
if err != nil {
log.Fatal(err)
}
vakuClient = vaku.NewClient(vaultClient)
var rootCmd = &cobra.Command{Use: "vakutool"}
// 列出命令
var listCmd = &cobra.Command{
Use: "list [path]",
Short: "List contents of a Vault path",
Args: cobra.ExactArgs(1),
Run: func(cmd *cobra.Command, args []string) {
listFolder(args[0])
},
}
// 复制命令
var copyCmd = &cobra.Command{
Use: "copy [src] [dst]",
Short: "Copy a Vault path",
Args: cobra.ExactArgs(2),
Run: func(cmd *cobra.Command, args []string) {
copyFolder(args[0], args[1])
},
}
// 添加子命令
rootCmd.AddCommand(listCmd, copyCmd)
// 执行命令
if err := rootCmd.Execute(); err != nil {
fmt.Println(err)
os.Exit(1)
}
}
func listFolder(path string) {
entries, err := vakuClient.PathList(ctx, path)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Contents of %s:\n", path)
for _, entry := range entries {
fmt.Println(entry)
}
}
func copyFolder(src, dst string) {
err := vakuClient.PathCopy(ctx, src, dst)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Successfully copied %s to %s\n", src, dst)
}
高级功能
1. 搜索功能
func searchSecrets(vakuClient *vaku.Client, rootPath, searchTerm string) {
results, err := vakuClient.PathSearch(ctx, rootPath, searchTerm)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Search results for '%s':\n", searchTerm)
for path, matches := range results {
fmt.Printf("%s: %v\n", path, matches)
}
}
2. 批量读取/写入
func readAllSecrets(vakuClient *vaku.Client, path string) map[string]map[string]interface{} {
secrets, err := vakuClient.PathReadAll(ctx, path)
if err != nil {
log.Fatal(err)
}
return secrets
}
func writeAllSecrets(vakuClient *vaku.Client, path string, secrets map[string]map[string]interface{}) {
err := vakuClient.PathWriteAll(ctx, path, secrets)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Successfully wrote secrets to %s\n", path)
}
错误处理
vaku提供了详细的错误信息,建议使用如下方式处理错误:
func safeFolderOperation(vakuClient *vaku.Client, path string) {
err := vakuClient.PathDelete(ctx, path)
if err != nil {
switch err.(type) {
case *vaku.ErrPathNotFound:
fmt.Printf("Path %s not found\n", path)
case *vaku.ErrPathNoPermission:
fmt.Printf("No permission to access %s\n", path)
default:
log.Fatal(err)
}
return
}
fmt.Printf("Operation on %s succeeded\n", path)
}
总结
vaku库为Vault文件夹操作提供了强大的功能,包括:
- 文件夹的CRUD操作
- 批量操作
- 搜索功能
- 详细的错误处理
通过结合cobra等CLI库,可以快速构建强大的Vault管理工具。在实际使用中,请确保正确处理Vault认证和权限问题。