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.
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
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
andresources
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
andoutputs
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.