Blog de Florent Appointaire

Blog sur les technologies Microsoft (Windows Server, System Center, Azure, Windows Azure Pack/Azure Stack, etc;)

image_thumb_73620556

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:

image

Dans la partie Parameters, cliquez sur OK:

image1

Cliquez sur Create pour créer votre Webhook:

image2

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

image3

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:

image4

Vous pouvez compiler le projet. Vous devriez avoir ceci:

image5

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:

image6

Je peux maintenant me rendre sur ma nouvelle URL:

image7

Il est temps de publier mon site web sur la Web App Azure, via Visual Studio. Dans Visual Studio, cliquez sur Build > Publish …:

image8

Choisissez Microsoft Azure Web Apps:

image9

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):

image10

Vous pouvez valider la connexion:

image11image12image13

Mon site est maintenant déployé sur la nouvelle Web App:

image14

Si j’essaie de démarrer une VM, je vais avoir ceci:

image15

Le tâche d’automatisation est directement démarrée:

image16

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:

image17

La tâche est terminée et la VM est en cours de démarrage:

image18image19

Et si j’arrête une VM:

image20image21image22SNAGHTML1e52b50d

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:

SNAGHTMLf24e896

Rendez-vous sur votre site web. Vous allez être redirigé vers une page d’authentification:

image23

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:

image24

Je vais me déconnecter et me reconnecter avec un compte qui est dans l’Azure AD. La page web s’affiche correctement:

image25

Facebook Like
Anonymous