본문 바로가기
카테고리 없음

[Ansible] docker에러 the input device is not a TTY

by IT맥구리나스 2022. 9. 29.

앤서블을 통해 docker로 설치된 redis의 버전을 출력하는 요구사항을 만들었다.

docker로 설치한 redis버전 조회 명령어

var_redis=`docker ps | grep redis | head -n1 | awk '{print $1}'`
redis_version=`docerk exec -it $var_redis /bin/bash -sh -c "redis-cli --version" | sed -e 's/redis-cli//g'`
echo "redis : $redis_version"

결론 docker exec에서 옵션 t를 뺀다.

 

그런데 이상하게 ansible 결과 출력을 해도 버전값이 나오질 않았다.

서버에 들어가서 스크립트 수동실행해보면 결과값은 귀신 같이 잘나왔다.

이를 분석하기 위해 ansible cmd shell 모듈에서 쉘스크립트 수행 내역 디버깅을 했다.

sh -x check_appversion.sh 2> test.log

그러고나서 디버깅을 해보니 놀랍게도 이상한 에러가 눈에 보였다.

the input device is not a TTY

구글에 검색해보니 docker 스크립트 실행 옵션으로 t를 넣으면 저런 현상이 발생된다고한다.

그래서 t 옵션을 빼고 해보니 잘된다. 찾아보면 쉘이 표시가 되지 않는다고 되어있는데 로컬에서 수행지 잘만 수행된다..

-t, --tty
TTY 모드(pseudo-TTY)를 사용합니다.
Bash를 사용하려면 이 옵션을 설정해야 합니다.
이 옵션을 설정하지 않으면 명령을 입력할 수는 있지만, 셸이 표시되지 않습니다.

결론은 ansible(원격지에서)로 도커 컨테이너에 접속하여 어떤명령어 수행 후 결과를 긁어오려면 t옵션을 빼야한다...

그리고 쉘스크립트 수행시 뭐가 잘 안된다 싶으면 디버깅을 잘해야 한다.

 

쉘스크립트 2> test.log

 

2>는 화면에 보이는 내역까지 전부 test.log로 보내겠다는 뜻이다.

 

반응형

댓글