{"id":2153,"date":"2016-02-04T10:03:32","date_gmt":"2016-02-04T10:03:31","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=2153"},"modified":"2025-06-13T16:52:41","modified_gmt":"2025-06-13T23:52:41","slug":"couchbase-with-azure-arm-templates","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/couchbase-with-azure-arm-templates\/","title":{"rendered":"Couchbase with Azure ARM Templates"},"content":{"rendered":"<p>This blog post describes how to set up your own Couchbase Cluster using Azure Resource Manager templates, aka ARM templates.<\/p>\n<h2 id=\"toc_1\">Prerequisites:<\/h2>\n<p>If you would like to try this you will need a few things:<\/p>\n<ol>\n<li>Azure Subscription, sign-up here for a <a href=\"https:\/\/azure.microsoft.com\/en-us\/pricing\/free-trial\">free trial<\/a>.<\/li>\n<li>Azure CLI, installed on your system, <a href=\"https:\/\/azure.microsoft.com\/en-us\/documentation\/articles\/xplat-cli-install\/\">how to install<\/a>.<\/li>\n<li><a href=\"https:\/\/github.com\/\">Github Account<\/a>, optional if you would like to experiment with your own ARM templates.<\/li>\n<\/ol>\n<h2 id=\"toc_2\">What you will deploy<\/h2>\n<p>This blog post will walk you through the steps needed to deploy your own Couchbase Server 4.1 cluster in Microsoft Azure. The size of the cluster is configurable but will, as a minimum, consist of a three node cluster set-up with replication to one node. You can also choose the data center location for your cluster between all available locations accessable with your Microsoft Azure subscription.<\/p>\n<p>In the process of deploying Couchbase to Azure you will learn about Azure Resource Manager Templates and how to edit them to fit your needs. This will allow you to change the default values in the Couchbase ARM template and also understand how to use ARM templates in other cases when using Microsoft Azure.<\/p>\n<h2 id=\"toc_3\">Azure Resource Manager templates<\/h2>\n<p>Azure Resource Manager allows you to provision applications to Microsoft Azure using a declarative template. With a single template, you can deploy multiple services along with their dependencies. You also have the option of splitting up your ARM templates into multiple templates that each describe individual resources. You can use the same templates individually or separately to repeatedly deploy your application\/resources during every stage of the application lifecycle.<\/p>\n<p>You can compare ARM templates to other resource description technologies such as <a href=\"https:\/\/docs.chef.io\/resource_template.html\">chef.io<\/a> or others.<\/p>\n<p>Here is an example of the most simple ARM template:<\/p>\n<pre><code class=\"language-none\">{\r\n   \"$schema\": \"https:\/\/schema.management.azure.com\/schemas\/2015-01-01\/deploymentTemplate.json#\",\r\n   \"contentVersion\": \"\",\r\n   \"parameters\": {  },\r\n   \"variables\": {  },\r\n   \"resources\": [  ],\r\n   \"outputs\": {  }\r\n}<\/code><\/pre>\n<p>ARM templates are written in JSON with the option to use some specially formatted strings that can work as references to variables and\/or method calls.<\/p>\n<p>The ARM template snippet below shows how to define a virtual network and the use of <code>variables<\/code> and <code>parameters<\/code> in an ARM template.<\/p>\n<pre><code class=\"language-none\">{\r\n      \"apiVersion\": \"2015-05-01-preview\",\r\n      \"type\": \"Microsoft.Network\/virtualNetworks\",\r\n      \"name\": \"[variables('virtualNetworkName')]\",\r\n      \"location\": \"[variables('location')]\",\r\n      \"properties\": {\r\n        \"addressSpace\": {\r\n          \"addressPrefixes\": [\r\n            \"[variables('addressPrefix')]\"\r\n          ]\r\n        },\r\n        \"subnets\": [\r\n          {\r\n            \"name\": \"[variables('subnetName')]\",\r\n            \"properties\": {\r\n              \"addressPrefix\": \"[variables('subnetPrefix')]\"\r\n            }\r\n          }\r\n        ]\r\n      }\r\n    },<\/code><\/pre>\n<p>You can read more about how to author ARM templates in the Microsoft <a href=\"https:\/\/azure.microsoft.com\/en-us\/documentation\/articles\/resource-group-authoring-templates\/\">Azure documentation<\/a>.<\/p>\n<p>It is also possible to execute external code, such as shell scripts etc., to allow for custom configuration and installation directly on a Virtual Machine as part of the set-up process.<\/p>\n<p>In combination all this allows for a very fine grained configuration and set-up of resources in Azure.<\/p>\n<p>The above ARM template snippet is taken from the <a href=\"https:\/\/github.com\/martinesmann\/couchbase-azure\/tree\/master\/src\/templates\">Couchbase Cluster ARM template<\/a> on GitHub.<\/p>\n<p>The option to execute scripts on the VM is used to install and configure Couchbase Server on each individual VM and then lastly set-up the Couchbase Cluster between the individual Couchbase nodes.<\/p>\n<pre><code class=\"language-none\"> \"vmScripts\": {\r\n      \"scriptsToDownload\": [\r\n        \"[concat(variables('templateBaseUrl'), 'couchbase-azure-install.sh')]\",\r\n        \"[concat(parameters('cbPackageDownloadBase'), parameters('cbPackage'))]\",\r\n        \"[concat(variables('templateBaseUrl'), 'vm-disk-utils-0.1.sh')]\"\r\n      ],\r\n      \"installCommand\": \"[concat('bash couchbase-azure-install.sh -d ', parameters('cbPackage'), ' -n ', parameters('clusterName'), ' -i ', concat(variables('networkSettings').nodesIpPrefix, '-', variables('clusterSpec').clusterSize), ' -a ', variables('machineSettings').adminUsername, ' -p ', variables('machineSettings').adminPassword, ' -r ', variables('clusterSpec').couchbaseRamQuota)]\",\r\n      \"setupCommand\": \"[concat('bash couchbase-azure-install.sh -d ', parameters('cbPackage'), ' -n ', parameters('clusterName'), ' -i ', concat(variables('networkSettings').nodesIpPrefix, '-', variables('clusterSpec').clusterSize), ' -a ', variables('machineSettings').adminUsername, ' -p ', variables('machineSettings').adminPassword, ' -r ', variables('clusterSpec').couchbaseRamQuota, ' -l')]\"\r\n    },\r\n    \"clusterSpec\": \"[variables(concat('tshirtSize', parameters('tshirtSize')))]\"<\/code><\/pre>\n<p>The above snippet shows how to configure an external script as part of the ARM template and pass in command line arguments, using <code>parameters<\/code>.<\/p>\n<p>We will talk more about ARM templates later.<\/p>\n<h2 id=\"toc_4\">Azure CLI<\/h2>\n<p>In the previous section we briefly learned about ARM templates and how they can be used to describe resources in Azure. A recipe for the resources and there individual configurations as need for your specific set-up.<\/p>\n<p>In this section we we focus on how to use the ARM template or in Azure jargon, Deploy ARM templates. You have a few deployment options, let&#8217;s briefly walk through them.<\/p>\n<h3 id=\"toc_5\">Using Azure Portal, option 1<\/h3>\n<p>The new Azure portal give you an option to do &#8220;template deployment&#8221; from within the portal itself.<br \/>\nBy navigating to: <a href=\"https:\/\/portal.azure.com\/#create\/Microsoft.Template\">Microsoft.Template<\/a><br \/>\nyou can copy\/paste you ARM template into the portal and execute it. The UI even support custom parameters etc.<\/p>\n<p>The drawback is that you can only copy\/paste one ARM template into the portal and all resources need to be with this single &#8220;file&#8221;.<\/p>\n<h3 id=\"toc_6\">Using Azure Portal, option 2<\/h3>\n<p>This feature is very close to &#8220;option 1&#8221; but with a few differences. It&#8217;s possible to instruct Azure to download an ARM template from an external source, only requirement is that all resources (templates\u00b4, scritps etc.) are publicly available.<\/p>\n<p>This feature can be seen and tested from the Microsoft Official Azure Quick Start Templates repository on GitHub, <a href=\"https:\/\/github.com\/Azure\/azure-quickstart-templates\/\">azure-quickstart-templates<\/a><\/p>\n<p>If you visit this specific template<a href=\"https:\/\/github.com\/Azure\/azure-quickstart-templates\/tree\/master\/101-vm-simple-windows\">101-vm-simple-windows<\/a> you will see a blue button (Deploy to Azure). Pushing this button will redirect you to the Azure Portal Template Deployment, but now with the template pre-pasted into the portal.<\/p>\n<blockquote><p>Note!<\/p>\n<p>The <a href=\"https:\/\/github.com\/Azure\/azure-quickstart-templates\/\">azure-quickstart-templates<\/a> is a great resource for learning more about ARM templates.<\/p><\/blockquote>\n<h3 id=\"toc_7\">Azure PowerShell<\/h3>\n<p>Azure PowerShell is a module for PowerShell that gives you access to execute commands agains Azure from PowerShell. You can create, test, deploy, and manage solutions and services incl ARM template deployments.<\/p>\n<p>PowerShell is a great command line tool for the Windows Platform and widely used by both IT Professionals and Developers, but it&#8217;s only available on Windows.<\/p>\n<p>Read more <a href=\"https:\/\/azure.microsoft.com\/en-us\/documentation\/articles\/powershell-azure-resource-manager\/\">PowerShell<\/a><\/p>\n<p>But not everyone run Windows! That&#8217;s why Microsoft has developed the Azure CLI tool.<\/p>\n<h3 id=\"toc_8\">Azure CLI<\/h3>\n<p>The Azure CLI is a command line tool for working with Microsoft Azure; build for Mac, Linux, and Windows.<br \/>\nWorking with a x-platform tool like Azure CLI give you the great benefit that you can use your knowledge on all platforms.<\/p>\n<p>I have chosen to use Azure CLI as it seems to have the wides audience and can be used on most platforms.<\/p>\n<p>The rest of this post will assume the use of the Azure CLI, but many (if not all) commands also exists in Azure PowerShell.<\/p>\n<h3 id=\"toc_9\">Install Azure CLI<\/h3>\n<p>Depending on you preferences you can install Azure CLI from a dedicated install package for your platform or using <code>npm<\/code>, full instructions can be found here, <a href=\"https:\/\/azure.microsoft.com\/en-us\/documentation\/articles\/xplat-cli-install\/\">Install the Azure CLI<\/a>.<\/p>\n<p>Assuming you have a Mac and <code>npm<\/code> is already installed on your system, then installing Azure CLI is a single line:<\/p>\n<pre><code class=\"language-none\">sudo npm install -g azure-cli<\/code><\/pre>\n<p>Please note the use of the global install argument <code>-g<\/code>, this ensures that Azure CLI is globally available on the system.<\/p>\n<h2 id=\"toc_10\">Using Azure CLI<\/h2>\n<p>Now that we have Azure CLI installed let&#8217;s move on and see how to use the tool to deploy and manage your Azure resources with ARM templates.<\/p>\n<h3 id=\"toc_11\">Authentication<\/h3>\n<p>Before using the Azure CLI we need to authenticate against Microsoft Azure. There are multiple ways to authenticate the CLI with Azure, for a detailed guide visit <a href=\"https:\/\/azure.microsoft.com\/en-us\/documentation\/articles\/xplat-cli-connect\/\">Connect to an Azure<\/a>.<\/p>\n<p>In this guide we will use this command:<\/p>\n<pre><code class=\"language-none\">azure login<\/code><\/pre>\n<p><em>Please follow the on screen instructions to authenticate the Azure CLI.<\/em><\/p>\n<h3 id=\"toc_12\">Set Azure Subscription Account to use<\/h3>\n<p>If you have multiple Azure Subscriptions you need to select the subscription to use.<\/p>\n<p>Use this command to liste the available subscriptions for the account:<\/p>\n<pre><code class=\"language-none\">azure account list<\/code><\/pre>\n<p>Set the subscription you would like to use as your <code>default<\/code> account for all instances of the Azure CLI instance.<br \/>\n<code><br \/>\nazure account set \"Azure Pass\"<br \/>\n<\/code><\/p>\n<h3 id=\"toc_13\">Set the Azure Resource Manager mode<\/h3>\n<p>Azure CLI can work in two different modes, classic and arm. Depending on the mode you select you will be restricted to work only with those resource types (you can always change mode later on).<\/p>\n<p>We are working with Azure Resource Manager templates and therefore we need to switch mode to <code>arm<\/code>.<\/p>\n<p>The default mode for Azure CLI is <code>classic<\/code>, use the following command to enable Azure Resource Manager mode:<\/p>\n<pre><code class=\"language-none\">azure config mode arm<\/code><\/pre>\n<h3 id=\"toc_14\">Create a Resource Group<\/h3>\n<p>When working with Azure Resource Manager you always work within a &#8220;resource group&#8221;. You can think of a &#8220;resource group as a bucket, container or logical area for your resources. The resource group encapsulates all the resources need for your application and makes it easy to define boundaries between resources.<\/p>\n<p>A resource group needs to be created within a location (Azure region).<\/p>\n<p>Depending on your subscription the available location can vary. To get the complet list for you subscription run the following command:<\/p>\n<pre><code class=\"language-none\">azure location list<\/code><\/pre>\n<p>Pick a location for your resource group and create a resource group:<\/p>\n<pre><code class=\"language-none\">azure group create -n CB_RESOURCE_GROUP -l \"Eest US\"<\/code><\/pre>\n<h3 id=\"toc_15\">Create a deployment and wait for success<\/h3>\n<p>With a resource group created we can &#8220;deploy&#8221; a ARM template to the resource group. This will create all the resources defined in the ARM template to resource group.<\/p>\n<p>The below command will &#8220;send&#8221; the ARM template to Azure and start the deployment of the defined resources to the specified resource group.<\/p>\n<blockquote><p>Important!<\/p>\n<p>This command will create a three node cluster on your subscription and with that start consumption\/usage on your Azure subscription. Depending on your subscription type, level etc. this may put charges on you subscription that you may be billed for later!<\/p><\/blockquote>\n<pre><code class=\"language-none\">azure group deployment create \r\n    --template-uri https:\/\/raw.githubusercontent.com\/martinesmann\/couchbase-azure\/master\/src\/templates\/azuredeploy.json \r\n    -e azuredeploy.parameters.json \r\n    CB_RESOURCE_GROUP \r\n    AZURE_DEPLOYMENT<\/code><\/pre>\n<p>Let me explain the command in a bit more detail.<br \/>\nThe <code><\/code> is only added to allow line breaks for a single line command in the console. This is not specific to Azure CLI.<\/p>\n<p>The first line instructs Azure CLI to create a new deployment.<\/p>\n<p>Second line is the reference to the ARM template, this value can be both a local file or (as in this case) a reference to a public location.<\/p>\n<p>ARM templates need parameters and variables, the third line instructs Azure CLI where to find the parameters. You can also add parameters directly from the command line, but I find it more convenient to use a file.<br \/>\nIt&#8217;s worth noting that when using a parameters file it needs to be local, on you machine. I guess this restriction is enforced by Microsoft to ensure security and no accidental sharing of sensitive data.<\/p>\n<p>Execution time for the above command is about 10-25 minutes. Therefore if you need a cop of coffee, now would be a good time to get that :)<\/p>\n<h3 id=\"toc_16\">Public IP for Resource Group<\/h3>\n<p>Ones the deployment is completed and succeeded it&#8217;s time to inspect the result.<\/p>\n<p>You can always navigate to the <a href=\"https:\/\/portal.azure.com\">Azure Portal<\/a> to get a visual of what has been deployed, but we can also use Azure CLI.<\/p>\n<p>The Couchbase ARM template actually create four virtual machines! Three Couchbase nodes combined to a single cluster and one virtual machine set-up as a <code>jump box<\/code>. The set-up is the recommended best practice from Couchbase and ensures that the Couchbase Cluster is protected behind a firewall and can only be &#8220;directly&#8221; access though the jump box machine.<\/p>\n<p>Actually the security configuration set-up by the ARM template is really elegant, none of the Couchbase nodes have a public IP. This means that there is no way to access the nodes without going through the jump box! Perfect.<\/p>\n<p>We can confirm this by asking Azure CLI to return ALL public IP&#8217;s assigned for our resource group.<\/p>\n<pre><code class=\"language-none\">azure network public-ip list CB_RESOURCE_GROUP<\/code><\/pre>\n<p>We can now use this IP to create an ssh tunnel to our Couchbase Cluster.<\/p>\n<pre><code class=\"language-none\">[MAC ONLY]\r\nssh -D 8080 -C -N couchadmin@{ip-address}<\/code><\/pre>\n<blockquote><p>Info:<\/p>\n<p>If you used the default parameters then:<br \/>\nUser: couchadmin<br \/>\nPassword: P@ssword1<\/p><\/blockquote>\n<p>The ssh command opens a proxy connection to the jump box machine in Azure.<\/p>\n<p>If you set-up your network connection to use the proxy for all network traffic, we can connect to the Couchbase Cluster!<\/p>\n<p>[MAC ONLY]<br \/>\n<strong>set-up your proxy:<\/strong><\/p>\n<ol>\n<li>Open &#8220;System Preferences&#8221;<\/li>\n<li>Navigate to &#8220;Network&#8221;<\/li>\n<li>Select &#8220;Advanced&#8221;<\/li>\n<li>Click the &#8220;Proxies&#8221; tab.<\/li>\n<li>Select &#8220;SOCKS Proxy&#8221;\n<ol>\n<li>SOCKS Proxy server address: <code>127.0.0.1<\/code><\/li>\n<li>Port: <code>8080<\/code><\/li>\n<\/ol>\n<\/li>\n<li>Click &#8220;OK&#8221;.<\/li>\n<li>Click &#8220;Apply&#8221;.<\/li>\n<li>Open you favourite browser and navigate to <a href=\"https:\/\/10.0.0.10:8091\">https:\/\/10.0.0.10:8091<\/a><\/li>\n<li>Inspect your Couchbase installation (user: <code>couchbaseadmin<\/code>, password: <code>P@ssword1<\/code> )<\/li>\n<\/ol>\n<p><img decoding=\"async\" src=\"https:\/\/raw.githubusercontent.com\/martinesmann\/couchbase-azure\/0e4c7556841261c9a7a1d1fffedeab2d369cb9c8\/content\/images\/Screen%20Shot%202016-01-28%20at%2014.17.34.png\" alt=\"image\" \/><\/p>\n<blockquote><p>Note:<\/p>\n<p>Remember to undo the proxy changes when done testing.<\/p><\/blockquote>\n<h3 id=\"toc_17\">Delete the Resource Group<\/h3>\n<p>If this deployment was done only to test the experience, then it&#8217;s safe to assume you at some point in time would like to take down the Couchbase Cluster and release all resources (take the service and resources down)<\/p>\n<p>Because all resources where created into a single resource group, deleting that resource group will take down all services and resources. Using Azure CLI, this is a very easy task:<\/p>\n<pre><code class=\"language-none\">azure group delete CB_RESOURCE_GROUP<\/code><\/pre>\n<blockquote><p>This command will take several minutes to complet.<\/p><\/blockquote>\n<h2 id=\"toc_18\">Couchbase ARM Template<\/h2>\n<p>So far we have not dived in to much detail about the Couchbase ARM template itself. In this section we will touch on some of the more important aspects of the template and the ones that are specific for Couchbase.<\/p>\n<p>The full source, templates and all dependencies can be found on GitHub, <a href=\"https:\/\/github.com\/martinesmann\/couchbase-azure\">couchbase-azure<\/a>.<\/p>\n<p>Navigating to the <a href=\"https:\/\/github.com\/martinesmann\/couchbase-azure\/tree\/master\/src\/templates\">templates folder<\/a>, reveal eleven separate files:<\/p>\n<h3 id=\"toc_19\"><a href=\"https:\/\/github.com\/martinesmann\/couchbase-azure\/blob\/master\/src\/templates\/azuredeploy.json\">azuredeploy.json<\/a><\/h3>\n<p>The main entry point for the ARM template. This template defines all the parameters and variables that are used in the template. All resources from network nic&#8217;s to virtual machine sizes are specified within this file:<\/p>\n<p>This snippet, defines the properties for &#8220;t-shirt size medium&#8221;.<br \/>\n<code><br \/>\n\"tshirtSizeMedium\": {<br \/>\n\"storageAccountCount\": 1,<br \/>\n\"clusterSizeMinusOne\": 3,<br \/>\n\"lastNodeId\": 3,<br \/>\n\"clusterSize\": 4,<br \/>\n\"couchbaseRamQuota\": 22000,<br \/>\n\"vmSize\": \"Standard_A6\",<br \/>\n\"maxNumberOfDataDisksForVmSizeNotUsedButHereForReference\": 8,<br \/>\n\"vmTemplate\": \"[concat(variables('templateBaseUrl'), 'cluster-nodes-A6.json')]\",<br \/>\n\"backendIPConfigurations\": [<br \/>\n{<br \/>\n\"id\": \"[concat(resourceId('Microsoft.Network\/networkInterfaces', 'nic0'),'\/ipConfigurations\/ipconfig1')]\"<br \/>\n},<br \/>\n{<br \/>\n\"id\": \"[concat(resourceId('Microsoft.Network\/networkInterfaces', 'nic1'),'\/ipConfigurations\/ipconfig1')]\"<br \/>\n},<br \/>\n{<br \/>\n\"id\": \"[concat(resourceId('Microsoft.Network\/networkInterfaces', 'nic2'),'\/ipConfigurations\/ipconfig1')]\"<br \/>\n},<br \/>\n{<br \/>\n\"id\": \"[concat(resourceId('Microsoft.Network\/networkInterfaces', 'nic3'),'\/ipConfigurations\/ipconfig1')]\"<br \/>\n}<br \/>\n]<br \/>\n},<br \/>\n<\/code><\/p>\n<p>You can browse through the file to get a better idea of the structure and how things are configured.<\/p>\n<h3 id=\"toc_20\"><a href=\"https:\/\/github.com\/martinesmann\/couchbase-azure\/blob\/master\/src\/templates\/azuredeploy.parameters.json\">azuredeploy.parameters.json<\/a><\/h3>\n<p>This file contains all the pre-defined default parameters for the template. This file is not mandatory but a great when starting a deployment.<\/p>\n<pre><code class=\"language-none\">{\r\n  \"$schema\": \"https:\/\/schema.management.azure.com\/schemas\/2015-01-01\/deploymentParameters.json#\",\r\n  \"contentVersion\": \"1.0.0.0\",\r\n  \"parameters\": {\r\n    \"adminUsername\": {\r\n      \"value\": \"couchadmin\"\r\n    },\r\n    \"adminPassword\": {\r\n      \"value\": \"P@ssword1\"\r\n    },\r\n    \"tshirtSize\": {\r\n      \"value\": \"Small\"\r\n    },\r\n    \"storageAccountNamePrefix\": {\r\n      \"value\": \"f180cbdply92\"\r\n    },\r\n    \"region\": {\r\n      \"value\": \"East Asia\"\r\n    },\r\n    \"virtualNetworkName\": {\r\n      \"value\": \"couchVnet\"\r\n    },\r\n    \"clusterName\": {\r\n      \"value\": \"couchbasefs180\"\r\n    },\r\n    \"jumpbox\": {\r\n      \"value\": \"enabled\"\r\n    }\r\n  }\r\n}<\/code><\/pre>\n<p>If you would like to change the password then this is the place to do it.<\/p>\n<h3 id=\"toc_21\"><a href=\"https:\/\/github.com\/martinesmann\/couchbase-azure\/blob\/master\/src\/templates\/cluster-nodes-A2.json\">cluster-nodes-A2.json<\/a><\/h3>\n<p>Partial ARM template for configuration using the A2 VM&#8217;s. This is also the file that configures the actual virtual machine resource, network, disks etc.<\/p>\n<pre><code class=\"language-none\">{\r\n      \"apiVersion\": \"2015-05-01-preview\",\r\n      \"type\": \"Microsoft.Compute\/virtualMachines\",\r\n      \"name\": \"[concat(parameters('machineSettings').machineNamePrefix, parameters('nodeId'))]\",\r\n      \"location\": \"[parameters('commonSettings').region]\",\r\n      \"dependsOn\": [\r\n        \"[concat('Microsoft.Network\/networkInterfaces\/', 'nic', parameters('nodeId'))]\"\r\n      ],\r\n      \"properties\": {\r\n        \"availabilitySet\": {\r\n          \"id\": \"[resourceId('Microsoft.Compute\/availabilitySets', parameters('commonSettings').availabilitySet)]\"\r\n        },\r\n        \"hardwareProfile\": {\r\n          \"vmSize\": \"[parameters('vmSize')]\"\r\n        },\r\n        \"osProfile\": {\r\n          \"computerName\": \"[concat(parameters('machineSettings').machineNamePrefix, parameters('nodeId'))]\",\r\n          \"adminUsername\": \"[parameters('machineSettings').adminUsername]\",\r\n          \"adminPassword\": \"[parameters('machineSettings').adminPassword]\"\r\n        },\r\n        \"storageProfile\": {\r\n          \"imageReference\": \"[parameters('machineSettings').imageReference]\",\r\n          \"osDisk\": {\r\n            \"name\": \"osdisk\",\r\n            \"vhd\": {\r\n              \"uri\": \"[concat('https:\/\/', parameters('storageAccountName'), '.blob.core.windows.net\/',variables('vmStorageAccountContainerName'),'\/', parameters('machineSettings').machineNamePrefix, parameters('nodeId'),'os-disk.vhd')]\"\r\n            },\r\n            \"caching\": \"ReadWrite\",\r\n            \"createOption\": \"FromImage\"\r\n          },\r\n          \"dataDisks\": [\r\n            {\r\n              \"name\": \"datadisk0\",\r\n              \"diskSizeGB\": \"[parameters('machineSettings').dataDiskSize]\",\r\n              \"lun\": 0,\r\n              \"caching\": \"None\",\r\n              \"createOption\": \"Empty\",\r\n              \"vhd\": {\r\n                \"Uri\": \"[concat('https:\/\/', parameters('storageAccountName'), '.blob.core.windows.net\/',variables('vmStorageAccountContainerName'),'\/', parameters('machineSettings').machineNamePrefix, parameters('nodeId'),'dataDisk0' ,'.vhd')]\"\r\n              }\r\n            },\r\n            {\r\n              \"name\": \"datadisk1\",\r\n              \"diskSizeGB\": \"[parameters('machineSettings').dataDiskSize]\",\r\n              \"lun\": 1,\r\n              \"caching\": \"None\",\r\n              \"createOption\": \"Empty\",\r\n              \"vhd\": {\r\n                \"Uri\": \"[concat('https:\/\/', parameters('storageAccountName'), '.blob.core.windows.net\/',variables('vmStorageAccountContainerName'),'\/', parameters('machineSettings').machineNamePrefix, parameters('nodeId') ,'dataDisk1','.vhd')]\"\r\n              }\r\n            },\r\n            {\r\n              \"name\": \"datadisk2\",\r\n              \"diskSizeGB\": \"[parameters('machineSettings').dataDiskSize]\",\r\n              \"lun\": 2,\r\n              \"caching\": \"None\",\r\n              \"createOption\": \"Empty\",\r\n              \"vhd\": {\r\n                \"Uri\": \"[concat('https:\/\/', parameters('storageAccountName'), '.blob.core.windows.net\/',variables('vmStorageAccountContainerName'),'\/', parameters('machineSettings').machineNamePrefix, parameters('nodeId') ,'dataDisk2','.vhd')]\"\r\n              }\r\n            },\r\n            {\r\n              \"name\": \"datadisk3\",\r\n              \"diskSizeGB\": \"[parameters('machineSettings').dataDiskSize]\",\r\n              \"lun\": 3,\r\n              \"caching\": \"None\",\r\n              \"createOption\": \"Empty\",\r\n              \"vhd\": {\r\n                \"Uri\": \"[concat('https:\/\/', parameters('storageAccountName'), '.blob.core.windows.net\/',variables('vmStorageAccountContainerName'),'\/', parameters('machineSettings').machineNamePrefix, parameters('nodeId') ,'dataDisk3','.vhd')]\"\r\n              }\r\n            }\r\n          ]\r\n        },\r\n        \"networkProfile\": {\r\n          \"networkInterfaces\": [\r\n            {\r\n              \"id\": \"[resourceId('Microsoft.Network\/networkInterfaces',concat('nic', parameters('nodeId')))]\"\r\n            }\r\n          ]\r\n        }\r\n      }\r\n    },<\/code><\/pre>\n<h3 id=\"toc_22\"><a href=\"https:\/\/github.com\/martinesmann\/couchbase-azure\/blob\/master\/src\/templates\/cluster-nodes-A6.json\">cluster-nodes-A6.json<\/a><\/h3>\n<p>Partial ARM template for configuration using the A6 VM&#8217;s, the same as A2.<\/p>\n<h3 id=\"toc_23\"><a href=\"https:\/\/github.com\/martinesmann\/couchbase-azure\/blob\/master\/src\/templates\/cluster-nodes-D14.json\">cluster-nodes-D14.json<\/a><\/h3>\n<p>Partial ARM template for configuration using the D14 VM&#8217;s, the same as A2.<\/p>\n<h3 id=\"toc_24\"><a href=\"https:\/\/github.com\/martinesmann\/couchbase-azure\/blob\/master\/src\/templates\/couchbase-azure-install.sh\">couchbase-azure-install.sh<\/a><\/h3>\n<p>This shell script is downloaded to download the virtual machines and does alle the work needed to install Couchbase Server on the nodes and setting up the Cluster.<\/p>\n<p>The last part of the script is responsible for configuring the cluster. If you would like to set-up a <code>bucket<\/code> this is the place to add the command line.<\/p>\n<pre><code class=\"language-none\">if [ \"$IS_LAST_NODE\" -eq 1 ]; then\r\n    log \"sleep for 4 minutes to wait for the environment to stabilize\"\r\n    sleep 4m\r\n\r\n    log \"Initializing the first node of the cluster on ${MY_IP}.\"\r\n    \/opt\/couchbase\/bin\/couchbase-cli node-init -c \"$MY_IP\":8091 -u \"${ADMINISTRATOR}\" -p \"${PASSWORD}\" --node-init-data-path=\"${COUCHBASE_DATA}\" --node-init-index-path=\"${COUCHBASE_DATA}\"\r\n    log \"Setting up cluster\"\r\n    \/opt\/couchbase\/bin\/couchbase-cli cluster-init -c \"$MY_IP\":8091  -u \"${ADMINISTRATOR}\" -p \"${PASSWORD}\" --cluster-ramsize=\"${RAM_FOR_COUCHBASE}\" --cluster-index-ramsize=256 --services=data,index,query\r\n    log \"Setting autofailover\"\r\n    \/opt\/couchbase\/bin\/couchbase-cli setting-autofailover  -c \"$MY_IP\":8091  -u \"${ADMINISTRATOR}\" -p \"${PASSWORD}\" --enable-auto-failover=1 --auto-failover-timeout=30\r\n\r\n    for (( i = 0; i &lt; ${#MEMBER_IP_ADDRESSES[@]}; i++ )); do\r\n        log \"Adding node ${MEMBER_IP_ADDRESSES[$i]} to cluster\"\r\n        \/opt\/couchbase\/bin\/couchbase-cli server-add -c \"$MY_IP\":8091 -u \"${ADMINISTRATOR}\" -p \"${PASSWORD}\" --server-add=\"${MEMBER_IP_ADDRESSES[$i]}\":8091 --server-add-username=\"${ADMINISTRATOR}\" --server-add-password=\"${PASSWORD}\" --services=data,index,query\r\n    done\r\n\r\n    log \"Reblancing the cluster\"\r\n    \/opt\/couchbase\/bin\/couchbase-cli rebalance -c \"$MY_IP\":8091 -u \"${ADMINISTRATOR}\" -p \"${PASSWORD}\"\r\n    \r\n    \/*OPTIONAL ADD LOGIC TO CONFIGURE A BUCKET*\/\r\nfi\r\nlog \"Install couchbase complete!\"<\/code><\/pre>\n<h3 id=\"toc_25\"><a href=\"https:\/\/github.com\/martinesmann\/couchbase-azure\/blob\/master\/src\/templates\/jumpbox-resources-disabled.json\">jumpbox-resources-disabled.json<\/a><\/h3>\n<p>Shell script to use when jump box is disabled for the set-up.<\/p>\n<h3 id=\"toc_26\"><a href=\"https:\/\/github.com\/martinesmann\/couchbase-azure\/blob\/master\/src\/templates\/jumpbox-resources-enabled.json\">jumpbox-resources-enabled.json<\/a><\/h3>\n<p>Shell script for setting up the jump box machine.<\/p>\n<h3 id=\"toc_27\"><a href=\"https:\/\/github.com\/martinesmann\/couchbase-azure\/blob\/master\/src\/templates\/metadata.json\">metadata.json<\/a><\/h3>\n<p>File used to keep track of changes, inherited from the original source at couchbase-on-ubuntu.<\/p>\n<h3 id=\"toc_28\"><a href=\"https:\/\/github.com\/martinesmann\/couchbase-azure\/blob\/master\/src\/templates\/shared-resources.json\">shared-resources.json<\/a><\/h3>\n<p>Shared resource, inherited from the original source at couchbase-on-ubuntu.<\/p>\n<h3 id=\"toc_29\"><a href=\"https:\/\/github.com\/martinesmann\/couchbase-azure\/blob\/master\/src\/templates\/vm-disk-utils-0.1.sh\">vm-disk-utils-0.1.sh<\/a><\/h3>\n<p>Linux disk util.<\/p>\n<h2 id=\"toc_30\">Summery<\/h2>\n<p>In this blog post you learned about Azure Resource Manager (ARM) Templates and there usage. We also briefly touched on the specific details for the Couchbase ARM template and the various ways you can interact with Azure and deploy ARM templates.<\/p>\n<p>Happy Deploying!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This blog post describes how to set up your own Couchbase Cluster using Azure Resource Manager templates, aka ARM templates. Prerequisites: If you would like to try this you will need a few things: Azure Subscription, sign-up here for a [&hellip;]<\/p>\n","protected":false},"author":54,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1816],"tags":[1245,1590,1673],"ppma_author":[9027],"class_list":["post-2153","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-couchbase-server","tag-cloud","tag-microsoft","tag-microsoft-azure"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.1 (Yoast SEO v26.1.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Couchbase with Azure ARM Templates - The Couchbase Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/couchbase-with-azure-arm-templates\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Couchbase with Azure ARM Templates\" \/>\n<meta property=\"og:description\" content=\"This blog post describes how to set up your own Couchbase Cluster using Azure Resource Manager templates, aka ARM templates. Prerequisites: If you would like to try this you will need a few things: Azure Subscription, sign-up here for a [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/couchbase-with-azure-arm-templates\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2016-02-04T10:03:31+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-13T23:52:41+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/raw.githubusercontent.com\/martinesmann\/couchbase-azure\/0e4c7556841261c9a7a1d1fffedeab2d369cb9c8\/content\/images\/Screen%20Shot%202016-01-28%20at%2014.17.34.png\" \/>\n<meta name=\"author\" content=\"Martin Esmann, Developer Advocate, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Martin Esmann, Developer Advocate, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"15 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-with-azure-arm-templates\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-with-azure-arm-templates\/\"},\"author\":{\"name\":\"Martin Esmann, Developer Advocate, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/2795ae2ee44b46479499d6fa514b7ee8\"},\"headline\":\"Couchbase with Azure ARM Templates\",\"datePublished\":\"2016-02-04T10:03:31+00:00\",\"dateModified\":\"2025-06-13T23:52:41+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-with-azure-arm-templates\/\"},\"wordCount\":2298,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-with-azure-arm-templates\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"cloud\",\"Microsoft\",\"Microsoft Azure\"],\"articleSection\":[\"Couchbase Server\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/couchbase-with-azure-arm-templates\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-with-azure-arm-templates\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/couchbase-with-azure-arm-templates\/\",\"name\":\"Couchbase with Azure ARM Templates - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-with-azure-arm-templates\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-with-azure-arm-templates\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2016-02-04T10:03:31+00:00\",\"dateModified\":\"2025-06-13T23:52:41+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-with-azure-arm-templates\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/couchbase-with-azure-arm-templates\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-with-azure-arm-templates\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-with-azure-arm-templates\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Couchbase with Azure ARM Templates\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/2795ae2ee44b46479499d6fa514b7ee8\",\"name\":\"Martin Esmann, Developer Advocate, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/af6bbf8de1ed87c78bfbc9ac7454a4fc\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/c8aea3b717146fd35e6b3c299ba8b331987c90cb1996f0141f0c6de29aa04c4b?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/c8aea3b717146fd35e6b3c299ba8b331987c90cb1996f0141f0c6de29aa04c4b?s=96&d=mm&r=g\",\"caption\":\"Martin Esmann, Developer Advocate, Couchbase\"},\"description\":\"Martin Esmann is a .Net Developer Advocate at Couchbase. He is a passionate developer with a deep focus on Microsoft Technologies like .NET.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/author\/martin-esmann\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Couchbase with Azure ARM Templates - The Couchbase Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/couchbase-with-azure-arm-templates\/","og_locale":"en_US","og_type":"article","og_title":"Couchbase with Azure ARM Templates","og_description":"This blog post describes how to set up your own Couchbase Cluster using Azure Resource Manager templates, aka ARM templates. Prerequisites: If you would like to try this you will need a few things: Azure Subscription, sign-up here for a [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/couchbase-with-azure-arm-templates\/","og_site_name":"The Couchbase Blog","article_published_time":"2016-02-04T10:03:31+00:00","article_modified_time":"2025-06-13T23:52:41+00:00","og_image":[{"url":"https:\/\/raw.githubusercontent.com\/martinesmann\/couchbase-azure\/0e4c7556841261c9a7a1d1fffedeab2d369cb9c8\/content\/images\/Screen%20Shot%202016-01-28%20at%2014.17.34.png","type":"","width":"","height":""}],"author":"Martin Esmann, Developer Advocate, Couchbase","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Martin Esmann, Developer Advocate, Couchbase","Est. reading time":"15 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-with-azure-arm-templates\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-with-azure-arm-templates\/"},"author":{"name":"Martin Esmann, Developer Advocate, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/2795ae2ee44b46479499d6fa514b7ee8"},"headline":"Couchbase with Azure ARM Templates","datePublished":"2016-02-04T10:03:31+00:00","dateModified":"2025-06-13T23:52:41+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-with-azure-arm-templates\/"},"wordCount":2298,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-with-azure-arm-templates\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["cloud","Microsoft","Microsoft Azure"],"articleSection":["Couchbase Server"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/couchbase-with-azure-arm-templates\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-with-azure-arm-templates\/","url":"https:\/\/www.couchbase.com\/blog\/couchbase-with-azure-arm-templates\/","name":"Couchbase with Azure ARM Templates - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-with-azure-arm-templates\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-with-azure-arm-templates\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2016-02-04T10:03:31+00:00","dateModified":"2025-06-13T23:52:41+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-with-azure-arm-templates\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/couchbase-with-azure-arm-templates\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-with-azure-arm-templates\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-with-azure-arm-templates\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Couchbase with Azure ARM Templates"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"The Couchbase Blog","description":"Couchbase, the NoSQL Database","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"The Couchbase Blog","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/2795ae2ee44b46479499d6fa514b7ee8","name":"Martin Esmann, Developer Advocate, Couchbase","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/af6bbf8de1ed87c78bfbc9ac7454a4fc","url":"https:\/\/secure.gravatar.com\/avatar\/c8aea3b717146fd35e6b3c299ba8b331987c90cb1996f0141f0c6de29aa04c4b?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/c8aea3b717146fd35e6b3c299ba8b331987c90cb1996f0141f0c6de29aa04c4b?s=96&d=mm&r=g","caption":"Martin Esmann, Developer Advocate, Couchbase"},"description":"Martin Esmann is a .Net Developer Advocate at Couchbase. He is a passionate developer with a deep focus on Microsoft Technologies like .NET.","url":"https:\/\/www.couchbase.com\/blog\/author\/martin-esmann\/"}]}},"authors":[{"term_id":9027,"user_id":54,"is_guest":0,"slug":"martin-esmann","display_name":"Martin Esmann, Developer Advocate, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/c8aea3b717146fd35e6b3c299ba8b331987c90cb1996f0141f0c6de29aa04c4b?s=96&d=mm&r=g","author_category":"","last_name":"Esmann","first_name":"Martin","job_title":"","user_url":"","description":"Martin Esmann is a .Net Developer Advocate at Couchbase. He is a passionate developer with a deep focus on Microsoft Technologies like .NET."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/2153","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/users\/54"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/comments?post=2153"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/2153\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/media?parent=2153"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/categories?post=2153"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/tags?post=2153"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/ppma_author?post=2153"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}