← 글 목록

Ansible에 의한 자동 재부팅, 이렇게 제거했어요!

/ 5분 분량

Ansible로 서버를 관리하다 보면 예상치 못한 재부팅 때문에 당황할 때가 있습니다. 이번에 저도 그런 상황을 겪었는데, 직접 원인을 찾고 해결했던 과정을 정리해보려고 합니다.

학습 주제

  • 공부 주제: Ansible에 의한 자동 재부팅 원인 파악 및 제거
  • 학습 날짜: 2026년 7월 14일

탐구 과정

처음에는 어떤 작업 때문에 서버가 재부팅되는지 전혀 감이 잡히지 않았습니다. Ansible 관련 설정이 문제일 거라는 막연한 추측만 있었죠. 특히 마스터 노드에 SSH 접속이 원활하지 않아 초기 진입부터 쉽지 않았습니다. 로컬 네트워크 환경이라서 외부 IP로는 접속이 안 되고, 로컬 IP로 접속하려니 SSH 키 인증 문제로 계속 막혔습니다.

이 문제를 해결하기 위해 마스터 노드에 SSH 키를 등록하는 과정이 필요했습니다. 다행히 마스터 노드에 접속할 수 있는 권한이 생긴 후에는 crontab과 Ansible playbook 설정을 꼼꼼히 확인하며 재부팅을 유발하는 정확한 로직을 찾아낼 수 있었습니다.

핵심 학습 내용

재부팅 원인: crontab과 Ansible Playbook의 연계

가장 핵심적인 원인은 매일 새벽 1시에 실행되도록 설정된 crontab이었습니다. 이 crontab은 ~/cluster-admin/ansible/run-update.sh라는 스크립트를 실행시켰는데, 이 스크립트 안에 재부팅을 유발하는 Ansible playbook 로직이 숨어 있었습니다.

해당 Ansible playbook은 다음과 같은 과정을 거쳐 재부팅을 결정했습니다.

- name: Check if reboot is required
  stat:
    path: /var/run/reboot-required
  register: reboot_required

- name: reboot
  reboot: ...
  when: reboot_required.stat.exists

이 코드는 /var/run/reboot-required 파일이 존재하는지 확인하고, 존재한다면 시스템 업데이트 등으로 인해 재부팅이 필요하다고 판단하여 Ansible이 자동으로 재부팅을 실행하도록 지시하는 부분이었습니다. unattended-upgrades 설정 자체는 이미 꺼져 있었기 때문에, 이 crontab과 Ansible playbook의 조합이 문제였던 거죠.

문제 해결: crontab 항목 제거

가장 확실한 해결책은 재부팅을 트리거하던 crontab 항목을 삭제하는 것이었습니다. 이 작업을 통해 더 이상 매일 새벽 1시에 자동 재부팅이 시도되지 않도록 설정했습니다.

참고: cluster-admin 폴더는 이미 삭제되어 있어 크론 작업이 실행되어도 실제로 재부팅 로직이 작동하진 않는 상태였지만, 폴더가 다시 생성되면 언제든 재발할 수 있는 잠재적인 원인이었습니다.

이해한 내용

이번 경험을 통해 자동 재부팅은 단순히 시스템 설정 하나만 보고 판단할 것이 아니라, cron 작업과 연결된 스크립트, 그리고 그 스크립트가 실행하는 자동화 도구(여기서는 Ansible)의 복잡한 연계 속에서 발생하는 문제일 수 있다는 점을 확실히 이해했습니다. 특히 /var/run/reboot-required 파일의 존재 여부가 재부팅 결정의 중요한 트리거가 된다는 것을 알게 된 점도 유익했습니다.

실전 적용

  • 이 지식을 어디에 적용할 수 있을지:
    • 서버 자동화 환경에서 예상치 못한 재부팅 발생 시, crontab과 Ansible/스크립트 연동을 가장 먼저 의심해볼 수 있습니다.
    • 새로운 자동화 스크립트나 플레이북을 작성할 때, 시스템 재부팅을 유발할 수 있는 로직이 포함되지 않도록 주의해야 합니다.
    • 안정적인 운영을 위해 주기적인 서버 상태 점검 시 crontab과 관련 스크립트 설정을 함께 검토하는 것이 좋습니다.
  • 실습 계획:
    • 간단한 테스트 환경을 구축하여 /var/run/reboot-required 파일을 생성하고, Ansible playbook이 이를 감지하여 재부팅을 시도하는지 직접 실습해볼 예정입니다.
  • 응용 아이디어:
    • 특정 조건에서만 재부팅을 트리거하도록 Ansible playbook을 좀 더 정교하게 작성하는 방법을 연구해볼 수 있습니다. (예: 특정 업데이트 후 필수적인 경우에만 재부팅)

추가 학습 계획

  • 더 깊이 공부하고 싶은 부분:
    • Ansible의 reboot 모듈 옵션들을 더 자세히 살펴보고, 재부팅 시 발생할 수 있는 다양한 상황에 어떻게 대처하는지 알고 싶습니다.
    • unattended-upgrades와 유사한 다른 자동 업데이트/재부팅 메커니즘에 대해서도 학습할 계획입니다.
  • 관련 자료 찾기:
    • Ansible 공식 문서에서 reboot 모듈 관련 내용을 좀 더 깊이 파고들 예정입니다.
    • 리눅스 시스템 관리 관련 커뮤니티에서 유사한 문제 사례들을 찾아보며 다양한 해결책을 익힐 것입니다.
  • 다음 학습 주제:
    • Ansible을 활용한 서버 구성 관리 자동화 심화 학습 (예: 서비스 배포, 설정 변경 자동화)