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 --annotateEen 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.logDe 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 userdataAlles 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 --rebootDat 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_dataInstantie-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.