Winkelwagen

    Sorry, we konden geen resultaten vinden voor jouw zoekopdracht.

    TransIP 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 + > > 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.

    Kom je er niet uit?

    Ontvang persoonlijke hulp van onze supporters

    Neem contact op