본문 바로가기

✋ 개념이해/기타 (YAML)

YAML 문법

YAML to JSON 으로 변경해주는 사이트

https://www.convertjson.com/yaml-to-json.htm

 

YAML To JSON Converter

 

www.convertjson.com

YAML 문법 맞는지 테스트 하는 사이트

http://www.yamllint.com/

 

YAMLlint - The YAML Validator

YAML Lint Paste in your YAML and click "Go" - we'll tell you if it's valid or not, and give you a nice clean UTF-8 version of it. Optimized for Ruby.

www.yamllint.com

YAML이란?

*.yaml 혹은 *.yml 확장자를 가진 파일을 기술하는 문법이다.
사람이 쉽게 읽을 수 있다는 컨셉을 가진 데이터 직렬화 양식이다.
출력 가능한 유니코드 문자 집합(UTF-8, UTF-16 등)을 이용한다.
데이터를 표현하는 다른 형식인 XML이나 JSON보다는 읽기 쉽게 표현할 수 있다.

자주 사용하는 문법 정리 (EKS 리소스 실행 파일을 기준으로 정리해 보자.)

deployment.yaml 파일이 아래와 같이 정의 되어 있다. 아래의 파일을 분석해보자. 크게 3부분으로 나누어져 있고, 들여쓰기 2칸을 기준으로 값들을 구분한다. 문서의 시작과 끝의 표시는 따로 하지 않는다. 안해도 문제가 되거나 하지는 않는다.

-------------------------------> api 버전을 설정한다.
apiVersion: apps/v1
kind: Deployment
-------------------------------> metadata를 정의 한다.
metadata:
  name: new-app
  labels:
    app: new-app
  namespace: new-app
-------------------------------> 해당 서비스의 spec을 정의 한다.
spec:
  replicas: 2
  selector:
    matchLabels:
      app: new-app
  template:
    metadata:
      labels:
        app: new-app
    spec:
      containers:
      - image: .ap-northeast-2.amazonaws.com/new-app
        imagePullPolicy: Always
        name: new-app
        ports:
        - containerPort: 3000
          protocol: TCP

테스트 위의 deployment.yaml 파일에서 - (하이픈 값)을 빼고 실행 시 정상적으로 실행되는지 테스트

서비스 죽었는지 확인하고...

실행 했는데 아래와 같은 오류가 발생함(문법 틀리다고 오류 발생 함)

seungkim:~/yaml $ kubectl apply -f deployment.yaml
error: error validating "deployment.yaml": error validating data: ValidationError(Deployment.spec.template.spec.containers): invalid type for io.k8s.api.core.v1.PodSpec.containers: got "map", expected "array"; if you choose to ignore these errors, turn validation off with --validate=false

위의 에러 발생함 → - 하이픈은 리스트 형태로 변환해주는 문법 이므로, - 하이픈을 빼면 리스트 형태로 변환이 되지 않기 때문에 오류가 발생 한다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: nginx
  labels:
    app: nginx
spec:
  replicas: 8
  selector:
    matchLabels:
      app: nginx 
  template:
    metadata:
      labels:
        app: nginx 
    spec:
      containers:
        name: nginx
        image: nginx:1.14.2
        ports:
          containerPort: 80

정상 실행됨 - 하이픈 넣으니까 리스트 형태로 출력되어 오류가 발생하지 않는다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: nginx
  labels:
    app: nginx
spec:
  replicas: 8
  selector:
    matchLabels:
      app: nginx 
  template:
    metadata:
      labels:
        app: nginx 
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

결론 : 너무 당연한 이야기지만 yaml 파일에서 - (하이픈) 빼고 실행 하니까 에러 발생 하더라...

YAML 파일과 JSON 파일의 비교를 통해 YAML 파일의 구조를 파악한다.

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
namespace: nginx
labels:
app: nginx
spec:
replicas: 8
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
{
"apiVersion": "apps/v1",
"kind": "Deployment",
"metadata": {
"name": "nginx",
"namespace": "nginx",
"labels": {
"app": "nginx"
}
},
"spec": {
"replicas": 8,
"selector": {
"matchLabels": {
"app": "nginx"
}
},
"template": {
"metadata": {
"labels": {
"app": "nginx"
}
},
"spec": {
"containers": [
{
"name": "nginx",
"image": "nginx:1.14.2",
"ports": [
{
"containerPort": 80
}
]
}
]
}
}
}
}

yaml 기본문법

문서의 시작과 끝

---은 문서의 시작을, ...은 문서의 끝을 나타내며, 둘 모두 optional하다 즉 안붙여도 무관하다는 뜻이다.

공백과 줄바꿈

들여쓰기는 2칸(recommended) 혹은 4칸을 지원한다. 탭은 안된다. 그리고 같은 부모를 가질 경우, 자식끼리는 들여쓰기가 일치해야 한다.
- 블록 내 줄바꿈을 하려면 |를 사용
- 그리고 > 은 블록 내의 줄바꿈(new line)을 무시한다. 그들 기호 뒤에 -를 붙이면 마지막 줄바꿈을 제외하고 인식한다.

# Tell me\n\nif you\n\nwanna go home\n
lines: |
  Tell me

  if you

  wanna go home
  # 여기 빈칸 한 줄

# Tell me\n\nif you\n\nwanna go home
lines: |-
  Tell me

  if you

  wanna go home
  # 여기 빈칸 한 줄

# Tell me\nif you\nwanna go home\n
lines: >
  Tell me

  if you

  wanna go home
  # 여기 빈칸 한 줄

데이터의 선언

데이터는 key: value 형식을 통해 정의한다. (ex. name: SeungHyun)
여기서 반드시 : 뒤에는 띄어쓰기 해야 한다.
{}으로도 정의 가능하다.

student: {
  name: Park
  subject: [
    math, korean
  ]
}

자료형은 int, string, boolean을 지원한다.
문자열을 따옴표 없이 사용할 수 있다. 단 :가 들어갈 때는 따옴표로 감싸야 한다.
숫자를 쓰면 자동으로 숫자로 인식한다. 따옴표로 감싸야 문자로 인식한다.
쌍따옴표는 escape 문자를 처리할 수 있고, 홑따옴표는 그대로 문자로 인식한다.
(ex. "my\nbag"은 줄바꿈이 유효하나, 'my\nback'은 그대로 my\nback이 된다.

배열

# 방법1 (2칸 띄어쓰기)
food: [
  Chicken, Pizza, Pasta
]

# 방법2: '-'로 인자 표기 (- 2칸 띄어쓰기, value 4칸 띄어쓰기)
food:
  - Chicken
  - Pizza
  - Pasta

object

# 방법1 (2칸 띄어쓰기)
key:
  key: value
  key: value

# 방법2 (2칸 띄어쓰기)
key: {
  key: value,
  key: value
}

# 예1 (value 4칸 띄어쓰기)
list_obj:
  - name: Han
    number: 6
  - name: Kim
    number: 3

# 예2
obj: (2칸 띄어쓰기)
  name: Lee
  number: 9

기타 기능

yaml 주석은 # 와 작성한다.
anchor와 alias로 반복되는 값을 처리할 수 있다. 선언할 때는 &를 붙여 표시하고, 참조는 *를 붙인다. 아래 예시에서 보면 *first을 이용해 &first가 붙은 first-anchor를 가져올 수 있다.

students:
  first-anchor: &first
    name: Choi
    number: 5
  second-anchor: &second
    name: Jung
    number: 1
# 주석 입니다.
first-student: *fisrt
second-student: *second