Contextualization¶
✨ Introduction¶
For contextualization, we distinguish between so called meta-data and user-data.
The meta-data is provided by the cloud infrastructure and is not modifiable by the user.
For example, meta-data includes the instance ID as issued by the cloud infrastructure and the virtual machines assigned network parameters.
The user-data is provided by the user on creation of the virtual machine.
User data is a blob of data that the user can specify when they launch an instance. The instance can access this data through the metadata service or config drive. Commonly used to pass a shell script that the instance runs on boot.
🔄 Metadata¶
Nova itself needs to pass information to the instance via its internal implementation of the metadata system. Such information includes the network configuration for the instance, as well as the requested hostname for the instance. This happens by default and requires no configuration by the user or deployer.
$ curl http://169.254.169.254/2009-04-04/meta-data
ami-id
ami-launch-index
ami-manifest-path
block-device-mapping/
hostname
instance-action
instance-id
instance-type
local-hostname
local-ipv4
placement/
public-hostname
public-ipv4
public-keys/
reservation-id
security-groups
$ curl http://169.254.169.254/2009-04-04/meta-data/hostname
amu-fenic01.cppm-cloud.in2p3.fr
$ curl http://169.254.169.254/2009-04-04/meta-data/local-ipv4
192.168.1.17
$ curl http://169.254.169.254/2009-04-04/meta-data/public-ipv4
134.158.21.25
⚙️ User Data¶
You can place user data in a local file and pass it through the --user-data
$ openstack server create --image ubuntu-cloudimage --flavor 1 --user-data mydata.file VM_INSTANCE
Ex:
$ echo -n "Hello World ..... " `date` > my_user_data.txt
$ openstack server create --flavor m1.medium --image Fedora-27
--nic net-id=$OS_NET --user-data my_user_data.txt
--security-group default --key-name jhondoe-key my_test2
The instance can retrieve user-data by querying the metadata service through either the OpenStack metadata API or the EC2 compatibility API:
Ex:
$ curl http://169.254.169.254/2009-04-04/user-data
Hello World ..... Wed Apr 11 12:10:13 CEST 2018
Cloud Init¶
OpenStack enables automatic setup of new instances using Cloud-init. Cloud-init runs on first boot of every new instance and initializes it according to a provided script or config file.
Using the cloud-config syntax many different actions are possible. Add rpm's, users, configure mount points, initialize Puppet and much more is posible.
For example, the Nginx initialization with a bash script:
$ cat test.sh
!/bin/bash
yum -y install epel-release
yum -y install nginx
yum -y install curl
timedatectl set-timezone 'Europe/Paris'
systemctl enable nginx
systemctl start nginx
$ openstack server create --flavor m1.medium --image Fedora-27
--nic net-id=$OS_NET --user-data test.sh --security-group default
--key-name jhondoe-key my_test2
Or better, with the following cloud-config statements:
$ cat nginx.cloud
cloud-config
packages:
- epel-release
- nginx
- curl
runcmd:
- timedatectl set-timezone 'Europe/Paris'
- systemctl enable nginx
- systemctl start nginx
After that do you use the --user-data capability
$ openstack server create --flavor m1.medium --image Fedora-27
--nic net-id=$OS_NET --user-data nginx.cloud
--security-group default --key-name jhondoe-key my_test2
To get a deeper understanding cloud-init Documentation