Yaml: ๋ฐ์ดํ„ฐ ์‹œํ€€์Šค๋ฅผ ๋ชฉ๋ก์œผ๋กœ ๊ตฌ๋ฌธ ๋ถ„์„

์— ๋งŒ๋“  2016๋…„ 12์›” 14์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: go-yaml/yaml

๋ฐ์ดํ„ฐ๋Š”

-
  ip: 192.168.1.1
  role: master
-
  ip: 192.168.1.2
  role: node
-
  ip: 192.168.1.3
  role: node

๊ตฌ์กฐ์ฒด๋Š”

type NODE struct {
    node []struct {
        ipaddr string
        role   string
    } `yaml:",flow"`
}

ํŒŒ์‹ฑ โ€‹โ€‹์ฝ”๋“œ๋Š”

    n := NODE{}

    err := yaml.Unmarshal([]byte(data), &n)
    if err != nil {
        log.Fatalf("error: %v", err)
    }
    fmt.Printf("--- t:\n%v\n\n", n)

๋‹ค์Œ ์ •๋ณด๋กœ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.

2016/12/14 17:13:39 error: yaml: unmarshal errors:
  line 2: cannot unmarshal !!seq into main.NODE

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋ช‡ ์‹œ๊ฐ„ ๋™์•ˆ ์ด๊ฒƒ์œผ๋กœ ๊ณ ์‹ฌํ•œ ํ›„ ์ด ์Šค๋ ˆ๋“œ๋ฅผ pingํ•œ ํ›„ 5๋ถ„ ํ›„์— ์•Œ์•„๋ƒˆ์Šต๋‹ˆ๋‹ค(์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค!) https://github.com/go-yaml/yaml/issues/101#issuecomment -178792007์˜ ๋Œ“๊ธ€์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํฐ ๋„์›€.

์ œ ๊ฒฝ์šฐ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ Ansible์˜ requirements.yaml ํŒŒ์ผ์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค.

---
- src: franklinkim.php5-newrelic
- src: geerlingguy.composer
- src: geerlingguy.java
- src: geerlingguy.nginx
- src: geerlingguy.nodejs
- src: geerlingguy.php
- src: geerlingguy.php-versions
- src: geerlingguy.rabbitmq
- src: geerlingguy.solr
- src: newrelic.newrelic-infra

- name: mycustomrole
  src: [email protected]:foo/bar.git
  scm: git
  version: master

- src: https://github.com/nickhammond/ansible-logrotate
  name: nickhammond.logrotate

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ์ฒด๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ ์ •ํ™•ํ–ˆ์Šต๋‹ˆ๋‹ค.

type AnsibleSource struct {
    Source  string  `yaml:"src"`
    Name    *string `yaml:"name,omitempty"`
    Type    *string `yaml:"scm,omitempty"`
    Version *string `yaml:"version,omitempty"`
}

๊ทธ๋Ÿฌ๋‚˜ ์ตœ์ƒ์œ„ ์‹œํ€€์Šค๋ฅผ ์ œ๋Œ€๋กœ ์ •๋ ฌ ํ•ด์ œํ•˜๊ณ  cannot unmarshal !!seq ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด var out []AnsibleSource ๋ฅผ ํ†ตํ•ด ์ •๋ ฌ ํ•ด์ œํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค .

    source, err := ioutil.ReadFile(ansibleRequirements.Path)
    if err != nil {
        return
    }

    var out []AnsibleSource

    err = yaml.Unmarshal(source, &out)
    if err != nil {
        return
    }

    fmt.Println(requirements)

์ด๊ฒƒ์ด ๋‹ค๋ฅธ ์‚ฌ๋žŒ์„ ๋•๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค!

๋ชจ๋“  3 ๋Œ“๊ธ€

@vanloswang ๋™์ผํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•˜์…จ๋‚˜์š”?

@alexforever86 ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์€ ์ ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋ช‡ ์‹œ๊ฐ„ ๋™์•ˆ ์ด๊ฒƒ์œผ๋กœ ๊ณ ์‹ฌํ•œ ํ›„ ์ด ์Šค๋ ˆ๋“œ๋ฅผ pingํ•œ ํ›„ 5๋ถ„ ํ›„์— ์•Œ์•„๋ƒˆ์Šต๋‹ˆ๋‹ค(์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค!) https://github.com/go-yaml/yaml/issues/101#issuecomment -178792007์˜ ๋Œ“๊ธ€์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํฐ ๋„์›€.

์ œ ๊ฒฝ์šฐ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ Ansible์˜ requirements.yaml ํŒŒ์ผ์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค.

---
- src: franklinkim.php5-newrelic
- src: geerlingguy.composer
- src: geerlingguy.java
- src: geerlingguy.nginx
- src: geerlingguy.nodejs
- src: geerlingguy.php
- src: geerlingguy.php-versions
- src: geerlingguy.rabbitmq
- src: geerlingguy.solr
- src: newrelic.newrelic-infra

- name: mycustomrole
  src: [email protected]:foo/bar.git
  scm: git
  version: master

- src: https://github.com/nickhammond/ansible-logrotate
  name: nickhammond.logrotate

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ์ฒด๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ ์ •ํ™•ํ–ˆ์Šต๋‹ˆ๋‹ค.

type AnsibleSource struct {
    Source  string  `yaml:"src"`
    Name    *string `yaml:"name,omitempty"`
    Type    *string `yaml:"scm,omitempty"`
    Version *string `yaml:"version,omitempty"`
}

๊ทธ๋Ÿฌ๋‚˜ ์ตœ์ƒ์œ„ ์‹œํ€€์Šค๋ฅผ ์ œ๋Œ€๋กœ ์ •๋ ฌ ํ•ด์ œํ•˜๊ณ  cannot unmarshal !!seq ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด var out []AnsibleSource ๋ฅผ ํ†ตํ•ด ์ •๋ ฌ ํ•ด์ œํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค .

    source, err := ioutil.ReadFile(ansibleRequirements.Path)
    if err != nil {
        return
    }

    var out []AnsibleSource

    err = yaml.Unmarshal(source, &out)
    if err != nil {
        return
    }

    fmt.Println(requirements)

์ด๊ฒƒ์ด ๋‹ค๋ฅธ ์‚ฌ๋žŒ์„ ๋•๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค!

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