변수 우선 순위

ansible은 변수 우선 순위가 엉망이다. inventory file에 명시한 내용이 우선순위가 높아야 할것 같은데 오히려 낮다. inventory dir에 내용이 우선순위가 더 높기 때문에 파일 하나당 한 클러스터를 설정하게 만드는 것은 거의 불가능에 가깝고 필연적으로 여러 파일에 나누어야 한다. 이 방식이 편할때도 있지만 클러스터 설정시 대부분의 변수가 같고 몇몇 클러스터에서만 특이한 값을 쓰는 경우에는 단 몇가지 설정을 위해 수십개의 파일을 뒤지고 다녀야 한다. 이를 한군데로 모을려면 모듈을 짜던가 set_fact로 온갖 삽질을 다해야 한다.

유일하게 좀 쓸만한 방법은 default 값을 가진 inventory를 아래와 같이 쓰는 것이다. 나중에 쓰는게 우선순위가 높다(이것 또한 굉장히 실수할 여지가 많아 보인다.)

sudo ansible-playbook -i default -i hosts/local –check –connection=local setup-cluster.yaml –tags test

비명시적표현

ansible은 수많은 곳에서 비명시적인 룰을 사용한다. 폴더이름을 반드시 특정 이름으로 한다던가, main,yaml만 읽는 다던가 하는 것이 그것이다. 이는 타수를 몇타 줄이는데에는 도움이될지 모르지만, cluster를 수십개의 component로 관리하고 이를 여러명의 개발자가 곁다리로 관리해야 되는 상황에서는 도움이 안된다. component 하나 추가 하기 위해서 알아야 하는 비명시적 룰이 너무 많고, 다른사람이 만들어둔 ansible script는 암호일 뿐이다. 물론 ansible을 잘 공부해서 쓰면 되지만, 문제는 이 ansible 이라는 툴은 수많은 component를 “쉽게” 배포하고자 하는 툴이다. 그 툴을 배우는데 시간이 많이 들어간다면 그것은 잘못된 것이다.

물론 ansible의 대부분기능을 버려 버리고 모든 script에 include_task: main.yaml처럼 명시적으로 쓰는 것을 강요한다면, 이러한 문제점이 해결된다. 하지만 그 어떤 문서도 이런 방식이 더 좋다고 하지 않는다. 그래서 ansible script는 잘못 쓰기는 쉽고, 잘 쓰기는 어려운 구조이다.