Last updated on February 25, 2023 by Dan Nanni
Cloud-init is an open-source tool for configuring and customizing cloud instances when they first start up. It is used by many cloud providers, including Amazon Web Services (AWS), Google Cloud Platform (GCP), Microsoft Azure, and DigitalOcean. Cloud-init is designed to simplify the process of configuring and customizing cloud instances. It allows you to specify a wide range of configuration options via a cloud-init configuration file. This includes creating a user account, installing software packages and a specific kernel version, configuring networking, setting up SSH keys, etc.
When a cloud instance is started with cloud-init, the configuration specified in a cloud-init configuration file is applied automatically. This can help streamline the process of setting up new cloud instances when there are many, and make it easier to ensure that all instances are configured correctly and securely.
In this tutorial, I will show you how to use cloud-init to set up basic configuration of a Linux-based cloud instance.
Cloud-init uses a YAML-formatted configuration file to configure a cloud instance upon its boot. To create a cloud-init file, you can use any text editor on your local computer. Once a cloud-init file is created, the location where you should upload it will vary depending on which cloud provider you are using, and how you are launching an instance. For example:
In the rest of the tutorial, let's find out how to use cloud-init to configure different settings of your cloud instance. I will use Ubuntu-based cloud instance as an example.
To use cloud-init to set up a user account on a cloud instance, you can include the following in your cloud-init configuration file:
# cloud-config
users:
- name: yourusername
ssh-authorized-keys:
- ssh-rsa YOUR_PUBLIC_KEY_HERE
sudo: ALL=(ALL) NOPASSWD:ALL
In this example, I am going to use SSH key authentication, and hence specify the SSH public key. Just copy and paste your public key. Also, I enable the sudo privilege for the user, and allow the user to run any command as sudo without being prompted for a password.
You want to change the default timezone? No worries. It is as easy as:
# cloud-config timezone: America/New_York
You can find your timezone string with the tzselect command.
Cloud-init supports a wide range of networking including DHCP-based and static networking. I assume that eth0 is the name of the primary network interface of the instance.
To set up DHCP-based networking:
# cloud-config
network:
version: 2
ethernets:
eth0:
dhcp4: true
To manually set up a static IP address and DNS servers:
# cloud-config
network:
version: 2
ethernets:
eth0:
addresses:
- 192.168.1.100/24
gateway4: 192.168.1.1
nameservers:
addresses:
- 8.8.8.8
- 8.8.4.4
Often times you want to install some packages on your VPS. In this case, you can use runcmd
# cloud-config runcmd: - apt update - apt install -y nginx - echo "Hello, world!" > /var/www/html/index.html
Under runcmd, you are supposed to include a list of commands that are executed when the instance starts up. The commands listed under runcmd are only executed the first time ever you start an instance.
If you require a specific kernel version for your cloud instance, cloud-init can get the job done easily. In this example, I choose 5.4.0-87-generic as a preferred kernel version.
# cloud-config packages: - linux-image-5.4.0-87-generic bootcmd: - sed -i 's/^GRUB_DEFAULT=.*/GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 5.4.0-87-generic"/g' /etc/default/grub - update-grub
Under packages, you include a list of packages to install on the instance. In this case, the package we need is linux-image-5.4.0-97-generic. Under bootcmd, you specify a list of commands that are executed at boot time. In this case, I use the sed command to modify the GRUB_DEFAULT setting in the /etc/default/grub file, such that it will boot the specific kernel version that we specify. We also need to run update-grub to modify the GRUB configuration file reflect the new default kernel.
The difference between bootcmd and runcmd is that the the bootcmd section is invoked early during initialization, whereas those commands in the runcmd section are invoked near the end of the init process.
If your instance require accurate clock all the time, you want to enable time synchronization via NTP. With systemd, this can be done easily with timedatectl command.
# cloud-config runcmd: - timedatectl set-ntp true
If you want to create a file (e.g., configuration file) with predefined content, you can also do it with cloud-init. For example, you can create a custom sshd_config and place it /etc/ssh by using the following:
# cloud-config
write_files:
- content: |
# content of sshd_config
Port 17600
HostKey / etc / ssh / ssh_host_rsa_key
HostKey / etc / ssh / ssh_host_ecdsa_key
SyslogFacility AUTHPRIV
PasswordAuthentication no
PermitRootLogin No
AuthorizedKeysFile .ssh / authorized_keys
ChallengeResponseAuthentication no
GSSAPIAuthentication yes
GSSAPICleanupCredentials no
UsePAM yes
X11 Forwarding no
path: /etc/ssh/sshd_config
permissions: 0600
owner: root: root
As you can see, cloud-init is quite flexible and extensible, allowing you to customize the configuration of your instances to meet your specific requirements. Cloud-init includes a wide range of built-in directives for configuring user accounts, network settings, package installation, file management, system configuration, and more!
Got any specific question with cloud-init? Post your question via comment!
This website is made possible by minimal ads and your gracious donation via PayPal or credit card
Please note that this article is published by Xmodulo.com under a Creative Commons Attribution-ShareAlike 3.0 Unported License. If you would like to use the whole or any part of this article, you need to cite this web page at Xmodulo.com as the original source.
Xmodulo © 2023 ‒ About ‒ Write for Us ‒ Feed ‒ Powered by DigitalOcean