Hulpartikel overzicht

Hulpartikel

TransIP REST API: automatische snapshots maken

In deze handleiding laten wij zien hoe je met behulp van de TransIP REST API via een PHP-script en een cronjob automatisch snapshots maakt van een VPS op een vast tijdstip.

Voor de stappen in deze handleiding is het belangrijk dat in je controlepaneel de API is ingeschakeld en dat de authenticatie met de API is geconfigureerd.


 

    Stap 1

    Open/maak een PHP-script aan waarin je de automatische snapshots inricht, bijvoorbeeld:

    nano ~/snapshot.php

     

    Stap 2

    Geef het script de inhoud hieronder. Klik onder de code op 'Toelichting' voor een nadere uitleg over deze opzet.

    Let op: Het script controleert alleen of er snapshots bestaan met de naam die je opgeeft achter 'SNAPSHOT_DESCRIPTION'. Zo voorkom je dat als je twee of meer snapshots gebruikt, eventuele andere snapshots met andere descriptions verwijdert worden. Gebruik je voor je dit script uitvoert één snapshot en heeft die een andere description dan de waarde van 'SNAPSHOT_DESCRIPTION'? Verwijder die dan eerst voor je dit script uitvoert.

    <?php
    
    require_once(__DIR__ . '/../vendor/autoload.php');
    
    use Transip\Api\Library\TransipAPI;
    use Transip\Api\Library\Entity\Vps;
    use Transip\Api\Library\Entity\Vps\Snapshot;
    
    class vpsAutoSnapshot
    {
        private const TRANSIP_LOGIN = 'jeaccount';
        private const TRANSIP_PRIVATE_KEY = '';
        private const VPS_NAME = 'jeaccount-vps';
        private const SNAPSHOT_DESCRIPTION = 'auto_snapshot';
    
        /**
         * @var TransipAPI
         */
    
        private $transipApi;
    
        public function __construct()
        {
                $this->transipApi = new TransipAPI(
                        self::TRANSIP_LOGIN,
                        self::TRANSIP_PRIVATE_KEY,
                        false
                );
        }
    
        public function run(): void
        {
            if ($this->vpsIsLocked(self::VPS_NAME)) {
                return; // vps is locked, don't continue
            }
    
            $snapshot = $this->getSnapshotByDescription(self::VPS_NAME, self::SNAPSHOT_DESCRIPTION);
            if ($snapshot !== null) {
                $this->transipApi->vpsSnapshots()->deleteSnapshot(self::VPS_NAME, $snapshot->getName());
            }
    
            $this->waitForVpsToUnlock();
            $this->transipApi->vpsSnapshots()->createSnapshot(self::VPS_NAME, self::SNAPSHOT_DESCRIPTION);
        }
    
        private function vpsIsLocked(string $vpsName): bool
        {
            $vps = $this->transipApi->vps()->getByName($vpsName);
            return ($vps->isCustomerLocked() || $vps->isLocked());
        }
    
        private function getSnapshotByDescription(string $vpsName, string $snapshotDescription): ?Snapshot
        {
            $snapshots = $this->transipApi->vpsSnapshots()->getByVpsName($vpsName);
            foreach ($snapshots as $snapshot) {
                if ($snapshot->getDescription() == $snapshotDescription) {
                    return $snapshot;
                }
            }
            return null;
        }
    
        private function waitForVpsToUnlock(): void
        {
            $sleepCount = 0;
            while ($this->vpsIsLocked(self::VPS_NAME)) {
                if ($sleepCount > 10) {
                    throw new \RuntimeException('Try out threshold reached, VPS has been locked for more than 2 minutes');
                }
                sleep(10);
                $sleepCount++;
            }
        }
    }
    
    (new vpsAutoSnapshot)->run();

    TL;DR

    • Vervang 'jeaccount' door de naam van je TransIP-account.
    • Geef je private key op achter TRANSIP_PRIVATE_KEY tussen de haakjes.
    • Vervang jeaccount-vps door de naam (niet je eigen omschrijving) van de VPS waar je een snapshot van wil maken.
    Toelichting
    • Onze API-voorbeelden op Gitlab zijn vrij eenvoudig in opzet. In dit voorbeeld gebruiken we object oriented programming. De ins-en outs hiervan vallen buiten de scope van deze handleiding.
       
    • De class vpsAutoSnapshot verzorgt het automatisch aanmaken van snapshots. Hiertoe is het van boven naar beneden opgebouwd uit de volgende delen:
      • diverse constants waarin je TransIP-accountnaam, API-key, de gewenste VPS en de naam van de snapshot zijn opgegeven
      • __construct maakt een verbinding met de Rest-API. De beschikbare opties die je mee kunt geven vind je hier.
      • De functie 'run' maakt de snapshot aan. Hiervoor wordt een aantal functies aangeroepen die onder de 'run' functie worden gedefinieerd:
      • vpsIsLocked: controleert of je een lock op je VPS hebt ingesteld, of dat er een process bezig is op de achtergrond waardoor nu geen snapshot kan worden aangemaakt. Je zou dit bijvoorbeeld kunnen uitbreiden door eerst maximaal 2 minuten te wachten om te kijken of, indien er een tijdelijk proces bezig is, er na 2 minuten wel verder kan worden gegaan, zie waitForVpsToUnlock hieronder.
      • getSnapshotByDescription: haalt alle snapshots op van jouw VPS. Vervolgens wordt een eventueel bestaande snapshot via deleteSnapshot verwijdert, daarna gewacht via waitForVpsToUnlock tot de bestaande snapshot verwijdert is en tot slot met CreateSnapshot een nieuwe snapshot gemaakt.
      • In de delen die beginnen met 'private function' worden de hierboven beschreven functies gedefinieerd.

     

    Stap 3

     

    Open crontab met het commando:

     

    crontab -e

     

    Stap 4

    Voeg onderstaande regel toe onderaan de crontab. Pas de tijd aan naar het gewenste moment waarop je de snapshot wil laten maken (in dit voorbeeld 1 uur 's nachts iedere zondag). Voor meer informatie over het instellen van een cronjob, zie deze handleiding.

    * 1 * * 0 ~/snapshot.php

    Sla de wijzigingen op en sluit crontab (ctrl + x > y > enter, of :wq! afhankelijk van de editor die je gebruikt).


     

    Daarmee zijn we aan het eind gekomen van deze handleiding voor het automatisch maken van snapshots voor VPS'en.

    Mocht je aan de hand van deze handleiding nog vragen hebben, aarzel dan niet om onze supportafdeling te benaderen. Je kunt hen bereiken via de knop 'Neem contact op' onderaan deze pagina.

    Wil je dit artikel met andere gebruikers bespreken, laat dan vooral een bericht achter onder 'Reacties'.

    Heb je ook een goed idee?

    Stuur jouw idee in! Met genoeg stemmen komt jouw idee op onze wishlist!

    Heeft dit artikel je geholpen?

    Maak een account aan of log in om een beoordeling achter te laten.

    Reacties

    Maak een account aan of log in om een reactie te plaatsen.

    0
    Matthijs van Beek Admin 21 april 2021 (#5680)

    @alegonbessole,

    We nemen je verzoek mee voor een toekomstige update!

    @geckodomeinen,

    Klopt inderdaad: je kan de private key in een apart bestand opslaan en die vanuit het script aanspreken. Dat is inderdaad veiliger, maar lost niet alle veiligheidsrisico's op. We zullen dit ook in een toekomstige update van het artikel meenemen en nader toelichten.

    0
    geckodomeinen 20 april 2021 (#5671)

    Is het niet handiger/veiliger om de private key niet in de code op te slaan.

    0
    alegonbessole 19 april 2021 (#5668)

    Hi, zouden jullie dit scriptje kunnen schrijven zodat het mogelijk wordt dat je een input/argument kan mee geven met de vpsname ipv dat dit hardcode gedaan moet worden? Nog beter zou het zijn als dit kan op basis van de door klant meegegeven description.

    1
    impresto 14 april 2021 (#5614)

    @Matthijs van Beek, Heel nice, heb het zojuist werkend gemaakt en getest. Werkt perfect. Mooie toevoeging, bedankt!

    0
    Matthijs van Beek Admin 13 april 2021 (#5599)

    @impresto,

    Dat zit er inderdaad al in ;) Specifiek wordt dat gedaan in het stukje hieronder. Let wel dat voor de correcte werking de oude snapshot de omschrijving moet hebben zoals die is vastgelegd in private const SNAPSHOT_DESRIPTION (aan het begin van het bestand).

        $snapshot = $this->getSnapshotByDescription(self::VPS_NAME, self::SNAPSHOT_DESCRIPTION);
        if ($snapshot !== null) {
            $this->transipApi->vpsSnapshots()->deleteSnapshot(self::VPS_NAME, $snapshot->getName());
        }

    Wat dit doet is 1) haal alle snapshots op 2) zijn er meer dan geen snapshots? verwijder dan de snapshot met de naam SNAPSHOT_DESCRIPTION

    0
    impresto 9 april 2021 (#5573)

    Is er ook een manier om automagisch de oude snapshot te verwijderen alvorens de nieuwe snapshot te maken op deze manier?

    Kom je er niet uit?

    Ontvang persoonlijke hulp van onze supporters

    Neem contact op