Cloud-Init에서 runcmd와 패키지 순서
Source: Dev.to
질문
runcmd에 지정된 명령을 Cloud‑Init의 packages 모듈을 통해 관련 패키지가 설치되기 앞에 실행하려면 어떻게 해야 할까요? 어떤 모듈이 먼저 실행되나요?
예시
#cloud-config
package_update: true
package_upgrade: true
runcmd:
- systemctl enable --now qemu-guest-agent.service
packages:
- qemu-guest-agent
이 패턴은 VM을 프로비저닝할 때 흔히 사용됩니다(예: QEMU/KVM 위의 Terraform libvirt 제공자). runcmd 항목은 qemu-guest-agent 패키지가 아직 설치되지 않았음에도 불구하고 qemu-guest-agent.service를 활성화하고 시작하려고 합니다. 게스트 에이전트는 Ansible의 동적 인벤토리와 같은 도구가 호스트 정보를 조회할 수 있도록 초기 단계에서 필요합니다.
왜 작동하는가
혼란은 Cloud‑Init 모듈 단계가 문서화된 방식에서 비롯됩니다:
- Config 단계 –
runcmd가 나열되는 곳. - Final 단계 –
packages가 설치되고scripts_user모듈이 실행되는 곳.
runcmd가 Config 단계에 나타나지만, runcmd 아래의 명령은 즉시 실행되지 않습니다. Cloud‑Init은 runcmd 목록을 나중에 실행될 스크립트 집합으로 간주하며, 구체적으로 Final 단계의 scripts_user 모듈에 의해 실행됩니다.
따라서 실행 순서는 다음과 같습니다:
- 패키지 설치 (
packages모듈) – Final 단계. - 사용자 스크립트 (
scripts_user모듈) – Final 단계에서runcmd명령을 실행합니다.
scripts_user가 systemctl enable --now qemu-guest-agent.service 명령을 실행할 때는 이미 qemu-guest-agent 패키지가 설치되어 서비스 파일이 존재하므로 명령이 성공합니다.