2018년 11월 7일 수요일

yml? yaml?

엘라스틱 스택의 주요 설정 파일들은 대부분 yml 확장자를 갖는다. 이게 뭔가 싶었는데 데이터 직렬화 양식인 YAML을 줄인 거라고. 응? 데이터 직렬 뭐? 읽기 편한 구조를 가지고 있어서 설정 파일 형식으로 많이 쓰인다나.

그런데 이게 읽기 쉬운 구조인 건 알겠는데 문법에 대한 이해 없이 리눅스 설정하듯 쓰면 되겠거니 하다가는 낭패보기 십상이다. 다음은 logstash.yml 설정 구조.

같은 의미, 다른 표현

참고로 'size: 125delay: 5'는 125개, 5밀리초 단위로 입력을 처리한다는 뜻.

특징 하나

YAML 스펙을 보면 시퀀스와 매핑 구조를 이용해서 데이터를 표현한다고(..) 시퀀스는 여러 데이터를 나열하는 리스트, 매핑은 key-value 구조의 해시(hash)를 생각하면 쉬울 듯하다. 어째 설명을 할수록 더 어려워지냐

일단 엘라스틱 3대장 elasticsearch, kibana, logstash 설정 파일은 모두 매핑 구조를 이용하며, 이때 부모-자식 트리를 갖는 계층 구조든, 한줄 구조든 key와 value는 ':공백'으로 구분한다. 'size: 125' 설정에서 공백을 없애면 어떻게 될까?


똑똑한 VIM이 yaml이 인식할 수 없는 key-value 구조임을 즉각 색깔로 알려준다. 아니나 다를까 에러 발생.

공백이나 들여쓰기 사용이 틀렸다

특징 둘

yaml의 계층 구조는 들여쓰기로 부모-자식을 구분한다. 줄을 잘 맞춰야 한다는 얘기. 자식 노드가 부모 노드랑 같은 선상에서 또는 먼저 시작하면 버르장머리 없다고 에러 발생.



이런 특징은 한줄 구조에서도 똑같이 적용된다. 다음은 에러를 부르는 설정.


같은 pipeline 노드로 시작하기 때문에 같은 들여쓰기를 적용해야 한다는 얘기. 다음 설정은 둘 다 잘 동작한다.



참고로 yaml은 탭을 이용한 들여쓰기를 허용하지 않는다고 하는데, 예시에서는 탭 들여쓰기를 사용해도 잘 동작함. 그냥 권장사항인가?

특징 셋

beat 제품군은 시퀀스와 매핑 구조를 혼용하며, 시퀀스는 '- '을 기준으로 계층 구조를 세분화한다. '- '으로 시작한 데이터는 다음 '- '으로 시작하는 데이터와 계층 구분이 된다는 얘기. 당연히 공백이 없으면 실행이 안 됨.

다음은 4624, 4625 보안 이벤트, 최근 1분내 발생한 시스템 이벤트, 모든 애플리케이션 이벤트 전송을 의미하는 winlogbeat.yml.


다음은 같은 보안 이벤트 계층임에도 들여쓰기가 달라 실행이 실패하는 설정.



가끔 들여쓰기 오류에도 불구하고 실행이 잘 되는 경우도 있다. 대신 설정이 적용되지 않고, 기본 설정으로 동작함. 실행 잘 되는데 뭔가 쎄-하면 들여쓰기 오류더라. 전체적으로 들여쓰기가 좀 헷갈리지만, 눈치껏 기본 구조를 따르면 크게 어려울 건 없지 싶다.

결론은 줄을 잘 맞추자.

댓글 없음:

댓글 쓰기

크리에이티브 커먼즈 라이선스