推荐的文件格式(YAML?JSON?其他?)

时间:2013-08-18 16:36:10

标签: json perl yaml

在开始之前,我应该声明我是YAML和JSON的新手,所以格式化规则不是很清楚。

我正在尝试编写一个Perl脚本(Perl因为我知道它存在于我们所有的服务器上。)这将更新各种主机的几个与网络相关的设置。我的首选是将所有设置放在一个文件中,并根据运行脚本的主机更新配置。

我看着YAML,但是因为我做不了类似的事情而让我有点迟钝:

host:
  hostname: first
    interface: eth0
      oldip: 1.2.3.4
      newip: 2.3.4.5
      oldgw: 1.2.3.1
      newgw: 2.3.4.1
    interface: eth1
      oldip: 1.2.3.4
      newip: 2.3.4.5
      oldgw: 1.2.3.1
      newgw: 2.3.4.1

host:
  hostname: second
    interface: eth0
      oldip: 1.2.3.4
      newip: 2.3.4.5
      oldgw: 1.2.3.1
      newgw: 2.3.4.1
    interface: eth1
      oldip: 1.2.3.4
      newip: 2.3.4.5
      oldgw: 1.2.3.1
      newgw: 2.3.4.1

也就是说,我已将其插入YAML验证器并且失败了。

我已经发现,对于YAML,我可以做以下事情:

host: "first"
interface1:
  name: eth0
  oldip: 1.2.3.4
  newip: 2.3.4.5
  oldgw: 1.2.3.1
  newgw: 2.3.4.1
interface2:
  name: eth1
  oldip: 1.2.3.4
  newip: 2.3.4.5
  oldgw: 1.2.3.1
  newgw: 2.3.4.1
但是,这不太理想,因为它使一个文件中的多个主机不可能。我的理由是我在尝试这个时使用的在线验证器上一直收到错误。

我已经看过使用JSON,但我也不知道所有的规则。我知道以下内容不起作用:

{
    "host": "first",
    "interface1": {
        "newip": "2.3.4.5",
        "oldip": "1.2.3.4",
        "oldgw": "1.2.3.1",
        "name": "eth0",
        "newgw": "2.3.4.1"
    },
    "interface2": {
        "newip": "2.3.4.5",
        "oldip": "1.2.3.4",
        "oldgw": "1.2.3.1",
        "name": "eth1",
        "newgw": "2.3.4.1"
    }
}

{
    "host": "second",
    "interface1": {
        "newip": "2.3.4.5",
        "oldip": "1.2.3.4",
        "oldgw": "1.2.3.1",
        "name": "eth0",
        "newgw": "2.3.4.1"
    },
    "interface2": {
        "newip": "2.3.4.5",
        "oldip": "1.2.3.4",
        "oldgw": "1.2.3.1",
        "name": "eth1",
        "newgw": "2.3.4.1"
    }
}

我可以使用哪种格式允许我将所有主机及其信息存储在一个可以解析的文件中?

如果YAML或JSON合适,我做错了什么?

4 个答案:

答案 0 :(得分:3)

host的YAML问题与最初使用interface的问题相同:您试图将子密钥放在与包含它们的密钥相同的级别。

host:
  name: first
  interface1:
    name: eth0
    oldip: 1.2.3.4
    newip: 2.3.4.5
    oldgw: 1.2.3.1
    newgw: 2.3.4.1
  interface2:
    name: eth1
    oldip: 1.2.3.4
    newip: 2.3.4.5
    oldgw: 1.2.3.1
    newgw: 2.3.4.1

应该可行,但仍无法满足您对多个主机的需求。为此(并更好地处理多个接口),您应该使用列表:

host:
  - name: first_host
    interface:
      - name: eth0
        oldip: 1.2.3.4
        newip: 2.3.4.5
        oldgw: 1.2.3.1
        newgw: 2.3.4.1
      - name: eth1
        oldip: 1.2.3.4
        newip: 2.3.4.5
        oldgw: 1.2.3.1
        newgw: 2.3.4.1
  - name: second_host
    interface:
    - ...

当通过Perl读入时,这将为您提供结构:

{
  "host": [
    {
      "interface": [
        {
          "newip": "2.3.4.5", 
          "oldip": "1.2.3.4", 
          "oldgw": "1.2.3.1", 
          "name": "eth0", 
          "newgw": "2.3.4.1"
        }, 
        {
          "newip": "2.3.4.5", 
          "oldip": "1.2.3.4", 
          "oldgw": "1.2.3.1", 
          "name": "eth1", 
          "newgw": "2.3.4.1"
        }
      ], 
      "name": "first_host"
    }
  ]
}

就JSON而言,这是YAML的一个子集。就个人而言,我更喜欢使用完整的YAML规范,但JSON提供了与非Perl语言的更多互操作性。

答案 1 :(得分:1)

我更喜欢JAM而不是YAML。我最近建立了一个系统,其“用户界面”(ha)基本上是一个巨大的配置文件;用户需要编辑该配置文件来控制系统;我用YAML作为那个文件。事实证明,YAML有一些非常讨厌的陷阱,使它不适合人类 - 例如,它对于空白非常挑剔。

此外,它一般不太熟悉:我猜任何有编程经验的人都会遇到JSON,并且理解它。但是YAML更有利可图。

如果你没有使用YAML的高级功能 - 比如能够定义变量然后再引用它们 - 我建议你改用JSON。

答案 2 :(得分:0)

不关心格式。填充数据结构,让JSONYAML为您完成脏工作。如果您打算自己生成和解析文件,使用JSON或YAML几乎没有优势。

答案 3 :(得分:0)

确切的格式并不重要:YAML和JSON都很好。实际上,我建议将这个特定部分保持可插拔状态。

你的YAML的问题是数据结构必须有意义,例如:

- host:
    hostname: first
    interfaces:
      eth0:
        oldip: 1.2.3.4
        newip: 2.3.4.5
        oldgw: 1.2.3.1
        newgw: 2.3.4.1
      eth1:
        oldip: 1.2.3.4
        newip: 2.3.4.5
        oldgw: 1.2.3.1
        newgw: 2.3.4.1
- host:
    hostname: second
    interfaces:
      ...

或者如果必须订购接口:

- host:
    hostname: first
    interfaces:
      -
        name: eth0
        oldip: 1.2.3.4
        newip: 2.3.4.5
        oldgw: 1.2.3.1
        newgw: 2.3.4.1
      -
        name: eth1
        oldip: 1.2.3.4
        newip: 2.3.4.5
        oldgw: 1.2.3.1
        newgw: 2.3.4.1

如果手动编写YAML对你来说很乏味,那就写一个为你生成它的小脚本。

请注意,列表必须以-之类的标记以某种方式引入。这种意图是不够的。