You can customise your instance’s creation by providing a user data file.
Cloud-init package is used to manage the initialization of an instance using user data.
It can only act on user data of following types :
The type defines how the data file should start:
#!
#include
#cloud-config
#upstart-job
#cloud-boothook
#part-handler
In this documentation, we will focus on the cloud-config type.
But you can read more about the cloud-init documentation:
https://cloudinit.readthedocs.io/en/latest/topics/format.html
Cloud-config is an easy way to define tasks to be performed when the instance is launched.
A cloud-config file must be written with valid yaml syntax.
First, the file must begin with #cloud-config
.
#cloud-config
# vim: syntax=yaml
# This is a cloud-config file for user-data
The packages
keyword is used to install packages.
To upgrade them, set package_upgrade
to true
.
Then, all you have to do is list the packages to install.
package_upgrade: true
packages:
- aptitude
- linuxlogo
- vim
- ssh
- python
- gcc
- g++
Note that you do not need to specify the repository to collect them from.
By using keyword users
, you can add users.
These users can then access the instance using their public key.
users:
- name: "user1"
gecos: "user 1"
sudo: ['ALL=(ALL) NOPASSWD:ALL']
groups: [ wheel , sudo ]
homedir: "/home/user1"
shell: "/bin/bash"
ssh-authorized-keys: [ < public_key_user1 > ]
- name: "ubuntu"
sudo: ['ALL=(ALL) NOPASSWD:ALL']
groups: [ wheel , sudo ]
homedir: "/home/ubuntu"
shell: "/bin/bash"
ssh-authorized-keys: [ < public_key_user1 > , < public_key_user2 > ]
- name: "user2"
gecos: "user 2"
sudo: ['ALL=(ALL) NOPASSWD:ALL']
groups: [ wheel , sudo ]
homedir: "/home/user2"
shell: "/bin/bash"
ssh-authorized-keys: [ < public_key_user2 > ]
It is possible to write files on first launch with write_files
.
Then, please specify its content, its access path, its permissions and its owner.
write_files:
- content: |
#!/bin/bash
var="Hello World"
echo "$var"
owner: root:root
path: /home/ubuntu/hello.sh
permissions: '0777'
- content: |
#!/bin/bash
now="$(date)"
computer_name="$(hostname)"
echo "Current date and time : $now"
echo "Computer name : $computer_name"
owner: root:root
path: /home/ubuntu/Hello/date.sh
permissions: '0777'
The runcmd
keyword lists commands you want to run in a terminal.
runcmd:
# Customize bash for user
- echo "linuxlogo" >> /home/user/.bashrc
- source /home/user/.bashrc
# Run two previous scripts
- bash /home/ubuntu/hello.sh
- bash /home/ubuntu/Hello/date.sh
A final message can be displayed in the launch logs of an instance.
This will show that all the cloud-init correctly ran.
final_message: "The system is finally up, after $UPTIME seconds"
Creating a custom instance is done in the same way as for a basic instance.
Just add the user data file option (--user-data cloud-config
).
$ openstack server create \
--image <image> \
--flavor <flavor> \
--user-data cloud-config \
--network <project>-int-net \
--security-group <group> \
--key-name <rsa-key> \
<instance-name>
You can start an instance from a volume rather than an image.
For this, use the instance creation command
$ openstack server create
with the following options
--block-device
: allows to boot from an existing source (image, volume or snapshot).--swap
: joined a swap disk to instance.--ephemeral
: joined an ephemeral disk to instance.To learn more about creating instance from volume, please refer to the OpenStack documentation page.
OpenStack documentation