initialisation du cloud
cloud-init est l’outil standard du secteur pour l’initialisation des instances cloud, complétant automatiquement la configuration du système au premier démarrage. Ubuntu 26.04 Server est livré avec cloud-init préinstallé et prend en charge les principales plates-formes cloud telles qu’AWS, Azure, GCP et autres.
Comment ça marche
cloud-init passe par les étapes suivantes lors du démarrage de l’instance :
- Générateur – Détecte si l’instance s’exécute dans un environnement cloud
- Local – Obtient la configuration réseau à partir de sources de données locales
- Réseau – Récupère les métadonnées et les données utilisateur
- Config - Exécute les modules de configuration
- Final - Exécute les modules finaux (par exemple, exécution de scripts)
# Check cloud-init version
cloud-init --version
# Check cloud-init status
cloud-init status
# View detailed status
cloud-init status --longSources de données
Métadonnées
Métadonnées d’instance fournies par la plateforme cloud, y compris l’ID d’instance, l’adresse IP, le nom d’hôte, etc. :
# Retrieve metadata on AWS EC2 (IMDSv2)
TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600")
curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/
# Retrieve metadata on GCP
curl -H "Metadata-Flavor: Google" http://metadata.google.internal/computeMetadata/v1/
# Retrieve metadata on Azure
curl -H "Metadata: true" "http://169.254.169.254/metadata/instance?api-version=2021-02-01"Données utilisateur
Configuration d’initialisation définie par l’utilisateur qui prend en charge plusieurs formats.
Configuration des données utilisateur
Format Cloud-config (le plus courant)
Un fichier YAML commençant par #cloud-config :
#cloud-config
# Set hostname
hostname: web-server-01
fqdn: web-server-01.example.com
# Create users
users:
- name: deploy
groups: sudo, docker
shell: /bin/bash
sudo: ALL=(ALL) NOPASSWD:ALL
ssh_authorized_keys:
- ssh-ed25519 AAAA... deploy@workstation
- name: monitor
groups: []
shell: /bin/bash
ssh_authorized_keys:
- ssh-ed25519 AAAA... monitor@management
# Set timezone
timezone: America/New_York
# NTP configuration
ntp:
enabled: true
servers:
- pool.ntp.org
- time.google.com
# Locale
locale: en_US.UTF-8
# Change APT mirror
apt:
primary:
- arches: [default]
uri: http://archive.ubuntu.com/ubuntu
# Install packages
packages:
- nginx
- docker.io
- fail2ban
- htop
- curl
- vim
# Upgrade all packages
package_update: true
package_upgrade: true
package_reboot_if_required: true
# Write files
write_files:
- path: /etc/nginx/sites-available/default
content: |
server {
listen 80;
server_name _;
root /var/www/html;
index index.html;
}
owner: root:root
permissions: '0644'
- path: /etc/sysctl.d/99-custom.conf
content: |
net.ipv4.ip_forward = 1
net.core.somaxconn = 65535
owner: root:root
permissions: '0644'
# Run commands (executed during cloud-init config stage)
runcmd:
- sysctl -p /etc/sysctl.d/99-custom.conf
- systemctl enable --now nginx
- systemctl enable --now fail2ban
- ufw allow ssh
- ufw allow 80/tcp
- ufw allow 443/tcp
- ufw --force enable
# Enable/disable SSH password login
ssh_pwauth: false
# SSH key configuration
ssh_keys:
ed25519_private: |
-----BEGIN OPENSSH PRIVATE KEY-----
...
-----END OPENSSH PRIVATE KEY-----
ed25519_public: ssh-ed25519 AAAA...
# Set passwords (hashed)
chpasswd:
expire: false
users:
- name: deploy
type: RANDOM
# Final message
final_message: "Cloud-init complete! Took $UPTIME seconds."
# Post-boot action
power_state:
mode: reboot
message: "cloud-init configuration complete, rebooting..."
timeout: 30
condition: trueFormat de script shell
Commençant par #!/bin/bash :
#!/bin/bash
set -euxo pipefail
# Update the system
apt update && apt upgrade -y
# Install base tools
apt install -y nginx docker.io
# Configure the firewall
ufw allow ssh
ufw allow 80/tcp
ufw --force enable
# Custom script
echo "Setup complete at $(date)" > /var/log/cloud-init-custom.logFormat multi-parties (MIME multi-parties)
Combinez plusieurs formats :
# Use the cloud-init tool to create a multi-part message
cloud-init devel make-mime \
--attach script.sh:text/x-shellscript \
--attach config.yaml:text/cloud-config \
> combined-userdata.txtCas d’utilisation courants
Initialiser un environnement Docker
#cloud-config
packages:
- docker.io
- docker-compose-v2
groups:
- docker
users:
- name: deploy
groups: sudo, docker
shell: /bin/bash
sudo: ALL=(ALL) NOPASSWD:ALL
ssh_authorized_keys:
- ssh-ed25519 AAAA...
write_files:
- path: /etc/docker/daemon.json
content: |
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
runcmd:
- systemctl enable --now docker
- docker pull nginx:alpineInitialiser les disques
#cloud-config
disk_setup:
/dev/vdb:
table_type: gpt
layout: true
overwrite: false
fs_setup:
- label: data
filesystem: ext4
device: /dev/vdb1
overwrite: false
mounts:
- ["/dev/vdb1", "/data", "ext4", "defaults,noatime", "0", "2"]
runcmd:
- mkdir -p /dataRejoindre un cluster
#cloud-config
runcmd:
- curl -sfL https://get.k3s.io | K3S_URL=https://master:6443 K3S_TOKEN=mytoken sh -Tests locaux
Utilisation du multipass
# Install Multipass
sudo snap install multipass
# Launch an instance with cloud-config
multipass launch 26.04 --name test --cloud-init cloud-config.yaml
# Enter the instance
multipass shell test
# View cloud-init logs
multipass exec test -- cat /var/log/cloud-init-output.logUtiliser LXD
# Test cloud-init via LXD
lxc launch ubuntu:26.04 test --config=user.user-data="$(cat cloud-config.yaml)"
lxc exec test -- cloud-init status --wait
lxc exec test -- cat /var/log/cloud-init-output.logValider la configuration localement
# Validate cloud-config syntax
cloud-init schema --config-file cloud-config.yaml
# Use the devel subcommand for debugging
cloud-init devel render /path/to/userdata.yamlJournaux et débogage
# Main log file
sudo cat /var/log/cloud-init.log
# Output log
sudo cat /var/log/cloud-init-output.log
# View executed modules
sudo cat /run/cloud-init/result.json
# View user data
sudo cat /var/lib/cloud/instance/user-data.txt
# View instance data
sudo cloud-init query --all
# Query specific fields
sudo cloud-init query instance_id
sudo cloud-init query region
sudo cloud-init query local_hostnameRéexécutez cloud-init
# Clear cloud-init state (for testing)
sudo cloud-init clean
# Clear and reboot to re-execute
sudo cloud-init clean --reboot
# Clear logs only
sudo cloud-init clean --logs
# Manually trigger specific stages
sudo cloud-init init
sudo cloud-init modules --mode config
sudo cloud-init modules --mode finalDésactiver l’initialisation du cloud
Dans les environnements non cloud, vous pouvez désactiver cloud-init :
# Method 1: Create a disable marker file
sudo touch /etc/cloud/cloud-init.disabled
# Method 2: Via GRUB kernel parameter
# Add the following to GRUB_CMDLINE_LINUX in /etc/default/grub:
# cloud-init=disabled
# Method 3: Uninstall
sudo apt remove cloud-init -y
sudo rm -rf /etc/cloud /var/lib/cloud