7 sept. 2024

Pourquoi Laravel pourrait être l'outil d'automatisation réseau dont vous ignoriez avoir besoin

Pourquoi Laravel pourrait être l'outil d'automatisation réseau dont vous ignoriez avoir besoin

Fatigué de gérer l'automatisation réseau avec des scripts Python bruts ? Découvrez comment Laravel, avec sa planification intégrée, ses files d'attente et son support d'interface utilisateur web, offre une solution étonnamment élégante pour une automatisation réseau évolutive et sécurisée, même dans des environnements complexes.

logo rconfig
logo rconfig

rConfig

Tout chez rConfig

image d'ordinateur portable en PHP
image d'ordinateur portable en PHP

En matière d'automatisation de réseau, de nombreux développeurs et ingénieurs réseau ont tendance à utiliser Python, en raison de ses bibliothèques robustes comme Netmiko, NAPALM et Paramiko. Python convient bien au scripting, mais il peut s'avérer un peu compliqué lors de l'extension de projets, de la création d'une interface conviviale ou de la gestion des workflows complexes. C'est là que Laravel, le framework web basé sur PHP, peut offrir une alternative convaincante.

La facilité d'utilisation de Laravel, son écosystème étendu et sa structure bien organisée le rendent étonnamment efficace pour la création d'outils d'automatisation de réseau. Dans ce blog, nous allons explorer comment vous pouvez commencer avec Laravel pour l'automatisation de réseau et pourquoi cela pourrait être plus simple que de tout construire à partir de zéro avec Python.

Pourquoi choisir Laravel pour l'automatisation de réseau ?

Laravel offre plusieurs avantages pour l'automatisation de réseau :

  1. Structure intégrée : L'architecture MVC (Modèle-Vue-Contrôleur) de Laravel organise votre code de manière claire, facilitant ainsi la maintenance et l'extension.

  2. Interface Web : Le moteur de template Blade de Laravel permet de créer facilement une interface utilisateur web propre pour votre plateforme d'automatisation.

  3. Eloquent ORM : La gestion des bases de données et la consignation des opérations réseau deviennent plus faciles grâce à l'ORM intégré de Laravel (Mapping Objet-Relationnel) pour travailler avec les bases de données SQL.

  4. Files d'attente et planification : Laravel facilite incroyablement la planification de tâches et la gestion des files d'attente, essentielles pour automatiser les opérations réseau récurrentes.

  5. Intégrations tierces : L'écosystème de Laravel est vaste, avec de nombreux packages pour SSH, API, et bien plus encore - simplifiant des tâches pour lesquelles vous écririez autrement du code personnalisé en Python.

Voyons un simple exemple d'utilisation de Laravel pour automatiser des tâches réseau.

Étape 1 : Installer Laravel

Pour commencer, vous devez installer Laravel. Si cela n’est pas déjà fait, vous pouvez l’installer via Composer.

composer global require laravel/installer

Après avoir installé Laravel, créez un nouveau projet :

laravel new network-automation

Une fois Laravel installé, naviguez dans le répertoire de votre nouveau projet :

<span class="hljs-built_in">cd</span> network-automation

Étape 2 : Configurer SSH pour les appareils réseau

Pour automatiser les appareils réseau, vous avez besoin d'un moyen de communiquer avec eux. En Python, vous utiliseriez des bibliothèques comme Netmiko, mais avec Laravel, nous pouvons utiliser un package comme le package SSH de Spatie pour exécuter facilement des commandes SSH.

Tout d'abord, installez le package SSH :

composer require spatie/ssh

Maintenant, créons un simple contrôleur capable de se connecter en SSH à un appareil réseau et d'exécuter une commande.

Créer un nouveau contrôleur

Exécutez la commande Artisan suivante pour générer un contrôleur :

php artisan make:controller NetworkController

Cela générera un fichier NetworkController.php dans app/Http/Controllers/. Dans ce contrôleur, nous utiliserons le package SSH de Spatie pour automatiser certaines tâches.

Exemple de code : Connexion en SSH à un appareil réseau

Voici comment vous pouvez vous connecter en SSH à un appareil réseau et récupérer sa configuration :

<span class="hljs-meta"><?php</span>

<span class="hljs-keyword">namespace</span> <span class="hljs-title">App</span>\<span class="hljs-title">Http</span>\<span class="hljs-title">Controllers</span>;

