Cloudera Manager 는 REST API 로 클러스터와 호스트의 상태를 돌려준다. 화면을 열지 않고 상태를 주기적으로 확인하거나 외부 모니터링에 연동할 때 쓴다. 엔드포인트는 Cloudera Manager 와 같은 포트를 쓴다 — TLS 를 켠 환경은 7183, 켜지 않았으면 7180 이다.
API 경로에는 버전이 들어간다. 버전은 Cloudera Manager 릴리스마다 올라가므로 고정해 쓰지 말고 먼저 물어본다.
CM_HOST=<cm-host>
CM_PORT=7183
curl -s -k -u "${CM_USER}:${CM_PASSWORD}" "https://${CM_HOST}:${CM_PORT}/api/version"
v54 처럼 문자열 하나가 돌아온다. 이 값을 이후 경로에 넣는다.
CM_API=$(curl -s -k -u "${CM_USER}:${CM_PASSWORD}" "https://${CM_HOST}:${CM_PORT}/api/version")
BASE="https://${CM_HOST}:${CM_PORT}/api/${CM_API}"
curl -s -k -u "${CM_USER}:${CM_PASSWORD}" "${BASE}/clusters" | jq -r \
'.items[] | "\(.displayName)\t\(.fullVersion)\t\(.entityStatus)"'
entityStatus 는 GOOD_HEALTH · CONCERNING_HEALTH · BAD_HEALTH · NONE 등으로 돌아온다. 서비스 단위로 더 내려가려면 다음을 쓴다.
curl -s -k -u "${CM_USER}:${CM_PASSWORD}" "${BASE}/clusters/<cluster-name>/services" | jq -r \
'.items[] | "\(.name)\t\(.serviceState)\t\(.healthSummary)"'
클러스터 이름에 공백이 들어 있으면 URL 인코딩해야 한다.
curl -s -k -u "${CM_USER}:${CM_PASSWORD}" "${BASE}/hosts" | jq -r \
'.items[] | "\(.hostname)\t\(.ipAddress)\t\(.hostId)"'
health 와 마지막 heartbeat 까지 보려면 view=full 을 붙인다.
curl -s -k -u "${CM_USER}:${CM_PASSWORD}" "${BASE}/hosts?view=full" | jq -r \
'.items[] | "\(.hostname)\t\(.healthSummary)\t\(.lastHeartbeat)"'
개별 호스트는 hostId 로 조회한다. 호스트 이름이 아니라 hostId 라는 점에 주의한다.
curl -s -k -u "${CM_USER}:${CM_PASSWORD}" "${BASE}/hosts/<hostId>?view=full"
건강하지 않은 클러스터가 있으면 후속 동작을 수행하는 형태다. 자격 증명은 스크립트에 넣지 않고 권한을 600 으로 제한한 별도 파일에서 읽는다.
#!/bin/bash
set -euo pipefail
CM_HOST=<cm-host>
CM_PORT=7183
CRED_FILE=/etc/cloudera/cm-api.cred # "user:password" 한 줄, chmod 600
CM_CRED=$(cat "${CRED_FILE}")
CM_API=$(curl -s -k -u "${CM_CRED}" "https://${CM_HOST}:${CM_PORT}/api/version")
BASE="https://${CM_HOST}:${CM_PORT}/api/${CM_API}"
BAD=$(curl -s -k -u "${CM_CRED}" "${BASE}/clusters" |
jq -r '.items[] | select(.entityStatus != "GOOD_HEALTH") | .displayName')
if [ -n "${BAD}" ]; then
echo "unhealthy clusters:"
echo "${BAD}"
exit 1
fi
echo "all clusters healthy"
-k 는 서버 인증서 검증을 건너뛴다. 운영에서는 CA 인증서를 신뢰 저장소에 넣고 --cacert 로 지정한다.
읽기 전용 점검에는 Full Administrator 가 아니라 Read-Only 역할의 계정을 쓴다. 비밀번호를 명령줄 인자로 넘기면 프로세스 목록에 노출되므로 -u 에 파일에서 읽은 값을 쓰거나 .netrc 를 쓴다.
Cloudera Manager 계정이 LDAP 연동이면 API 도 같은 계정 체계를 따른다.