[Ansible] jinja2 template comment({#) escape

by 스뎅(thDeng) on

Ansible을 사용하서 template 모듈을 사용하면 파일의 중간중간을 변수로 바꿔 넣을 수 있어서 편하다. 이 template 모듈은 Jinja2 template을 사용한다.

Jinja2에서 주석(comment)은 {# ... #}로 표현하는데, shell script를 만들다 보면 문자열이나 배열의 길이를 구하기 위해 {#를 사용해야 하는 경우가 종종 생긴다. 이럴 때 {#을 jinja2 주석으로 판단해서 아래와 같은 에러(Missing end of comment tag)를 뱉는 경우가 종종 생긴다.

TASK [system/test : template test] **********************************************************
failed: [my-server] (item={u'dest': u'vhost.conf.10000', u'src': u'vhost.conf'})
=> {"failed": true, "item": {"dest": "vhost.conf.10000", "src": "vhost.conf"},
"msg": "AnsibleError: template error while templating string: Missing end of comment tag.
String: for (( i=0;i<${#APP_PORTS[@]};i++ )); do\n echo ${i}\ndone\n"}

이럴 때 {#{{ '{#' }}로 바꿔주면 된다. 참 요상한 내용이 되어버려서 template을 알아보기 힘들지만, jinja2 document에는 escape를 이렇게 하라고 가이드가 되어 있다. T_T

for (( i=0;i<${#APP_PORTS[@]};i++ )); do
  echo ${i}
done

--> 안 이쁘지만 아래처럼 바꾸면 된다.

for (( i=0;i<${{ '{#' }}APP_PORTS[@]};i++ )); do
  echo ${i}
done

참고

별도로 명시하지 않을 경우, 이 블로그의 포스트는 다음 라이선스에 따라 사용할 수 있습니다: Creative Commons License CC Attribution-NonCommercial-ShareAlike 4.0 International License