Created
March 21, 2017 00:42
-
-
Save ramnov/2c3fae176435e3b5bff19a905657c6a2 to your computer and use it in GitHub Desktop.
C# program to deploy ARM Template
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Requires the following Azure NuGet packages and related dependencies: | |
// package id="Microsoft.Azure.Management.Authorization" version="2.0.0" | |
// package id="Microsoft.Azure.Management.ResourceManager" version="1.4.0-preview" | |
// package id="Microsoft.Rest.ClientRuntime.Azure.Authentication" version="2.2.8-preview" | |
using Microsoft.Azure.Management.ResourceManager; | |
using Microsoft.Azure.Management.ResourceManager.Models; | |
using Microsoft.Rest.Azure.Authentication; | |
using Newtonsoft.Json; | |
using Newtonsoft.Json.Linq; | |
using System; | |
using System.IO; | |
namespace PortalGenerated | |
{ | |
/// <summary> | |
/// This is a helper class for deploying an Azure Resource Manager template | |
/// More info about template deployments can be found here https://go.microsoft.com/fwLink/?LinkID=733371 | |
/// </summary> | |
class DeploymentHelper | |
{ | |
string subscriptionId = "your-subscription-id"; | |
string clientId = "your-service-principal-clientId"; | |
string clientSecret = "your-service-principal-client-secret"; | |
string resourceGroupName = "resource-group-name"; | |
string deploymentName = "deployment-name"; | |
string resourceGroupLocation = "resource-group-location"; // must be specified for creating a new resource group | |
string pathToTemplateFile = "path-to-template.json-on-disk"; | |
string pathToParameterFile = "path-to-parameters.json-on-disk"; | |
string tenantId = "tenant-id"; | |
public async void Run() | |
{ | |
// Try to obtain the service credentials | |
var serviceCreds = await ApplicationTokenProvider.LoginSilentAsync(tenantId, clientId, clientSecret); | |
// Read the template and parameter file contents | |
JObject templateFileContents = GetJsonFileContents(pathToTemplateFile); | |
JObject parameterFileContents = GetJsonFileContents(pathToParameterFile); | |
// Create the resource manager client | |
var resourceManagementClient = new ResourceManagementClient(serviceCreds); | |
resourceManagementClient.SubscriptionId = subscriptionId; | |
// Create or check that resource group exists | |
EnsureResourceGroupExists(resourceManagementClient, resourceGroupName, resourceGroupLocation); | |
// Start a deployment | |
DeployTemplate(resourceManagementClient, resourceGroupName, deploymentName, templateFileContents, parameterFileContents); | |
} | |
/// <summary> | |
/// Reads a JSON file from the specified path | |
/// </summary> | |
/// <param name="pathToJson">The full path to the JSON file</param> | |
/// <returns>The JSON file contents</returns> | |
private JObject GetJsonFileContents(string pathToJson) | |
{ | |
JObject templatefileContent = new JObject(); | |
using (StreamReader file = File.OpenText(pathToJson)) | |
{ | |
using (JsonTextReader reader = new JsonTextReader(file)) | |
{ | |
templatefileContent = (JObject)JToken.ReadFrom(reader); | |
return templatefileContent; | |
} | |
} | |
} | |
/// <summary> | |
/// Ensures that a resource group with the specified name exists. If it does not, will attempt to create one. | |
/// </summary> | |
/// <param name="resourceManagementClient">The resource manager client.</param> | |
/// <param name="resourceGroupName">The name of the resource group.</param> | |
/// <param name="resourceGroupLocation">The resource group location. Required when creating a new resource group.</param> | |
private static void EnsureResourceGroupExists(ResourceManagementClient resourceManagementClient, string resourceGroupName, string resourceGroupLocation) | |
{ | |
if (resourceManagementClient.ResourceGroups.CheckExistence(resourceGroupName) != true) | |
{ | |
Console.WriteLine(string.Format("Creating resource group '{0}' in location '{1}'", resourceGroupName, resourceGroupLocation)); | |
var resourceGroup = new ResourceGroup(); | |
resourceGroup.Location = resourceGroupLocation; | |
resourceManagementClient.ResourceGroups.CreateOrUpdate(resourceGroupName, resourceGroup); | |
} | |
else | |
{ | |
Console.WriteLine(string.Format("Using existing resource group '{0}'", resourceGroupName)); | |
} | |
} | |
/// <summary> | |
/// Starts a template deployment. | |
/// </summary> | |
/// <param name="resourceManagementClient">The resource manager client.</param> | |
/// <param name="resourceGroupName">The name of the resource group.</param> | |
/// <param name="deploymentName">The name of the deployment.</param> | |
/// <param name="templateFileContents">The template file contents.</param> | |
/// <param name="parameterFileContents">The parameter file contents.</param> | |
private static void DeployTemplate(ResourceManagementClient resourceManagementClient, string resourceGroupName, string deploymentName, JObject templateFileContents, JObject parameterFileContents) | |
{ | |
Console.WriteLine(string.Format("Starting template deployment '{0}' in resource group '{1}'", deploymentName, resourceGroupName)); | |
var deployment = new Deployment(); | |
deployment.Properties = new DeploymentProperties | |
{ | |
Mode = DeploymentMode.Incremental, | |
Template = templateFileContents, | |
Parameters = parameterFileContents["parameters"].ToObject<JObject>() | |
}; | |
var deploymentResult = resourceManagementClient.Deployments.CreateOrUpdate(resourceGroupName, deploymentName, deployment); | |
Console.WriteLine(string.Format("Deployment status: {0}", deploymentResult.Properties.ProvisioningState)); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Thanks for your sample.
I use it for making a quick program for massive templates deployments !