クイズ: フィルターが無いなら作る
한국어 원문으로 표시합니다.
사용자 정의 Jinja2 필터와 사용자 정의 모듈의 가장 근본적인 차이는?
- 필터는 플레이북을 실행하는 컨트롤러에서 돌고, 모듈은 대상으로 복사되어 대상에서 돈다
- 필터는 파이썬으로 쓰고 모듈은 반드시 JSON 을 내는 실행 파일이어야 한다
- 필터는 컬렉션 안에만 둘 수 있고 모듈은 플레이북 옆에만 둘 수 있다
- 필터는 변수만 읽을 수 있고 모듈은 변수와 팩트를 모두 읽을 수 있다
filter_plugins/textutils.py 를 만들었는데 플레이북이 필터를 찾지 못한다. 가장 먼저 볼 곳은?
- 파일 이름이 부르려는 필터 이름과 같은지 — 앤서블은 파일 이름으로 필터를 찾는다
- 파일 안의 클래스 이름이 FilterModule 인지, 그리고 그 디렉터리가 플레이북 옆에 있는지
- ansible.cfg 의 filter_plugins 목록에 그 파일을 한 줄로 등록했는지
- 필터 함수에 @filter 데코레이터를 붙였는지 — 붙이지 않은 함수는 등록되지 않는다
lookup('file', '/etc/app/token') 이 읽는 파일은 어디에 있는 것인가?
- 플레이의 첫 호스트에 있는 파일. 룩업은 첫 호스트에서 한 번만 평가된다
- 각 대상 호스트에 있는 파일. 호스트마다 따로 평가되어 서로 다른 값이 나온다
- 플레이북을 실행하는 컨트롤러에 있는 파일. 대상에 같은 경로가 있어도 그것은 읽지 않는다
- 먼저 대상에서 찾고 없으면 컨트롤러에서 찾는다. 둘 다 없을 때만 실패한다
필터가 순수 함수여야 한다고 말하는 실질적인 이유는?
- 파이썬의 함수형 규약이라 어기면 앤서블이 등록 단계에서 거부하기 때문이다
- 순수 함수가 아니면 컨트롤러와 대상 사이에서 직렬화가 되지 않아 전송에 실패하기 때문이다
- Jinja2 가 필터를 병렬로 평가해서 부수 효과가 있으면 경쟁 조건이 생기기 때문이다
- 템플릿이 언제 몇 번 평가될지 정해져 있지 않아, 부수 효과가 있으면 실행마다 결과가 달라지기 때문이다
다음 중 사용자 정의 모듈로 만들어야 하는 일은?
- 인벤토리의 호스트 이름 목록을 받아 정렬하고 중복을 없앤 목록을 돌려주는 일
- 포트 번호가 예약 포트 범위에 드는지 참거짓으로 답하는 일
- 컨트롤러의 JSON 파일에서 환경 이름에 해당하는 지역 코드를 찾아오는 일
- 대상의 특정 설정 파일을 읽어 필요한 값이 이미 있으면 그대로 두고 없을 때만 고쳐 쓰는 일
플레이북 옆의 filter_plugins/ 에 있던 필터를 사내 컬렉션 acme.common 으로 옮긴다. 무엇이 달라지는가?
- 파일은 컬렉션의 filter_plugins/ 에 그대로 두고, 부를 때만 acme.common 을 앞에 붙인다
- 파일은 컬렉션의 plugins/filter/ 로 가고, 부를 때는 acme.common.<필터이름> 처럼 FQCN 을 쓴다
- 파일 자리는 그대로지만 galaxy.yml 의 filters 항목에 필터 이름을 하나씩 등록해야 한다
- 컬렉션 안의 필터는 FQCN 없이도 불리므로 호출부는 한 글자도 바뀌지 않는다