퀴즈: 모듈과 셸 사이의 선
ansible.builtin.command: echo one two three | wc -w 를 실행하면 어떻게 되는가?
- echo 가 파이프 기호까지 인자로 받아 그대로 출력하고 종료 코드 0 으로 성공한다
- 파이프 기호를 만나 모듈이 즉시 오류를 내고 종료 코드 2 로 실패한다
- command 모듈이 파이프를 발견하면 자동으로 shell 모듈에 넘겨 정상 동작한다
- wc 가 실행되어 3 을 돌려주지만 changed 대신 skipped 로 보고된다
조회만 하는 command 태스크에 changed_when: false 를 달지 않으면 무엇이 문제인가?
- 태스크가 매번 실패로 보고되어 플레이북이 첫 실행에서 멈춘다
- 아무것도 바꾸지 않는데 매 실행이 changed 로 쌓여, 진짜 변경이 그 사이에 묻힌다
- register 로 받은 결과에서 stdout 키가 사라져 뒤 태스크가 값을 못 꺼낸다
- 점검 모드에서 그 태스크만 실제로 실행되어 대상 상태를 바꿔 버린다
shell: cat /var/log/missing.log | wc -l 에서 cat 이 파일을 못 찾았는데도 태스크가 성공하는 이유는?
- shell 모듈이 표준 오류를 무시하도록 기본 설정되어 있기 때문이다
- ansible 이 파이프가 있는 명령의 실패 판정을 아예 하지 않기 때문이다
- 셸에서 파이프라인의 종료 코드는 마지막 명령의 것이라 wc 의 0 이 전체 결과가 되기 때문이다
- cat 이 없는 파일을 만나면 빈 출력과 함께 0 을 돌려주도록 정의되어 있기 때문이다
ansible.builtin.raw 를 써야 하는 자리는 어디인가?
- 명령이 길어 여러 줄로 나눠 써야 할 때. raw 만 여러 줄 문자열을 받는다
- 표준 출력을 그대로 파일에 넘겨야 할 때. raw 만 리다이렉트를 지원한다
- 멱등성이 필요한 파일 작업. raw 는 대상 상태를 먼저 읽고 판단한다
- 대상에 아직 파이썬이 없어 모듈 자체를 실행할 수 없을 때(부트스트랩, 네트워크 장비)
ansible-core 2.16 의 command 모듈에서 echo HOME=$HOME 을 넘기면 어떻게 되는가?
expand_argument_vars기본값이 참이라 모듈이 직접 펼쳐 실제 경로가 찍힌다- 셸을 거치지 않으므로
$HOME이 글자 그대로 남는다. 펼치려면 shell 을 써야 한다 - 펼쳐지지 않은 채 남고 모듈이 경고를 내며 태스크를 skipped 로 보고한다
- 환경변수 이름이 인자에 있으면 모듈이 즉시 실패하고 argv 형식으로 다시 쓰라고 안내한다
플레이북에서 copy: 대신 ansible.builtin.copy: 처럼 FQCN 을 끝까지 적는 실질적인 이유는?
- 짧은 이름은 ansible-core 2.16 부터 제거되어 더 이상 동작하지 않기 때문이다
- FQCN 으로 적은 태스크만 점검 모드와 diff 를 지원하도록 구현되어 있기 때문이다
- 컬렉션이 여럿 깔린 기계에서는 같은 짧은 이름이 여러 개일 수 있고, 무엇이 뽑히는지는 검색 경로가 정하기 때문이다
- FQCN 을 쓰면 모듈이 컨트롤러에서 실행되어 대상 파이썬 없이도 돌기 때문이다