[API OVH] Reboot d’un VPS via un script PHP

OVH possède une API qui peut s’avérer très pratique pour automatiser des tâches du manager : https://api.ovh.com

J’ai choisi d’utiliser le PHP pour ces scripts car il est déjà installé sur mes machines, je n’ai donc pas besoin de supplément.

Premier test, lister mes VPS

Je commence gentils, je fais un script qui listera simplement les VPS disponible chez OVH.

Télécharger et décompressé la dernière version de « php-ovh » et ces dépendances : https://github.com/ovh/php-ovh/releases

root@monsrv:~# mkdir ovhphp/
root@monsrv:~# cd ovhphp/
root@monsrv:~/ovhphp# wget https://github.com/ovh/php-ovh/releases/download/v2.0.0/php-ovh-2.0.0-with-dependencies.tar.gz
root@monsrv:~/ovhphp# tar -xzvf php-ovh-2.0.0-with-dependencies.tar.gz 

Ensuite on crée un tocken via cette URL : https://api.ovh.com/createToken/?GET=/vps ou on ne va autoriser que le GET sur /vps.

On va obtenir la page suivante, il va falloir conserver Application Key, Application Secret & Consumer Key pour les mettre dans le script :

OVH api keys résulstatOn va pouvoir créer le script suivant (pensez à recopier vos Application Key, Application Secret & Consumer Key dans les variables) :

#!/usr/bin/php
<?php

// This script is a skeleton of script or application using OVH APIs
// You can launch it with the command php script.php
// Or include it into a website be deleting the first line

require __DIR__ . '/vendor/autoload.php';
use \Ovh\Api;

////////////////////////////////////////////////////
//     Dont forget to update your credentials     //
////////////////////////////////////////////////////

// Please read the documentation to get your credentials
// https://github.com/ovh/php-ovh
$applicationKey = "hsNT*************";
$applicationSecret = "8FcOC***********************";
$consumer_key = "bU5j**************************";

// Information about API and rights asked
$endpoint = 'ovh-eu';

// Get API connector instance
$conn = new Api(    $applicationKey,
                    $applicationSecret,
                    $endpoint,
                    $consumer_key);

////////////////////////////////////////////////////
//       Your logic will be inserted here         //
////////////////////////////////////////////////////

// This is an example
// Here, use the API connector as you want. Here, we are getting all hosting services
$vps = $conn->get('/vps');

print_r($vps);

?>

Lancement du script, voici le résultat :

root@romeo:~/ovhphp# php getvps.php 
Array
(
    [0] => vks00000.ip-XX-XX-XX.eu
)

vks00000.ip-XX-XX-XX.eu c’est le nom de mon VPS (pour l’exemple), ça fonctionne.

Les choses sérieuses :  un reboot

Même script avec action cette fois, pour tester le reboot d’un VPS via un script.

De nouveau la création d’API  avec l’url https://api.ovh.com/createToken/?POST=/vps/vks00000.ip-XX-XX-XX.eu/reboot. Ici on va autoriser le POST sur /vps/vks00000.ip-XX-XX-XX.eu/reboot.

#!/usr/bin/php
<?php
require __DIR__ . '/vendor/autoload.php';
use \Ovh\Api;
$applicationKey = "fCj********";
$applicationSecret = "vqm**************";
$consumer_key = "Zja************************";
$endpoint = 'ovh-eu';
$conn = new Api(    $applicationKey,
                    $applicationSecret,
                    $endpoint,
                    $consumer_key);
$vps_reboot = $conn->post('/vps/vks00000.ip-XX-XX-XX.eu/reboot');
print_r($vps_reboot);
?>

Au lancement on obtient le numéro de la tâche :

root@romeo:~# php postrebootvps.php
Array
(
    [progress] => 0
    [id] => 5119979
    [type] => rebootVm
    [state] => todo
)

Et ça fait bien redémarrer le VPS…

La finalité

De temps en temps mon VPS est inaccessible. C’est très variable (1 à 2 fois par mois environ) et je ne trouve pas la cause (OVH / système  / attaque ?). La seul solution pour le faire repartir c’est un reboot via le manager OVH. En attendant de trouver la cause (je ne désespère pas) j’ai mis en place ce script sur un serveur tiers afin de déclencher un reboot si le serveur est inaccessible.

#!/usr/bin/php
<?php

// Version 0.1 15/03/2015
// Reboot d'un VPS OVH (via l'API OVH) si celui-ci ne répond pas
// Par David Mercereau : http://david.mercereau.info
// Script sous licence BEERWARE

require __DIR__ . '/vendor/autoload.php';
use \Ovh\Api;
    
// Identifiant API OVH : https://api.ovh.com/createToken/
$applicationKey = "fCj********";
$applicationSecret = "vqm*************";
$consumer_key = "Zja***********************";
$endpoint = 'ovh-eu';
// Host à monitorer (IP du VPS)
$serveurMonitorIp = 'A.B.C.D';
// Port à monitorer (doivent être ouvert sur le VPS)
$serveurMonitorPorts = array(80, 22, 25);;
// Site qui permettent de vérifier la connexion internet
$hostsCheck = array('www.wordpress.com', 'fr.wikipedia.org', 'www.ovh.com');

function checkInternet($hostsCheck) {
    $return = true;
    foreach ($hostsCheck as $hostCheck) {
        if (!$sock = @fsockopen($hostCheck, 80, $num, $error, 5)) {
            echo "CheckInternet : Le serveur $hostCheck ne répond pas sur le port 80. Il n'y a pas internet ?\n";
            $return = false;
        }
    }
    return $return;
}

function serveurMonitor($serveurMonitorIp, $serveurMonitorPorts) {
    $return = true;
    foreach ($serveurMonitorPorts as $serveurMonitorPort) {
        if (!$sock = @fsockopen($serveurMonitorIp, $serveurMonitorPort, $num, $error, 5)) {
            echo "ServeurMonitor: Le serveur $serveurMonitorIp ne répond pas sur le port $serveurMonitorPort, Il n'est H.S. ?\n";
            $return = false;
        }
    }
    return $return;
}

if (! serveurMonitor($serveurMonitorIp, $serveurMonitorPorts)) {
    echo "...second test dans 2 minutes, c'est peut être temporaire...\n";
    sleep(120);
    if (! serveurMonitor($serveurMonitorIp, $serveurMonitorPorts)) {
        if  (checkInternet($hostsCheck)) {
            echo "Reboot de $serveurMonitorIp\n";
            // Conneixion à l'API
            $conn = new Api(    $applicationKey,
                                $applicationSecret,
                                $endpoint,
                                $consumer_key);
            $vps_reboot = $conn->post('/vps/vks10057.ip-37-59-126.eu/reboot');
            print_r($vps_reboot);
        } else {
            echo "Le serveur est peut être planté mais peut être pas... il ne semble pas y a voir interne, on fait rien !\n";
        }
    }
} 
exit(0);
?>

En tâche planifiée :

15,45 * * * *  /root/ovhphp/check-serveur.php