Azure Resource Manager (ARM) Template Merge

Usage no npm install needed!

<script type="module">
  import armTemplateMerge from '';



npm package Node.js version

Azure Resource Manager (ARM) Template Merge

This tool merges multiple Azure Resource Manager (ARM) template files into a single template file.

Although linked templates may be used for combining multiple resources into a single deployment, they have some drawbacks:

  • All linked templates must be accessible via a public URL so Azure Resource Manager can reach them during deployment, which may not be possible or cumbersome on some scenarios.
  • Each linked template is resolved as a separate deployment, which may not be desired.
  • Only the incremental deployment mode is allowed for linked templates.


How to use

Install the CLI globally:

npm install -g arm-template-merge

Then run arm-template-merge without any arguments for details on its utilization.

Alternatively, you can execute the CLI without installing it by running:

npx arm-template-merge

Adding it as a dependency

You may add it to your project as a dependency:

npm install arm-template-merge

And use the merge functionality from your code:

const fs = require('fs');
const mergeARMTemplates = require('arm-template-merge');

let template1 = JSON.parse(fs.readFileSync('template1.json', 'utf8'));
let template2 = JSON.parse(fs.readFileSync('template2.json', 'utf8'));

let merged = {};
merged = mergeARMTemplates(merged, template1);
merged = mergeARMTemplates(merged, template2);

fs.writeFileSync('merged-template.json', JSON.stringify(merged), 'utf8');


The following rules are used for merging ARM template files:

  • All files MUST share the same exact values for the following fields:

    • $schema
    • contentVersion
    • apiProfile (if present)
  • All files' functions and resources collections will each be combined into a single collection. Objects within a collection that are exact copies will yield a single object in the merged collection:

    [                    |    [                    |    [
      { <object-A> },  --|-------------------------|-->   { <object-A> },
                         |      { <object-B> },  --|-->   { <object-B> },
      { <object-C> },    |      { <object-C> },    |      { <object-C> }
    ]                    |    ]                    |    ]
  • All files' parameters, variables and outputs objects will each be combined into a single object. Files declaring the same key within an object MUST have the same exact value, or an error will be thrown:

    {                    |    {                    |    {
      "A": <value-A>,  --|-------------------------|-->   "A": <value-A>,
                         |      "B": <value-B>,  --|-->   "B": <value-B>,
      "C": <value-C>,    |      "C": <value-C>,    |      "C": <value-C>
      "D": <value-D1>    |      "D": <value-D2>    |      <<< ERROR >>>
    }                    |    }                    |    }
  • Value and object equality follows Node.js' assert.deepStrictEqual() rules.