Knowledge base

Do the first-boot work with cloud-init

Attach a user-data document to the order and the instance arrives with your user, your key, your packages and your firewall already in place.

Wat er draait en wanneer

Elke Linux-image voorziet cloud-init. Bij de eerste start leest het de user-data die aan je bestelling is gekoppeld, past het één keer toe en schrijft een markering zodat het nooit opnieuw wordt uitgevoerd. Dat gebeurt allemaal voordat je iets hebt kunnen typen, en dat is precies de bedoeling: het venster tussen het bestaan van een instantie en de configuratie ervan is het venster dat je niet zou moeten hebben.

Valideer het document voordat je bestelt. De schemachecker vangt de inspringfout op die je anders een rebuild zou kosten:

cloud-init schema --config-file user-data.yaml --annotate

Een user-data dat nuttige dingen doet

#cloud-config
hostname: edge-01
fqdn: edge-01.example.com
timezone: UTC

users:
  - name: deploy
    groups: [sudo]
    shell: /bin/bash
    sudo: "ALL=(ALL) NOPASSWD:ALL"
    ssh_authorized_keys:
      - ssh-ed25519 AAAAC3Nza... deploy@laptop

ssh_pwauth: false
disable_root: true

package_update: true
package_upgrade: true
packages:
  - nftables
  - vnstat
  - mtr-tiny

write_files:
  - path: /etc/ssh/sshd_config.d/10-local.conf
    permissions: "0644"
    content: |
      PermitRootLogin no
      PasswordAuthentication no
      AllowUsers deploy

runcmd:
  - [systemctl, enable, --now, nftables]
  - [systemctl, restart, ssh]

De eerste regel is noch een opmerking noch optioneel. Zonder #cloud-config wordt het document stilzwijgend genegeerd en start de instantie alsof je niets hebt gekoppeld.

Op AlmaLinux wordt groups: [sudo] groups: [wheel] en is de service die opnieuw moet worden gestart sshd. Al het andere is identiek.

Kijken hoe het werkt

cloud-init status --long
journalctl -u cloud-final -b
less /var/log/cloud-init-output.log

De journal vertelt je welke fase is mislukt. cloud-init-output.log bevat de feitelijke output van je runcmd-items, en daar staat de reden.

Stop er geen geheimen in

User-data blijft gedurende het hele leven vanuit de instantie leesbaar:

cloud-init query userdata

Alles wat daarin staat, is beschikbaar voor elk proces dat root bereikt, en voor iedereen die een snapshot van de schijf terugzet. Gebruik user-data om een credential te installeren die het geheim ophaalt, niet om het geheim zelf mee te dragen.

Testen zonder een instantie op te branden

cloud-init clean --logs --reboot

Dat verwijdert de markering, de logs en de gecachte datasource en start opnieuw op naar een verse eerste start. Voer het uit op een wegwerpinstantie. Voer het uit in productie en je ontdekt wat je runcmd de tweede keer doet, wat zelden is wat het de eerste keer deed.

Waar te stoppen

cloud-init is voor bootstrapping en heeft geen idee in welke staat de machine morgen moet zijn. Gebruik het om het punt te bereiken waar je echte tooling het over kan nemen: een sleutel, een netwerk, een agent. Stop daarna. Zestig regels is een gezonde user-data, en zeshonderd is een configuratiemanagementsysteem zonder manier om te convergeren.

cloud-init query -a
cloud-init query ds.meta_data

Instantie-ID, sitecode, hostnaam en de bij de start toegewezen adressen staan daar allemaal in, wat een script nodig heeft als het zich ergens moet registreren en nog niet weet waar het wakker werd.

Klaar wanneer jij dat bent

Kies een stad. Kies een formaat. Betaal in munt.

Geen formulieren over wie je bent, geen wachten op een mens die je goedkeurt, geen telefoontje om iets te verifiëren. De factuur wordt betaald en de inloggegevens belanden in je inbox.