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:
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 # vim: syntax=yaml # This is a cloud-config file for user-data
packages keyword is used to install packages.
To upgrade them, set
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
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'
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 (
$ 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.