About the cloud-config file¶
The #cloud-config
file is a type of user data that cloud-init can consume
to automatically set up various aspects of the system. It is commonly referred
to as cloud config. Using cloud config to configure your machine leverages
the best practices encoded into cloud-init’s modules in a distribution-agnostic
way.
Note that networks are not configurable via the #cloud-config
file because
network configuration comes from the cloud.
How do I create a cloud-config file?¶
The cloud-config file uses YAML version 1.1. The file is composed of a header and one or more modules.
The header: The first line must start with
#cloud-config
. This line identifies the file to cloud-init and ensures that it will be processed as intended.The modules: After the header, every aspect of the system’s configuration is controlled through specific cloud-init modules.
Most modules are specified through the use of one or more top-level keys, and the configuration options are set using YAML key-value pairs or list types, according to the config schema. It follows this general format:
#cloud-config
top-level-key:
config-key-1: config-value-1
config-key-2: config-value-2
list-type:
- list-value-1
additional-list-value-1
- list-value-2
The order of the top-level keys is unimportant – they can be written in any order, and cloud-init handles the order of operations.
Let us consider a real example using the Keyboard
module. The top-level key for this module is keyboard:
, and beneath that
are the various configuration options for the module shown as key-value pairs:
#cloud-config
keyboard:
layout: us
model: pc105
variant: nodeadkeys
options: compose:rwin
Not all modules require a top-level key, and will run on the system anyway if certain conditions are met. A full list of modules can be found on our modules page. This list also shows the valid schema for every module, and simple YAML examples.
Checking your cloud-config file¶
Once you have constructed your cloud-config file, you can check it against the cloud-config validation tool. This tool tests the YAML in your file against the cloud-init schema and will warn you of any errors.
Example cloud-config file¶
The following code is an example of a complete user data cloud-config file. The cloud-config example library contains further examples that can be copy/pasted and adapted to your needs.
#cloud-config
# Basic system setup
hostname: example-host
fqdn: example-host.example.com
# User setup configuration
users:
- name: exampleuser
gecos: Example User
sudo: ['ALL=(ALL) NOPASSWD:ALL']
groups: sudo
homedir: /home/exampleuser
shell: /bin/bash
ssh_authorized_keys:
- ssh-rsa AAAAB3...restofpublickey user@host
# Change passwords for exampleuser using chpasswd
chpasswd:
expire: false
users:
- {name: exampleuser, password: terriblepassword12345, type: text}
# Package management
package_update: true
package_upgrade: true
packages:
- git
- nginx
- python3
# Commands to run at the end of the cloud-init process
runcmd:
- echo "Hello, world!" > /etc/motd
- systemctl restart nginx
- mkdir -p /var/www/html
- echo "<html><body><h1>Welcome to the party, pal!</h1></body></html>" > /var/www/html/index.html
# Write files to the instance
write_files:
- path: /etc/example_config.conf
content: |
[example-config]
key=value
- path: /etc/motd
content: |
Some text that will appear in your MOTD!
# Final message, shown after cloud-init completes
final_message: "The system is up, after $UPTIME seconds"
# Reboot the instance after configuration
power_state:
mode: reboot
message: Rebooting after initial setup
timeout: 30
condition: True