You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Golang如何正确Unmarshal Ansible Vault解密后YAML以编辑后重新加密

问题原因
  • 自定义结构体Props中的values字段为小写开头,属于Go语言未导出的私有字段,yaml.v2库无法访问私有字段完成赋值
  • 未配置结构体字段与YAML键的映射规则,即使字段导出也无法正常匹配值
解决方案

方案1:直接使用map接收反序列化结果(推荐,适合编辑任意键值场景)

不需要定义结构体,直接声明map[string]string类型变量接收解析结果,修改后完整流程代码如下:

package main

import (
    "fmt"
    "github.com/sosedoff/ansible-vault-go"
    "gopkg.in/yaml.v2"
)

func main() {
    // 解密Vault文件
    str, err := vault.DecryptFile("/tmp/tmpvlt", `.NunY4hb33zWx!)`)
    if err != nil {
        panic(err)
    }
    // 直接用map接收反序列化结果
    var props map[string]string
    err2 := yaml.Unmarshal([]byte(str), &props)
    if err2 != nil {
        panic(err2)
    }
    // 打印验证解析结果
    fmt.Println(str)
    fmt.Printf("%#v\n",props)

    // 编辑数据示例
    props["new_key"] = "new_value"

    // 将修改后的数据序列化回YAML格式
    newYaml, err := yaml.Marshal(props)
    if err != nil {
        panic(err)
    }

    // 重新加密写回Vault文件
    err = vault.EncryptFile("/tmp/tmpvlt", string(newYaml), `.NunY4hb33zWx!)`)
    if err != nil {
        panic(err)
    }
}

方案2:修改结构体定义适配反序列化规则

如果需要用结构体封装数据,需要将字段改为大写导出,同时添加yaml标签绑定映射关系:

type Props struct {
    Values map[string]string `yaml:",inline"` // inline标签会把所有顶层YAML键值都存入Values字段
}

调用时直接访问props.Values即可拿到所有键值数据,后续编辑、重新加密流程和方案1一致。

内容的提问来源于stack exchange,提问作者Simply Seth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 16:06:04