Contextualization
To contextualize a VM means to configure it at instantiation time. This consists in passing additional parameters to the instantiation command, allowing scripts with specific parameters to be executed during the VM initialization sequence.
Examples of the available options:
add SSH keys,
install software,
configure a site specific storage access,
collect logs.
It is a way to keep a generic image and specialize it at instantiation according to various parameters.
Attention
CC-IN2P3 cloud supports contextualisation by cloud-init. It is therefore necessary that this package is installed in the VM image and properly configured.
Valid input sources
cloud-init command may be served by different types of input files. The most common are:
cloud-configconfiguration filesThey will override the cloud-init VM configuration. These text files start with the following header:
#cloud-config
They will define the
cloud-initmodules to use and their parameters. Their content and their syntax will be described below.- Shell scripts
It is possible to provide
cloud-initwith a shell script, to be automatically executed at the end of the VM startup. These scripts do not require any specialization, and any shell script that has a standard type header like:#!/bin/shprovided to cloud-init will be executed automatically.
- Combined files
It is possible to combine different types of files into one in order to send them to
cloud-init. This is done via thewrite-mime-multipartutility, provided in particular by thecloud-utilspackages. Example:% write-mime-multipart --output=combined-userdata.txt my-user-script.sh my-cloudconfig.txt
where we combine the files
my-user-script.shandmy-cloudconfig.txtintocombined-userdata.txt.
Note
There are other types of files that can be used with cloud-init, for more information you can refer to the referenced cloud-init documentation.
cloud-config files syntax
The cloud-config file consists in 2 main sections:
Configuration elements such
<parameter>: <value>
or
<parameter>: - <value> - <value>
Activated modules, providing various configuration options. In the same way, the list turns up as follows:
cloud_config_modules: - <module1> - <module2>
Among the most useful modules we may address:
SSHconfigure sshd, generate keys and add them to authorized_keys
set-passwordsmodify passwords
runcmdautomatic execution of rc.local command types
mountspartition mounting management
phone_homesend data to an address at the end of the instantiation
Note
Modules are written in python and stored in
/usr/lib/python2.6/site-packages/cloudinit/CloudConfig/
The default cloud-config configuration is the one located in /etc/cloud/cloud.cfg, it will be overridden by the configuration received during the instantiation, as described in the following paragraph.
Many configuration examples are available in
/usr/share/doc/cloud-init/examples/
Execute a script
Depending on the use case:
Provide the script path to the boot command:
% nova boot [...] --user-data /<path>/<script>.sh [...]
or
describe the commands to execute in the
cloudinit.cfgconfiguration file:#cloud-config runcmd: - [ wget, "http://slashdot.org", -O, /tmp/index.html ] - [ sh, -xc, "echo $(date) ': hello world!'" ] [...] cloud_init_modules: - runcmd [...] cloud_final_modules: - scripts-user [...]
then start the instance with the configuration:
% nova boot [...] --user-data /<path>/cloudinit.cfg [...]
Note
Contrary to what indicated in the cloud-init documentation, the runcmd module alone will only create a script from the commands given but will not execute anything. You must add the scripts-user module in the cloud_final_modules section for the script to run.
Examples
Perform specific mounts
create the file
cloud-config.txthaving a mounts section. For example, to mount/dev/vdbdans/scratchwith the options“nosuid,nodev”:#cloud-config [...] mounts: - [ vdb, /scratch, auto, "nosuid,nodev", "1", "2" ] [...] cloud_config_modules: [...] - mounts [...]
for each mount create in this section an entry in table format where the fields are equivalent to those in
/etc/fstab,instantiate a VM with a flavor providing an ephemeral disk, giving the
cloud-config.txtfile:% nova boot --image [...] --flavor [...] --user-data ./cloud-config.txt [...]
Configure the pre-existing
cloud-userand allow SSH connection:#cloud-config user: cloud-user ssh_authorized_keys: - ssh-rsa <key value> ssh_pwauth: True chpasswd: list: | cloud-user:<password> expire: False [...] cloud_config_modules: [...] - ssh - set-passwords [...]configure
cloud-initnot to set the hostname at startup on the instance name:#cloud-config preserve_hostname: true
Note
/devmay be omitted for the following entry types:xvd,sd,hdouvd.If the mount point does not exist, it will be created. Do not forget to list the necessary modules among the actives in
cloud-config.to automatically resize an LVM partition and the volumes contained at the VM creation:
#cloud-config cloud_init_modules: - growpart - [ runcmd, instance ] # The "instance" keyword specifies to run this configuration only once per instance. growpart: mode: growpart # The growpart tool must be present in the image used to create the VM. devices: - '/dev/vda2' # Verify the LVM partititon name in the image runcmd: - 'bash -c "pvresize /dev/vda2"' # Resize the LVM physical volume - 'bash -c "lvresize -r -l +10%FREE rootvg/tmp"' # Resize logical volumes and underlying partitions using a percentage of free space in the volume group - 'bash -c "lvresize -r -l +33%FREE rootvg/usr"' - 'bash -c "lvresize -r -l +25%FREE rootvg/root"' - 'bash -c "lvresize -r -l +100%FREE rootvg/var"' cloud_final_modules: - [ scripts-user, instance ]
References
Online documentation: https://help.ubuntu.com/community/CloudInit.
For the contents details of a
cloud-configfile, check the following file contents on a virtual machine where cloud-init is installed:/usr/share/doc/cloud-init/examples/cloud-config.txt