2013-08-18 1 views
1

시작하기 전에 YAML과 JSON을 처음 접했기 때문에 형식 규칙이 분명하지 않다는 것을 설명해야합니다. 권장 파일 형식 (YAML? JSON? 기타?)

나는 펄 스크립트를 작성하려고 해요 (나는 그것이 우리의 모든 서버에 존재하는 알고 있기 때문에 펄.) 다양한 호스트에 대한 여러 네트워크 관련 설정을 업데이트 할. 필자가 선호하는 것은 모든 설정을 단일 파일에두고 스크립트가 실행되는 호스트를 기반으로 구성을 업데이트하는 것입니다.

내가 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 중 어느 하나가 적합하다면 무엇을 잘못하고 있습니까?

+2

인간이 올바른 YAML 및 JSON을 쓰는 것이 읽기보다 어렵습니다. Perl로 초기 데이터 구조를 만들고 적어도 Perl을 사용하여 파일에 파일을 작성해야합니다. 그런 다음 용감한 사람이라면 손으로 파일을 조금만 변경할 수 있습니다. – mob

답변

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: 
    - ... 

, 이것은 당신에게 구조를 줄 것이다 : 지금까지 JSON과 같은

{ 
    "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" 
    } 
    ] 
} 

을, 그건 YAML의 하위 집합. 개인적으로 필자는 전체 YAML 사양을 사용할 수 있지만 JSON은 Perl 이외의 언어와 더 많은 상호 운용성을 제공합니다.

+0

YAML은 모든 현대 언어로 지원됩니다 (외부 라이브러리가 필요할 수도 있지만 여전히 ...). 예외가 있는지 알려주세요. –

+0

@KarolyHorvath - 공정한 포인트. Perl 프로그램이 다른 언어의 프로그램보다 YAML 지원을 포함 할 가능성이 높지만 개별 프로그램이 YAML 지원보다 JSON 지원을 포함 할 확률이 높다는 것을 생각하지 않았습니다. 그러나 나는 그것을 가난하게 말했습니다. –

+0

나는 본다. YAML의 일부분을 표시 한 목록이 있습니까? 아니면 단순히 비슷하게 보입니까? YAML 유효성 검사기에 플러그를 꽂았는데 체크 아웃 했으므로 YAML의 또 다른 기능이라고 생각합니다. – theillien

0

는 형식에 대해 걱정하지 마십시오. 데이터 구조를 채우고 JSON 또는 YAML이 더러운 작업을 수행하도록하십시오. 어쨌든 파일을 직접 생성하고 파싱 할 경우 JSON 또는 YAML 사용시 거의 이점이 없습니다. 당신이 그 (것)들을 포함하는 키와 같은 수준에서 하위 키를 넣어하려는 :

0

정확한 형식은 중요하지 않습니다. YAML과 JSON 모두 괜찮습니다. 사실,이 특정 부분을 플러그 가능한 상태로 유지하는 것이 좋습니다.

YAML의 문제는 데이터 구조가 어떤 의미가 있어야한다는 것입니다.:

YAML를 작성하는 것은 수동으로 당신을 위해 지루한에 경우
- 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 

, 당신을 위해 그것을 생성하는 작은 스크립트를 작성 :

- 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: 
     ... 

또는 인터페이스를 주문해야하는 경우

.

목록에는 어떤 식 으로든 -과 같은 마커가 있어야합니다. 의도는 이것으로 충분하지 않습니다.

1

나는 YAML보다 JSON을 선호합니다. 나는 최근에 "사용자 인터페이스"(ha)가 기본적으로 하나의 거대한 설정 파일 인 시스템을 만들었습니다. 사용자는 시스템을 제어하기 위해 해당 설정 파일을 편집해야했습니다. 그 파일에 YAML을 사용했습니다. YAML에는 사람에게 부적합한 몇 가지 문제점이 있습니다. 예를 들어 공백에 대해서는 까다 롭습니다.

또한 일반적으로 익숙하지 않습니다. 프로그래밍 경험이있는 사람이라면 누구든지 JSON을 실행하고 이해할 것입니다. 그러나 YAML은 더 많은 틈새 시장입니다.

변수 정의 및 나중에 참조 할 수있는 기능과 같이 YAML의 고급 기능을 사용하지 않는 경우 JSON 대신 사용하는 것이 좋습니다.