Honeybadger에서는 모든 서버의 APT 패키지 업데이트를 놓치지 않고 관리하기 위해 apticron을 사용해 왔습니다. 처음에는 apticron 알림 메일을 제 받은편지함으로 받도록 설정했지만, 어느 순간부터는 이 메일들을 팀의 Slack 알림 채널로 받아보는 편이 낫겠다고 생각하게 되었습니다. Slack에는 이메일을 수신해 채널에 게시해 주는 유용한 이메일 앱이 있어 한번 사용해 보았습니다. 실제로 잘 작동했지만, 이메일이 파일 형태로 표시되는 점과 메일 헤더 등 불필요한 잡음이 많다는 점이 마음에 들지 않아, 좀 더 만족스러운 방식을 직접 만들기로 했습니다. 그렇게 탄생한 것이 바로 AptWatcher입니다.
AptWatcher란 무엇인가?
AptWatcher는 주말 동안 빠르게 만든 매우 심플한 앱으로, 서버들의 APT 패키지 업데이트 정보를 Slack 알림 채널로 전달하는 역할을 합니다. 하는 일은 단순합니다. 서버에서 업데이트 대기 중인 패키지 이름과 버전 목록을 수신하는 HTTP 엔드포인트를 제공하고, 전달받은 목록을 해당 서버에서 이전에 받은 목록과 비교한 뒤, 기존 목록에 없던 새로운 패키지가 발견되면 incoming webhook을 통해 Slack으로 전송하는 것입니다. 덕분에 팀원들은 복잡한 설정 없이도 보안 업데이트를 포함한 패키지 변경 사항을 실시간으로 파악할 수 있습니다.
패키지 목록은 서버에서 다음 명령어로 생성할 수 있습니다:
$ apt-get upgrade -s | grep ^Inst | awk '{ print $2,$3; }' | tr -d '[]'
위 명령을 실행하면 다음과 같은 패키지 목록이 생성됩니다:
libxml2-dev 2.9.1+dfsg1-3ubuntu4.7
libxml2 2.9.1+dfsg1-3ubuntu4.7
libnl-genl-3-200 3.2.21-1ubuntu1.1
libnl-3-200 3.2.21-1ubuntu1.1
그리고 동일한 목록이 AptWatcher를 거쳐 Slack에는 이렇게 표시됩니다:

설치 방법
설치는 저장소 README에 있는 Heroku 버튼을 클릭하는 것만큼 간단합니다. 이후 모든 서버에 크론(cron) 작업을 추가해 패키지 변경 사항을 AptWatcher에 보고하도록 설정하면 됩니다. 호스트 레코드는 서버들로부터 보고가 도착하는 대로 AptWatcher에 자동으로 생성되므로, 별도의 등록 절차가 필요하지 않습니다.
Honeybadger에서는 Ansible로 인프라 작업을 자동화하고 있어서, apticron을 AptWatcher로 교체할 때는 빠르고 실용적인 방식을 택했습니다:
$ ansible all -m apt -a 'pkg=apticron state=removed'
$ ansible all -m cron -a "name='Report pending apt changes' special_time=daily job='apt-get upgrade -s | grep ^Inst | awk \'{ print \$2,\$3; }\' | tr -d \'[]\' | curl -u user:pass --data-binary @- https://our.aptwatcher.url/report/\$(hostname) &> /dev/null'"
첫 번째 명령으로 기존 apticron을 제거하고, 두 번째 명령으로 매일 패키지 목록을 생성해 AptWatcher URL로 전송하는 크론 작업을 등록합니다. 여기까지 마쳤다면 이제 패키지 보고가 Slack에 나타나기만을 기다리면 됩니다. 정말 간단하죠!