Après mon premier article sur comment exécuter un script PowerShell depuis un site web ASP.NET, je vais vous expliquer comment exécuter un runbook qui se trouve sur Azure Automation au travers d’un site web ASP.NET, stocké sur une WebApp Azure.
Pour implémenter ceci, j’ai utilisé la fonctionnalité WebHook de Azure Automation. J’ai utilisé cet article pour comprendre son fonctionnement.
Dans mon exemple, le site web donnera la possibilité à un employé de démarrer/arrêter une VM Azure. Suivez au début cet article pour avoir le runbook Connect-AzureSubscription.ps1 fonctionnel.
Pour démarrer, créez 2 nouveaux runbooks dans Azure Automation. Je vais les appeler Start-AzureVM et Stop-AzureVM. Ils contiendront les scripts suivants:
Start-AzureVM:
param (
[object]$WebhookData
)if ($WebhookData -ne $null) {
$azureVMName = $WebhookData.RequestBody
.\Connect-AzureSubscription.ps1
$azureVM = Get-AzureVM | Where-Object {$_.Name -eq $azureVMName}
Start-AzureVM -Name $azureVM.Name -ServiceName $azureVM.ServiceName
Write-Output “The VM $azureVMName is now started”} else {
Write-Error “Runbook mean to be started only from webhook.”
}
Stop-AzureVM:
param (
[object]$WebhookData
)if ($WebhookData -ne $null) {
$azureVMName = $WebhookData.RequestBody
.\Connect-AzureSubscription.ps1
$azureVM = Get-AzureVM | Where-Object {$_.Name -eq $azureVMName}
Stop-AzureVM -Name $azureVM.Name -ServiceName $azureVM.ServiceName -Force
Write-Output “The VM $azureVMName is now stopped”} else {
Write-Error “Runbook mean to be started only from webhook.”
}
Quand cette étape est terminée, allez dans le runbook Start-AzureVM et clicquez sur WebHook. Donnez un nom, choisissez si vous voulez l’activer ou non, choisissez une date d’expiration pour ce webhook et copier l’URL dans un endroit sécurisé. Ceci est très important, parce que après avoir cliqué sur OK, ce lien ne sera plus disponible:
Dans la partie Parameters, cliquez sur OK:
Cliquez sur Create pour créer votre Webhook:
Répétez cette manipulation pour le runbook Stop-AzureVM.
Il est maintenant temps de créer la page web ASP.NET qui permettra de démarrer/arrêter la VM Azure. Dans Visual Studio, créez une nouvelle Web App ASP.NET avec un modèle vide. Quand la création est terminée, ajoutez une page de type Web Form, qui se nommera Default.aspx. Collez le code suivant:
<%@ Page Language=”C#” AutoEventWireup=”true” CodeBehind=”Default.aspx.cs” Inherits=”StartStop_AzureVM.Default” %>
<!DOCTYPE html>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head runat=”server”>
<title>Start/Stop an Azure VM</title>
</head>
<body>
<form id=”form1″ runat=”server”>
<div>
<img src=”Sources/SCUGBE.png” alt=”SCUGBE”/>
</div>
<div>
<table>
<tr><td><h1>Start/Stop an Azure VM</h1></td></tr>
<tr><td><h3>Provide the name of the VM that you want to start or stop</h3></td></tr><tr>
<td>
<asp:TextBox ID=”ServerName” runat=”server” TextMode=”SingleLine”></asp:TextBox>
<asp:Button ID=”Start_VM” runat=”server” Text=”Start VM” Width=”200″ OnClick=”StartVM_Click” />
<asp:Button ID=”Stop_VM” runat=”server” Text=”Stop VM” Width=”200″ OnClick=”StopVM_Click” />
</td>
</tr><tr>
<td>
<asp:Label ID=”ConfirmationMessage” runat=”server”></asp:Label>
</td>
</tr>
</table>
</div>
</form>
</body>
</html>
Cette page vous donnera 2 boutons avec un champ à remplir. Ajoutez les références suivantes dans votre projet pour exécuter le code:
- System
- System.Data
- System.Drawing
- System.Web
- System.Xml
Ouvrez le fichier Default.aspx.cs et collez le code suivant:
using System;
using System.IO;
using System.Net;
using System.Text;namespace StartStop_AzureVM
{
public partial class Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{}
protected void StartVM_Click(object sender, EventArgs e)
{
StartStop(“https://s2events.azure-automation.net/webhooks?token=”);
ConfirmationMessage.Text = “The VM ” + ServerName.Text + ” is starting. Wait few minutes before trying to connect to it.”;
ServerName.Text = string.Empty;
}protected void StopVM_Click(object sender, EventArgs e)
{
StartStop(“https://s2events.azure-automation.net/webhooks?token=”);
ConfirmationMessage.Text = “The VM ” + ServerName.Text + ” is stopping.”;
ServerName.Text = string.Empty;
}private void StartStop(string webHookUri)
{
var http = (HttpWebRequest)WebRequest.Create(new Uri(webHookUri));
http.Accept = “application/json”;
http.ContentType = “application/json”;
http.Method = “POST”;string parsedContent = ServerName.Text;
ASCIIEncoding encoding = new ASCIIEncoding();
Byte[] bytes = encoding.GetBytes(parsedContent);Stream newStream = http.GetRequestStream();
newStream.Write(bytes, 0, bytes.Length);
newStream.Close();var response = http.GetResponse();
var stream = response.GetResponseStream();
var sr = new StreamReader(stream);
}
}
}
Dans l’appel StartVM_click et StopVM_click, remplacez les valeurs que vous avez copié durant la création du webhook. Suivant sur quel bouton vous allez cliquer, vous allez appeler la fonction correspondante, avec la bonne URL du webhook, et donc vous contacterez le bon runbook.
Ouvrez le fichier Web.config pour modifier la cause de l’erreur sur Azure WebSite. Modifiez compilerOptions=”/langversion:6 by compilerOptions=”/langversion:5. Ceci correspond à la version de compilation du Framework:
Vous pouvez compiler le projet. Vous devriez avoir ceci:
Notre site web est maintenant prêt. Nous allons créer un nouveau site sur Azure, basé sur un plan gratuit. Sur https://portal.azure.com ouvrez Web Apps et cliquez sur Add. Choisissez un nom pour votre site et, sur App Server Platofrm, créez un nouvel App Service. J’utiliserai le prix gratuit:
Je peux maintenant me rendre sur ma nouvelle URL:
Il est temps de publier mon site web sur la Web App Azure, via Visual Studio. Dans Visual Studio, cliquez sur Build > Publish …:
Choisissez Microsoft Azure Web Apps:
Connectez vous avec votre utilisateur Azure où est la nouvelle Web App. Choisissez la Web App où déployer le site web. Comme je suis dans une version gratuite, je ne peux pas utiliser les slot de déploiement (prod/dev par exemple. Cette fonctionnalité est seulement disponible à partir du plan standard):
Vous pouvez valider la connexion:
Mon site est maintenant déployé sur la nouvelle Web App:
Si j’essaie de démarrer une VM, je vais avoir ceci:
Le tâche d’automatisation est directement démarrée:
Si vous allez dans la partie Input, vous pourrez voir quel Runbook a été appelé ainsi que le paramètre qu’il a reçu:
La tâche est terminée et la VM est en cours de démarrage:
Et si j’arrête une VM:
Parce que le site est public, je vais activer l’authentification Azure. Sur la Web App, dans Authentication / Authorization, choisissez ON et sélectionnez une nouvelle application. Cliquez sur Save:
Rendez-vous sur votre site web. Vous allez être redirigé vers une page d’authentification:
Je vais me connecter avec un compte qui n’est pas dans le répertoire de Azure AD. J’ai le message d’erreur suivant:
Je vais me déconnecter et me reconnecter avec un compte qui est dans l’Azure AD. La page web s’affiche correctement: