Supported commands: ls, cd ${PATH}

cloud-init User-Data Script Re-run

Aug. 5, 2021

User-Data Script의 동작 방식

오픈스택 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인

  1. Generator
  2. Local
  3. Network
  4. Config
  5. Final

중 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