使用go lang附加到YAML文件



我写了一个golang程序,它将规则附加到文件中,如下所述所需格式:

customRules:
custom-rules.yaml: |-
- rule: Pod Created in Kube Namespace
append: true
condition: and (k8s_audit_never_true)
source: k8s_audit
- rule: Create files below dev
append: true
condition: and (never_true)
source: syscall

我写了一个围棋程序,如果没有上面的格式,我就找不到我缺少的东西。

package main
import (
"fmt"
"io/ioutil"
"log"
"gopkg.in/yaml.v2"
)
type AutoGenerated struct {
CustomRules CustomRules `yaml:"customRules"`
}
type CustomRulesYaml struct {
Rule      string `yaml:"rule"`
Append    bool   `yaml:"append"`
Condition string `yaml:"condition"`
Source    string `yaml:"source"`
}
type CustomRules struct {
CustomRulesYaml []CustomRulesYaml `yaml:"custom-rules.yaml"`
}
func main() {
// yfile, err := ioutil.ReadFile("/home/revaa/falco/custom_rules.yaml")
// if err != nil {
//  log.Fatal(err)
// }
c1 := CustomRulesYaml{"K8s serviceaccount created", false, "(never_true)", "k8s-audit"}
c2 := CustomRulesYaml{"k8s service created", false, "never_true", "k8s-audit"}
c := []CustomRulesYaml{c1, c2}
c3 := CustomRules{c}
data := AutoGenerated{c3}
check, err := yaml.Marshal(&data)
if err != nil {
log.Fatal(err)
}
err2 := ioutil.WriteFile("/home/revaa/falco/custom_rules.yaml", check, 0)
if err2 != nil {
log.Fatal(err2)
}
fmt.Println("data written")
}

这是我的go代码,在运行程序时,YAML不会以上述格式附加。值的附加方式如下。

customRules:
custom-rules.yaml:
- rule: K8s serviceaccount created
append: false
condition: (never_true)
source: k8s-audit
- rule: k8s service created
append: false
condition: never_true
source: k8s-audit

为什么我没有得到所需格式的YAML文件?

您所需的输入格式表示以下YAML结构:

  • 有一个字典有一个键值对。
    • 关键是customRules
    • 该值是一个字典

存储在上述值中的字典有一个条目:

  • 关键是custom-rules.yaml
  • 该值是一个字符串

存储在上述值中的字符串为:

"- rule: Pod Created in Kube Namespacen  append: truen  condition: and (k8s_audit_never_true)n  source: k8s_auditn- rule: Create files below devn  append: truen  condition: and (never_true)n  source: syscall"

也就是说,此不是列表类型。这是一根绳子。

现在,事实是,这个字符串有效的——尽管有点不可靠——YAML,如果读取,它将生成一个由2个元素组成的列表(Go中的切片(,每个元素都是一个字典(通常对应于Go中的映射或结构类型(。

如果您真的需要这个,那么您的代码是接近正确的。您需要封送两次,而不是将[]CustomRulesYaml封装在类型中。以下是Go Playground上的代码变体,其输出为:

custom-rules.yaml: |
- rule: K8s serviceaccount created
append: false
condition: (never_true)
source: k8s-audit
- rule: k8s service created
append: false
condition: never_true
source: k8s-audit

现在,请注意,该输出有一个管道符号|,没有后缀连字符-。这是因为封送处理后的字符串string(asBytes)以换行符结尾。它可能应该以换行符结束,这就是yaml.Marshal产生换行符的原因。但是您的示例输入并没有以换行符结束,这就是为什么您的示例输出具有|-而不仅仅是|-的意思是";不要包含换行符;。

要从现有代码中获得,您必须去掉换行符,例如,添加:

asBytes = asBytes[0:len(asBytes)-1] // delete trailing newline

c3中构建字符串并对其进行封送之前。

相关内容

  • 没有找到相关文章

最新更新