This Platform9 OpenStack tutorial describes tips on using various options to customize a virtual machine using cloud-init.
Customize Virtual Machine Hostname
Virtual machines deployed using cloud-init enabled images will by default be configured with hostname created using the name given to the virtual machine, and a randomization suffix.
Set Default Password and Inject Custom Script Using User Data
Paste the configuration above to the cloud-init config text area:
where:
IMPORTANT
The first line is NOT a comment and should not be skipped or modified. It is a directive indicating that the content that follows should be merged with cloud.cfg that the virtual machine instance already has.
Attention
This is a YAML file. Be careful with the YAML syntax around spacing. Failing to include appropriate spacing where required will result in silent failures (For example, inability to logon to the instance).
Tip
Verify the YAML syntax by writing small sample python code such as this:
The output should be a Python dict string representation of the above YAML file.
'winterwonderland' is the desired default password you wish to set for this virtual machine
'runcmd' is a list of commands you would like to inject into this virtual machine. Each element can be a string or another list (like execev). Following article offers comprehensive details: Cloud-Init: Run commands on first boot.
Finally, invoke Nova command via CLI or REST API to create a new instance, passing the extra parameters for customization.
Inject SSH Key-Pair into Virtual Machine
First, generate a new ssh key pair to be used for the new virtual machine:
Now add the key pair to Nova:
List key pairs registered with Nova:
Now with nova boot command you can optionally pass the key-name as the argument:
That's it. Once the virtual machine instance is active, you can ssh into the instance using the private key.
Example cloud-config File with Comments
Note
Some features only work with cloudinit >= v0.7.5 (Ubuntu 14 or newer, and CentOS 7.x)
{'password': 'winterwonderland', 'chpasswd': {'expire': False}, 'ssh_pwauth': True, 'runcmd': [['sh', '-c', 'echo "Hello World from PF9" > /tmp/pf9.txt']]}
# format
# nova boot --config-drive=true --image <name of the image> --flavor <flavor-id> --nic net-id=<network id to connect> --user-data
<path to user-data file> <name of the instance>
# example
nova boot --config-drive=true --image ubuntu-16.04-cloudimg.img --flavor 2 --nic net-id=c3454717-f813-4419-9203-ceb78b0aa3f9 --user-data /tmp/pf9-user-data.txt pf9-ubuntu-test-1
ssh-keygen -t rsa -C <your email address>
# format
# nova keypair-add -p
<path to the public key> <name of the key>
# example
nova keypair-add -p ~/.ssh/id_rsa.pub rparikh-ssh