<span class="hljs-keyword">use</span> <span class="hljs-title">Illuminate</span>\<span class="hljs-title">Http</span>\<span class="hljs-title">Request</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">Spatie</span>\<span class="hljs-title">Ssh</span>\<span class="hljs-title">Ssh</span>;

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">NetworkController</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Controller</span>
</span>{
    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">fetchConfig</span>(<span class="hljs-params"></span>)
    </span>{
        <span class="hljs-comment">// SSH credentials</span>
        $ssh = Ssh::create(<span class="hljs-string">'username'</span>, <span class="hljs-string">'192.168.1.1'</span>)
                    ->usePrivateKey(<span class="hljs-string">'/path/to/private_key'</span>)
                    ->execute(<span class="hljs-string">'show running-config'</span>);

        <span class="hljs-comment">// Check if the command was successful</span>
        <span class="hljs-keyword">if</span> ($ssh->wasSuccessful()) {
            $output = $ssh->getOutput();
            <span class="hljs-keyword">return</span> view(<span class="hljs-string">'config.show'</span>, [<span class="hljs-string">'config'</span> => $output]);
        } <span class="hljs-keyword">else</span> {
            <span class="hljs-keyword">return</span> response(<span class="hljs-string">'Failed to fetch config.'</span>, <span class="hljs-number">500</span>

Dans cet exemple :

  • Nous nous connectons en SSH à un appareil réseau (dans ce cas, 192.168.1.1).

  • La commande execute('show running-config') récupère la configuration en cours.

  • Si cela réussit, le résultat est passé à une vue Blade pour être affiché.

Créer une vue Blade

Créons une vue Blade simple pour afficher la sortie de la configuration de l'appareil réseau.

Créez un nouveau fichier nommé show.blade.php dans le dossier resources/views/config/.

<!-- resources/views/config/show.blade.php -->
<!DOCTYPE html>
<html lang=<span class="hljs-string">"en"</span>>
<head>
    <meta charset=<span class="hljs-string">"UTF-8"</span>>
    <meta name=<span class="hljs-string">"viewport"</span> content=<span class="hljs-string">"width=device-width, initial-scale=1.0"</span>>
    <title>Device Configuration</title>
</head>
<body>
    <h1>Device Configuration</h1>
    <pre>{{ $config }}</pre>
</body>
</html>

Maintenant, lorsque vous naviguez vers l'itinéraire connecté à cette méthode de contrôleur, vous verrez la sortie de la configuration dans votre navigateur.

Étape 3 : Définir une route pour le contrôleur réseau

Ensuite, configurez une route pour déclencher l'action du contrôleur. Ouvrez routes/web.php et ajoutez :

<span class="hljs-keyword">use</span> <span class="hljs-title">App</span>\<span class="hljs-title">Http</span>\<span class="hljs-title">Controllers</span>\<span class="hljs-title">NetworkController</span>;

Route::get(<span class="hljs-string">'/fetch-config'</span>, [NetworkController::class, <span class="hljs-string">'fetchConfig'</span>]);

Maintenant, si vous naviguez à http://votre-url-app/fetch-config, vous déclencherez la commande SSH, et la configuration de l'appareil sera affichée dans l'interface web.

Étape 4 : Automatiser les tâches avec le planificateur de tâches de Laravel

L'un des plus grands défis de l'automatisation de réseau est la planification des tâches régulières, comme les sauvegardes ou les vérifications de statut. Le planificateur de tâches intégré de Laravel facilite considérablement cela.

Tout d'abord, configurons une tâche récurrente pour sauvegarder la configuration de l'appareil réseau chaque jour.

Planification d'une tâche

Dans Laravel, les tâches programmées sont définies dans le fichier app/Console/Kernel.php. Ouvrez-le et ajoutez ce qui suit à l'intérieur de la méthode schedule :

<span class="hljs-keyword">protected</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">schedule</span>(<span class="hljs-params">Schedule $schedule</span>)
</span>{
    $schedule->call(<span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) </span>{
        <span class="hljs-comment">// SSH into the network device and save the configuration</span>
        $ssh = Ssh::create(<span class="hljs-string">'username'</span>, <span class="hljs-string">'192.168.1.1'</span>)
                    ->usePrivateKey(<span class="hljs-string">'/path/to/private_key'</span>)
                    ->execute(<span class="hljs-string">'show running-config'</span>);

        <span class="hljs-keyword">if</span> ($ssh->wasSuccessful()) {
            $output = $ssh->getOutput();
            \Storage::put(<span class="hljs-string">'backups/network-config-'</span> . now()->format(<span class="hljs-string">'Y-m-d'</span>) . <span class="hljs-string">'.txt'</span>, $output);
        }
    })->daily();
}

Cela se connectera en SSH à l'appareil et enregistrera la configuration dans un fichier de sauvegarde dans le répertoire storage/app/backups/ chaque jour. Le planificateur gérera automatiquement l'exécution de ce travail en arrière-plan.

Exécuter le planificateur

Pour garantir que le planificateur fonctionne, vous devez ajouter l'entrée cron suivante sur votre serveur :

* * * * * php /path-to-your-project/artisan schedule:run >> /dev/null 2>&1

Cela exécutera le planificateur de tâches de Laravel chaque minute, ce qui, en retour, exécutera les tâches définies au moment correct (par exemple, quotidiennement, hebdomadairement, etc.).

Étape 5 : Utiliser les files d'attente de Laravel pour les opérations de masse

Automatiser le réseau nécessite souvent de lancer des tâches sur de nombreux appareils en parallèle. Les files d'attente de tâches de Laravel sont parfaites pour cela. Supposons que nous voulions exécuter une commande sur plusieurs appareils simultanément – Laravel peut mettre en file ces tâches pour les traiter en parallèle.

Créer un nouveau travail

Vous pouvez créer un travail avec Artisan :

php artisan make:job RunCommandOnDevice

Dans le travail RunCommandOnDevice, nous ajouterons la logique pour se connecter en SSH à un appareil et exécuter une commande.

<span class="hljs-meta"><?php</span>

<span class="hljs-keyword">namespace</span> <span class="hljs-title">App</span>\<span class="hljs-title">Jobs</span>;

<span class="hljs-keyword">use</span> <span class="hljs-title">Spatie</span>\<span class="hljs-title">Ssh</span>\<span class="hljs-title">Ssh</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">Illuminate</span>\<span class="hljs-title">Bus</span>\<span class="hljs-title">Queueable</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">Illuminate</span>\<span class="hljs-title">Contracts</span>\<span class="hljs-title">Queue</span>\<span class="hljs-title">ShouldQueue</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">Illuminate</span>\<span class="hljs-title">Foundation</span>\<span class="hljs-title">Bus</span>\<span class="hljs-title">Dispatchable</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">Illuminate</span>\<span class="hljs-title">Queue</span>\<span class="hljs-title">InteractsWithQueue</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">Illuminate</span>\<span class="hljs-title">Queue</span>\<span class="hljs-title">SerializesModels</span>;

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">RunCommandOnDevice</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">ShouldQueue</span>
</span>{
    <span class="hljs-keyword">use</span> <span class="hljs-title">Dispatchable</span>, <span class="hljs-title">InteractsWithQueue</span>, <span class="hljs-title">Queueable</span>, <span class="hljs-title">SerializesModels</span>;

    <span class="hljs-keyword">protected</span> $deviceIp;
    <span class="hljs-keyword">protected</span> $command;

    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">__construct</span>(<span class="hljs-params">$deviceIp, $command</span>)
    </span>{
        <span class="hljs-keyword">$this</span>->deviceIp = $deviceIp;
        <span class="hljs-keyword">$this</span>->command = $command;
    }

    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">handle</span>(<span class="hljs-params"></span>)
    </span>{
        $ssh = Ssh::create(<span class="hljs-string">'username'</span>, <span class="hljs-keyword">$this</span>->deviceIp)
                    ->usePrivateKey(<span class="hljs-string">'/path/to/private_key'</span>)
                    ->execute(<span class="hljs-keyword">$this</span>->command);

        <span class="hljs-keyword">if</span> ($ssh->wasSuccessful()) {
            <span class="hljs-comment">// Process output or log result</span>
            \Log::info(<span class="hljs-string">'Command successful on '</span> . <span class="hljs-keyword">$this</span>->deviceIp);
        } <span class="hljs-keyword">else</span> {
            \Log::error(<span class="hljs-string">'Command failed on '</span> . <span class="hljs-keyword">$this</span>->deviceIp);
        }
    }
}

Maintenant, vous pouvez mettre en file d'attente ce travail pour plusieurs appareils :

phpCopy code$devices = [<span class="hljs-string">'192.168.1.1'</span>, <span class="hljs-string">'192.168.1.2'</span>, <span class="hljs-string">'192.168.1.3'</span>];

<span class="hljs-keyword">foreach</span> ($devices <span class="hljs-keyword">as</span> $device) {
    RunCommandOnDevice::dispatch($device, <span class="hljs-string">'show version'</span>);
}

Laravel mettra en file ces tâches, et vous pourrez les traiter en parallèle avec des travailleurs.

Exécuter le travailleur de file d'attente

Pour commencer à traiter les tâches, exécutez le travailleur de file d'attente avec :

php artisan queue:work

Cela vous permet de monter en charge et de gérer efficacement des tâches d'automatisation de réseau à grande échelle.

Conclusion

Bien que Python ait été le choix privilégié pour l'automatisation de réseau, Laravel offre une solution plus structurée, évolutive et conviviale, surtout lors de la construction de plateformes d'automatisation complexes avec une interface utilisateur, la planification et la mise en file de tâches. Avec des packages comme Spatie SSH et la planification des tâches intégrées de Laravel, vous pouvez obtenir une plateforme d'automatisation de réseau puissante, opérationnelle beaucoup plus rapidement qu'en démarrant de zéro avec Python.

Si vous développez des outils d'automatisation pour des équipes plus importantes ou si vous avez besoin d'une méthode simple pour gérer des tâches réseau récurrentes, Laravel fournit une excellente fondation pour commencer.

affiche vecteur rconfig
affiche vecteur rconfig
Présentation de rConfig Vector : Gestion de la Configuration Réseau Scalables et Distribuées pour les Équipes Modernes

Découvrez rConfig Vector — la solution NCM distribuée de nouvelle génération conçue pour l'échelle, la rapidité et la sécurité. Conçu pour les équipes informatiques modernes, Vector offre une haute disponibilité, un chiffrement par défaut, des sauvegardes ultra-rapides et une intégration d'outils transparente. Préparez la gestion de votre réseau pour le futur dès aujourd'hui.

Stephen Stack

CTO, rConfig

homme dans un centre de données
homme dans un centre de données
Pourquoi les plateformes rigides d'automatisation des réseaux échouent-elles — et comment rConfig donne aux équipes IT la flexibilité dont elles ont besoin

Découvrez pourquoi les outils d'automatisation de réseau orientés par des opinions échouent dans les environnements multi-fournisseurs d'aujourd'hui. Apprenez comment l'approche NCM flexible et indépendante du fournisseur de rConfig permet aux équipes informatiques d'automatiser, de se développer et d'innover sans compromis.

rConfig

Tout chez rConfig

illustration du monde critique
illustration du monde critique
Pourquoi les sauvegardes d'état du réseau sont-elles importantes : comment rConfig va au-delà de la configuration pour une visibilité réelle

Allez au-delà de l'intention avec la gestion de réseau sensible à l'état de rConfig. Capturez le comportement en temps réel des dispositifs avec des sauvegardes d'état—BGP, tables de routage, LLDP/CDP, et plus encore—pour un dépannage plus rapide, la conformité et une visibilité complète de votre réseau.

logo rconfig

rConfig

Tout chez rConfig

+5

Approuvé par les grandes entreprises

Voulez-vous voir comment rConfig peut transformer votre gestion de réseau ?

Contactez-nous dès aujourd'hui pour discuter de votre cas d'utilisation spécifique et obtenir des conseils d'experts sur la sécurisation et l'optimisation de votre infrastructure.

An isometric illustration of a person standing on a digital platform beside a staircase, interacting with floating holographic screens, symbolizing technological advancement and data analysis.

+5

Approuvé par les grandes entreprises

Voulez-vous voir comment rConfig peut transformer votre gestion de réseau ?

Contactez-nous dès aujourd'hui pour discuter de votre cas d'utilisation spécifique et obtenir des conseils d'experts sur la sécurisation et l'optimisation de votre infrastructure.

An isometric illustration of a person standing on a digital platform beside a staircase, interacting with floating holographic screens, symbolizing technological advancement and data analysis.

+5

Approuvé par les grandes entreprises

Voulez-vous voir comment rConfig peut transformer votre gestion de réseau ?

Contactez-nous dès aujourd'hui pour discuter de votre cas d'utilisation spécifique et obtenir des conseils d'experts sur la sécurisation et l'optimisation de votre infrastructure.

An isometric illustration of a person standing on a digital platform beside a staircase, interacting with floating holographic screens, symbolizing technological advancement and data analysis.