Supported commands: ls, cd ${PATH}
오픈스택 ubuntu 이미지를 기준으로 작성
1.사용자가 metadata service나 config drive에 데이터와 스크립트를 제공한다.
2.cloud-init이 VM이 오픈스택이라는 것을 discovery한다.
3.cloud-init이 지정된 metadata_urls(default: [’http://169.254.169.254’])에 접근한다.
4.cloud-init -> neutron-metadata-agent -> nova-api -> Meta-Data, User-Data에서 정보를 받아오고
5.이 정보는 /var/lib/cloud/instances(-> /var/lib/cloud/instance 심볼릭 링크)에 저장된다.
6.이중 사용자 스크립트의 경우 cloud-init의 boot stage인
중 5번의 cloud-final.service에서 동작을 하는 구조이다.
deploy@vm-instance:~$ systemctl cat cloud-init.target
# /lib/systemd/system/cloud-init.target
# cloud-init target is enabled by cloud-init-generator
# To disable it you can either:
# a.) boot with kernel cmdline of 'cloud-init=disabled'
# b.) touch a file /etc/cloud/cloud-init.disabled
[Unit]
Description=Cloud-init target
After=multi-user.target
# multi-user.target의 run level은 2 3 4로 cloud-init은다른 서비스들이 뜨고 나서 작동하며
# 스크립트에서는 runlevel 명령어에서 N 5가 출력된다.
ref:
https://docs.openstack.org/nova/ussuri/user/metadata.html#user-data
https://cloudinit.readthedocs.io/en/latest/topics/boot.html#final
따라서 아래와 같은 스크립트를 실행할 수 있다.
#!/bin/bash
apt update
apt -y install apache2
cat <<EOF > /var/www/html/index.html
<html><body><h1>Hello World</h1>
<p>This page was created from a startup script.</p>
<p>"$(date +%s)"</p>
</body></html>
EOF
스크립트 실행 로그 확인
오픈스택의 경우 cloud-init의 로그를 관찰해야 한다.
cat /var/log/syslog
sudo journalctl -u cloud-final.service
스크립트 재실행
cloud-init을 활용하면 실행 중인 인스턴스에서 스크립트 재실행이 가능하다.
cloud-init clean
cloud-init init
# cloud-final.service에서 user_data의 스크립트가 동작한다.
cloud-init modules --mode final
re-run datasource detection and cloud-init
sudo DI_LOG=stderr /usr/lib/cloud-init/ds-identify --force
sudo cloud-init clean --logs
sudo cloud-init init --local
sudo cloud-init init