diff --git a/Gemfile b/Gemfile
new file mode 100755
index 000000000..9863f8b55
--- /dev/null
+++ b/Gemfile
@@ -0,0 +1,10 @@
+source "https://rubygems.org"
+ruby RUBY_VERSION
+
+# This is the default theme for new Jekyll sites. You may change this to anything you like.
+gem "minima", "~> 2.0"
+
+# If you want to use GitHub Pages, remove the "gem "jekyll"" above and
+# uncomment the line below. To upgrade, run `bundle update github-pages`.
+gem "github-pages", group: :jekyll_plugins
+
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 000000000..733249598
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,35 @@
+Copyright (c) 2021, Oracle and/or its affiliates.
+
+The Universal Permissive License (UPL), Version 1.0
+
+Subject to the condition set forth below, permission is hereby granted to any
+person obtaining a copy of this software, associated documentation and/or data
+(collectively the "Software"), free of charge and under any and all copyright
+rights in the Software, and any and all patent rights owned or freely
+licensable by each licensor hereunder covering either (i) the unmodified
+Software as contributed to or provided by such licensor, or (ii) the Larger
+Works (as defined below), to deal in both
+
+(a) the Software, and
+(b) any piece of software and/or hardware listed in the lrgrwrks.txt file if
+one is included with the Software (each a "Larger Work" to which the Software
+is contributed by such licensors),
+
+without restriction, including without limitation the rights to copy, create
+derivative works of, display, perform, and distribute the Software and make,
+use, sell, offer for sale, import, export, have made, and have sold the
+Software and the Larger Work(s), and to sublicense the foregoing rights on
+either these or other terms.
+
+This license is subject to the following condition:
+The above copyright notice and either this complete permission notice or at
+a minimum a reference to the UPL must be included in all copies or
+substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/Makefile b/Makefile
new file mode 100644
index 000000000..742d7d7dd
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,25 @@
+all:
+ cp subtemplate-src/addnode-coherence.md cluster/addnode-coherence.md
+ cp subtemplate-src/addnode-coherence.md dynamic-cluster/addnode-coherence.md
+ cp subtemplate-src/admin-aadNestedTemplate.md admin/aadNestedTemplate.md
+ cp subtemplate-src/admin-customDNSTemplate.md admin/customDNSTemplate.md
+ cp subtemplate-src/admin-elkNestedTemplate.md admin/elkNestedTemplate.md
+ cp subtemplate-src/appGatewayNestedTemplate.md cluster
+ cp subtemplate-src/cluster-aadNestedTemplate.md cluster/aadNestedTemplate.md
+ cp subtemplate-src/cluster-addnode.md cluster/addnode.md
+ cp subtemplate-src/cluster-customDNSTemplate.md cluster/customDNSTemplate.md
+ cp subtemplate-src/cluster-deletenode.md cluster/deletenode.md
+ cp subtemplate-src/cluster-elkNestedTemplate.md cluster/elkNestedTemplate.md
+ cp subtemplate-src/cluster-nsgRulesTemplate.md cluster/nsgRulesTemplate.md
+ cp subtemplate-src/coherenceTemplate.md cluster/coherenceTemplate.md
+ cp subtemplate-src/coherenceTemplate.md dynamic-cluster/coherenceTemplate.md
+ cp subtemplate-src/dbTemplate.md admin
+ cp subtemplate-src/dbTemplate.md cluster
+ cp subtemplate-src/dbTemplate.md dynamic-cluster
+ cp subtemplate-src/dynamic-cluster-aadNestedTemplate.md dynamic-cluster/aadNestedTemplate.md
+ cp subtemplate-src/dynamic-cluster-addnode.md dynamic-cluster/addnode.md
+ cp subtemplate-src/dynamic-cluster-deletenode.md dynamic-cluster/deletenode.md
+ cp subtemplate-src/dynamic-cluster-elkNestedTemplate.md dynamic-cluster/elkNestedTemplate.md
+ cp subtemplate-src/dynamic-cluster-nsgRulesTemplate.md dynamic-cluster/nsgRulesTemplate.md
+ cp subtemplate-src/dynamic-cluster-ohsNestedTemplate.md dynamic-cluster/ohsNestedTemplate.md
+ cp subtemplate-src/dynamic-cluster-customDNSTemplate.md dynamic-cluster/customDNSTemplate.md
diff --git a/README.md b/README.md
new file mode 100644
index 000000000..650c30c8d
--- /dev/null
+++ b/README.md
@@ -0,0 +1,91 @@
+# arm-oraclelinux-wls
+# Simple deployment of a Oracle Linux VM with WebLogic Server pre-installed
+
+This template allows us to deploy a simple Oracle Linux VM with WebLogic Server (12.2.1.3.0) pre-installed.
+By default, this template deploys an A3 size VM in the resource group location and return the fully qualified domain name of the VM.
+
+To install WebLogic Server, requires Oracle WebLogic Install kit and Oracle JDK to be downloaded, from OTN Site (https://www.oracle.com/technical-resources/). The OTN site requires the user to accept OTN Free Developer License Agreement before downloading any resources.
+So, when this template is run, the user will be required to accept the OTN Free Developer License Agreement and also provide OTN credentials (username and password), to download the Oracle WebLogic Install Kit and Oracle JDK.
+
+
+
Using the template
+
+
Perform string substitution to generate the necessary artifacts for deployment or uploading to the Azure Cloud Partner Portal
+
+* Install Apache Maven. This project uses Apache Maven to do a simple
+ string substitution for several required parameters in the templates.
+
+* From the top level run `mvn clean install`.
+
+* The templates end up in `arm-oraclelinux-wls/arm-oraclelinux-wls/target/arm`. Change to that directory to run the templates.
+
+
Once you have performed the string substitution, you can deploy the template via the command line
+
+**PowerShell**
+
+*#use this command when you need to create a new resource group for your deployment*
+
+*New-AzResourceGroup -Name <resource-group-name> -Location <resource-group-location>
+
+*New-AzResourceGroupDeployment -ResourceGroupName <resource-group-name> -TemplateFile mainTemplate.json*
+
+**Command line**
+
+```
+az group create --name <resource-group-name> --location <resource-group-location>
+
+az group deployment create --resource-group <resource-group-name> --template-file mainTemplate.json --parameters @parametersFile.json
+```
+
+For example:
+
+```
+az group deployment create --resource-group 20191001-01-my-rg --parameters @my-parameters.json --template-file arm-oraclelinux-wls/target/arm/mainTemplate.json
+```
+
+If you are new to Azure virtual machines, see:
+
+- [Azure Virtual Machines](https://azure.microsoft.com/services/virtual-machines/).
+- [Azure Linux Virtual Machines documentation](https://docs.microsoft.com/azure/virtual-machines/linux/)
+- [Azure Windows Virtual Machines documentation](https://docs.microsoft.com/azure/virtual-machines/windows/)
+- [Template reference](https://docs.microsoft.com/azure/templates/microsoft.compute/allversions)
+- [Quickstart templates](https://azure.microsoft.com/resources/templates/?resourceType=Microsoft.Compute&pageNumber=1&sort=Popular)
+
+If you are new to template deployment, see:
+
+[Azure Resource Manager documentation](https://docs.microsoft.com/azure/azure-resource-manager/)
+
+## Considerations for CI/CD
+
+
Running the tests
+
+Microsoft provides template validation tests in the Git repo for [azure-quickstart-templates](https://github.com/Azure/azure-quickstart-templates/tree/master/test/template-tests). This project includes a Maven configuration to run those tests against the ARM template. This is useful when building the template as part of a CI/CD pipeline.
+
+
Preconditions
+
+The environment running the tests must have the git repo for
+[Azure Quickstart Templates)[https://github.com/Azure/azure-quickstart-templates] checked
+out in the expected place, and the necessary PowerShell software installed
+
+1. Make it so the environment that runs `mvn` is able to execute the PowerShell command.
+
+2. Git clone the [Azure Quickstart Templates)[https://github.com/Azure/azure-quickstart-templates] into the top level `target` directory.
+
+
Running the tests
+
+1. run `mvn install` in the top level directory. **Do not run `mvn
+ clean` as this will delete the directory from step 3 above**
+
+2. Change to `arm-oraclelinux-wls` and run `mvn -Dgit.repo=edburns -Ptemplate-validation-tests install`
+
+3. The template validation tests should run. You must see no failures, signified by lines that start with `[-]`
+ tests and some large number of passing tests: `[+]`.
+
+4. The zip file to upload to the Cloud Partner Portal is located in the
+ target directory.
+
+## Updating the Versions
+
+```
+mvn versions:set -DnewVersion=1.0.1 -DoldVersion=* -DgroupId=com.oracle.weblogic.azure -DartifactId=*
+```
diff --git a/_config.yml b/_config.yml
new file mode 100644
index 000000000..6bd888f58
--- /dev/null
+++ b/_config.yml
@@ -0,0 +1,2 @@
+theme: jekyll-theme-primer
+repository: "wls-eng/arm-oraclelinux-wls"
diff --git a/_data/var.yml b/_data/var.yml
new file mode 100644
index 000000000..ddd176cb8
--- /dev/null
+++ b/_data/var.yml
@@ -0,0 +1,19 @@
+azureFullBrandName: Microsoft Azure IaaS
+wlsFullBrandName: Oracle WebLogic Server
+brandNameNumber: 12c
+partNumber: E48696-01
+publicationDate: March 2021
+versionOr: 12.1.2.3
+# versionOr: 12.1.2.3 or 12.1.2.4 # edburns: only support 12.2.1.3 now.
+oracleLinuxVersion: 7.4
+jdkVersion: Oracle JDK 8u131
+jdkVersionNumber: jdk1.8.0_131
+repoPrefix: /arm-oraclelinux-wls-
+artifactsLocationBase: https://raw.githubusercontent.com/wls-eng/arm-oraclelinux-wls-
+passwordInFileNote: |-3
+ Some things to note:
+
+ * We did not include values for parameters that have a default value.
+ * Even though this parameters file has values for sensitive fields such as passwords, these values are not echoed on the command line, or repeated in the logs because they are passed directly as `secureString` type in ARM. **Please ensure any occurrences of the parameters file in the filesystem are sufficiently secured.**
+
+artifactsLocationTag: 2021-03-23-01-Q1
diff --git a/_includes/head.html b/_includes/head.html
new file mode 100644
index 000000000..9983823a4
--- /dev/null
+++ b/_includes/head.html
@@ -0,0 +1,3 @@
+
+
+
diff --git a/_includes/sub-template-01.md b/_includes/sub-template-01.md
new file mode 100644
index 000000000..f44a916e0
--- /dev/null
+++ b/_includes/sub-template-01.md
@@ -0,0 +1,3 @@
+This page lists the available templates for working with existing
+deployments. These templates perform various operations on an existing
+deployment after it has initially been deployed from the Azure portal.
diff --git a/_includes/toc.html b/_includes/toc.html
new file mode 100644
index 000000000..fad7e7998
--- /dev/null
+++ b/_includes/toc.html
@@ -0,0 +1,5 @@
+
diff --git a/_includes/variables.md b/_includes/variables.md
new file mode 100644
index 000000000..822fee0db
--- /dev/null
+++ b/_includes/variables.md
@@ -0,0 +1,41 @@
+{% comment %}
+Account for variability in the repo paths.
+{% endcomment %}
+
+{% assign pageDirName = page.dir | replace: "/", "" %}
+{% capture pageDir %}{{ pageDirName }}{% endcapture %}
+
+{% if pageDir contains "admin" %}
+ {% capture armTemplateBasePath %}{{ site.data.var.artifactsLocationBase }}{{ pageDir }}/{{ site.data.var.artifactsLocationTag }}/src/main/arm/{% endcapture %}
+
+ {% comment %}
+ something like https://raw.githubusercontent.com/edburns/arm-oraclelinux-wls-admin/2020-06-24-01-Q2/src/main/arm/
+ {% endcomment %}
+
+{% else %}
+ {% assign repoPrefix = site.data.var.repoPrefix %}
+ {% capture armTemplateBasePath %}{{ site.data.var.artifactsLocationBase }}{{ pageDir }}/{{ site.data.var.artifactsLocationTag }}{{ repoPrefix }}{{ pageDir }}/src/main/arm/{% endcapture %}
+
+ {% comment %}
+ something like https://raw.githubusercontent.com/edburns/arm-oraclelinux-wls-cluster/2020-06-24-01-Q2/arm-oraclelinux-wls-cluster/src/main/arm/
+ {% endcomment %}
+
+ {% capture armTemplateDeleteNodeBasePath %}{{ site.data.var.artifactsLocationBase }}{{ pageDir }}/{{ site.data.var.artifactsLocationTag }}/deletenode/src/main/{% endcapture %}
+
+ {% comment %}
+ something like https://raw.githubusercontent.com/edburns/arm-oraclelinux-wls-cluster/2020-06-24-01-Q2/deletenode/src/main/
+ {% endcomment %}
+
+ {% capture armTemplateAddNodeBasePath %}{{ site.data.var.artifactsLocationBase }}{{ pageDir }}/{{ site.data.var.artifactsLocationTag }}/addnode/src/main/{% endcapture %}
+
+ {% comment %}
+ something like https://raw.githubusercontent.com/edburns/arm-oraclelinux-wls-cluster/2020-06-24-01-Q2/addnode/src/main/
+ {% endcomment %}
+
+ {% capture armTemplateAddCacheNodeBasePath %}{{ site.data.var.artifactsLocationBase }}{{ pageDir }}/{{ site.data.var.artifactsLocationTag }}/addnode-coherence/src/main/{% endcapture %}
+
+ {% comment %}
+ something like https://raw.githubusercontent.com/edburns/arm-oraclelinux-wls-cluster/2020-06-24-01-Q2/addnode=-coherence/src/main/
+ {% endcomment %}
+
+{% endif %}
diff --git a/_layouts/default.html b/_layouts/default.html
new file mode 100644
index 000000000..059e9fda8
--- /dev/null
+++ b/_layouts/default.html
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+ {% seo title=false %}
+ {{ site.data.var.wlsFullBrandName }} on Azure
+
+
+
+
+
+
+ {% if site.google_analytics %}
+
+ {% endif %}
+
+
diff --git a/admin/aadNestedTemplate.md b/admin/aadNestedTemplate.md
new file mode 100644
index 000000000..6cffeaeb5
--- /dev/null
+++ b/admin/aadNestedTemplate.md
@@ -0,0 +1,304 @@
+{% include variables.md %}
+
+# Apply Azure Active Directory ARM Template to {{ site.data.var.wlsFullBrandName }}
+
+This page documents how to configure an existing deployment of {{ site.data.var.wlsFullBrandName }} with an existing Azure Active Directory Domain Service (AAD DS) using Azure CLI.
+
+## Prerequisites
+
+### Environment for Setup
+
+* [Azure CLI](https://docs.microsoft.com/en-us/cli/azure), use `az --version` to test if `az` works.
+
+### WebLogic Server Instance
+
+The AAD ARM template will be applied to an existing {{ site.data.var.wlsFullBrandName }} instance. If you don't have one, please create a new instance from the Azure portal, by following the link to the offer [in the index](index.md).
+
+### Azure Active Directory LDAP Instance
+
+To apply AAD to {{ site.data.var.wlsFullBrandName }}, you must have an existing Azure Active Directory LDAP instance to use. If you don't have AAD LADP instance, please follow the steps in the tutorial [Configure secure LDAP for an Azure Active Directory Domain Services managed domain](https://docs.microsoft.com/en-us/azure/active-directory-domain-services/tutorial-configure-ldaps).
+
+## Prepare the Parameters JSON file
+
+You must construct a parameters JSON file containing the parameters to the AAD ARM template. See [Create Resource Manager parameter file](https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/parameter-files) for background information about parameter files. We must specify the information of the existing {{ site.data.var.wlsFullBrandName }} and AAD instance. This section shows how to obtain the values for the following required properties.
+
+| Parameter Name | Explanation |
+|----------------|-------------|
+| `_artifactsLocation`| See below for details. |
+| `aadsPortNumber` | (optional) The LDAP port number, defaults to 636. |
+| `aadsPublicIP` | The IP address of the LDAP server |
+| `aadsServerHost` | The hostname of the Active Directory Domain Services server. |
+| `adminVMName`| At deployment time, if this value was changed from its default value, the value used at deployment time must be used. Otherwise, this parameter should be omitted. |
+| `location` | Must be the same region into which the server was initially deployed. |
+| `wlsDomainName` | The name of the {{ site.data.var.wlsFullBrandName }} domain. |
+| `wlsLDAPGroupBaseDN` | The base distinguished name (DN) of the tree in the LDAP directory that contains groups. |
+| `wlsLDAPPrincipalPassword` | The credential (usually a password) used to connect to the LDAP server. |
+| `wlsLDAPPrincipal` | The Distinguished Name (DN) of the LDAP user that {{ site.data.var.wlsFullBrandName }} should use to connect to the LDAP server. |
+| `wlsLDAPProviderName` | (optional) The value used for creating authentication provider name of WebLogic Server. |
+| `wlsLDAPSSLCertificate` | Client certificate that will be imported to trust store of SSL. |
+| `wlsLDAPSSLCertificate` | See below for details. |
+| `wlsLDAPUserBaseDN` | The base distinguished name (DN) of the tree in the LDAP directory that contains users. |
+| `wlsPassword` | Must be the same value provided at deployment time. |
+| `wlsUserName` | Must be the same value provided at deployment time. |
+
+### `_artifactsLocation`
+
+This value must be the following.
+
+```bash
+{{ armTemplateBasePath }}
+```
+
+### `wlsLDAPSSLCertificate`
+
+Use base64 to encode your existing SSL certificate.
+
+```bash
+base64 your-certificate.cer -w 0 >temp.txt
+```
+
+Use the content as this file as the value of the `wlsLDAPSSLCertificate` parameter.
+
+#### Example Parameters JSON
+
+Here is a fully filled out parameters file.
+
+{{ site.data.var.passwordInFileNote }}
+
+```json
+{
+ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "_artifactsLocation": {
+ "value": "{{ armTemplateBasePath }}"
+ },
+ "aadsPublicIP": {
+ "value": "1.2.3.4"
+ },
+ "aadsServerHost": {
+ "value": "ladps.fabrikam.com"
+ },
+ "location": {
+ "value": "eastus"
+ },
+ "wlsDomainName": {
+ "value": "adminDomain"
+ },
+ "wlsLDAPGroupBaseDN": {
+ "value": "OU=AADDC Users,DC=fabrikam,DC=com"
+ },
+ "wlsLDAPPrincipal": {
+ "value": "CN=WLSTest,OU=AADDC Users,DC=fabrikam,DC=com"
+ },
+ "wlsLDAPPrincipalPassword": {
+ "value": "Secret123!"
+ },
+ "wlsLDAPSSLCertificate": {
+ "value": "MIIKQQIBAz....EkAgIIAA=="
+ },
+ "wlsLDAPUserBaseDN": {
+ "value": "OU=AADDC Users,DC=fabrikam,DC=com"
+ },
+ "wlsPassword": {
+ "value": "welcome1"
+ },
+ "wlsUserName": {
+ "value": "weblogic"
+ }
+ }
+}
+```
+
+## Invoke the ARM template
+
+Assume your parameters file is available in the current directory and is named `parameters.json`. This section shows the commands to configure your {{ site.data.var.wlsFullBrandName }} deployment with the specified AAD. Replace `yourResourceGroup` with the Azure resource group in which the {{ site.data.var.wlsFullBrandName }} is deployed.
+
+### First, validate your parameters file
+
+The `az group deployment validate` command is very useful to validate your parameters file is syntactically correct.
+
+```bash
+az group deployment validate --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateBasePath }}nestedtemplates/aadNestedTemplate.json
+```
+
+If the command returns with an exit status other than `0`, inspect the output and resolve the problem before proceeding. You can check the exit status by executing the commad `echo $?` immediately after the `az` command.
+
+### Next, execute the template
+
+After successfully validating the template invocation, change `validate` to `create` to invoke the template.
+
+```bash
+az group deployment create --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateBasePath }}nestedtemplates/aadNestedTemplate.json
+```
+
+As with the validate command, if the command returns with an exit status other than `0`, inspect the output and resolve the problem.
+
+This is an example output of successful deployment. Look for `"provisioningState": "Succeeded"` in your output.
+
+```json
+{
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-admin-06082/providers/Microsoft.Resources/deployments/cli",
+ "location": null,
+ "name": "cli",
+ "properties": {
+ "correlationId": "6d98e1c8-0778-4fa5-a30a-8f10bbbb6818",
+ "debugSetting": null,
+ "dependencies": [
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-admin-06082/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "oraclevm-admin-06082",
+ "resourceName": "adminVM/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-admin-06082/providers/Microsoft.Resources/deployments/pid-8295df19-fe6b-5745-ad24-51ef66522b24",
+ "resourceGroup": "oraclevm-admin-06082",
+ "resourceName": "pid-8295df19-fe6b-5745-ad24-51ef66522b24",
+ "resourceType": "Microsoft.Resources/deployments"
+ }
+ ],
+ "duration": "PT2M59.6052694S",
+ "mode": "Incremental",
+ "onErrorDeployment": null,
+ "outputResources": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-admin-06082/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "oraclevm-admin-06082"
+ }
+ ],
+ "outputs": {
+ "artifactsLocationPassedIn": {
+ "type": "String",
+ "value": "https://raw.githubusercontent.com/galiacheng/arm-oraclelinux-wls-admin/deploy/src/main/arm/"
+ }
+ },
+ "parameters": {
+ "_artifactsLocation": {
+ "type": "String",
+ "value": "https://raw.githubusercontent.com/galiacheng/arm-oraclelinux-wls-admin/deploy/src/main/arm/"
+ },
+ "_artifactsLocationAADTemplate": {
+ "type": "String",
+ "value": "https://raw.githubusercontent.com/galiacheng/arm-oraclelinux-wls-admin/deploy/src/main/arm/"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "SecureString"
+ },
+ "aadsPortNumber": {
+ "type": "String",
+ "value": "636"
+ },
+ "aadsPublicIP": {
+ "type": "String",
+ "value": "40.76.11.111"
+ },
+ "aadsServerHost": {
+ "type": "String",
+ "value": "ladps.wls-security.com"
+ },
+ "adminVMName": {
+ "type": "String",
+ "value": "adminVM"
+ },
+ "location": {
+ "type": "String",
+ "value": "eastus"
+ },
+ "wlsDomainName": {
+ "type": "String",
+ "value": "adminDomain"
+ },
+ "wlsLDAPGroupBaseDN": {
+ "type": "String",
+ "value": "OU=AADDC Users,DC=wls-security,DC=com"
+ },
+ "wlsLDAPPrincipal": {
+ "type": "String",
+ "value": "CN=WLSTest,OU=AADDC Users,DC=wls-security,DC=com"
+ },
+ "wlsLDAPPrincipalPassword": {
+ "type": "SecureString"
+ },
+ "wlsLDAPProviderName": {
+ "type": "String",
+ "value": "AzureActiveDirectoryProvider"
+ },
+ "wlsLDAPSSLCertificate": {
+ "type": "String",
+ "value": "LS0tLS1...LQ0K"
+ },
+ "wlsLDAPUserBaseDN": {
+ "type": "String",
+ "value": "OU=AADDC Users,DC=wls-security,DC=com"
+ },
+ "wlsPassword": {
+ "type": "SecureString"
+ },
+ "wlsUserName": {
+ "type": "String",
+ "value": "weblogic"
+ }
+ },
+ "parametersLink": null,
+ "providers": [
+ {
+ "id": null,
+ "namespace": "Microsoft.Resources",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ null
+ ],
+ "properties": null,
+ "resourceType": "deployments"
+ }
+ ]
+ },
+ {
+ "id": null,
+ "namespace": "Microsoft.Compute",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "virtualMachines/extensions"
+ }
+ ]
+ }
+ ],
+ "provisioningState": "Succeeded",
+ "template": null,
+ "templateHash": "2818584196763146470",
+ "templateLink": null,
+ "timestamp": "2020-06-09T07:07:03.444046+00:00"
+ },
+ "resourceGroup": "oraclevm-admin-06082",
+ "type": "Microsoft.Resources/deployments"
+}
+
+```
+
+## Verify AAD Integration
+
+Follow the steps to check if AAD is enabled.
+
+* Visit the {{ site.data.var.wlsFullBrandName }} Admin console.
+* In the left navigator, expand the tree to select **Security Realms** -> **myrealm** -> **Providers**.
+* If the integration was successful, you will find the AAD provider for example `AzureActiveDirectoryProvider`.
+* In the left navigator, expand the tree to select **Security Realms** -> **myrealm** -> **Users and Groups**.
+* If the integration was successful, you will find users from the AAD provider.
diff --git a/admin/customDNSTemplate.md b/admin/customDNSTemplate.md
new file mode 100644
index 000000000..746b9e506
--- /dev/null
+++ b/admin/customDNSTemplate.md
@@ -0,0 +1,164 @@
+{% include variables.md %}
+
+# Configure DNS alias to {{ site.data.var.wlsFullBrandName }}
+
+This page documents how to configure an existing deployment of {{ site.data.var.wlsFullBrandName }} with a custom DNS alias.
+
+## Prerequisites
+
+### Environment for Setup
+
+* [Azure CLI](https://docs.microsoft.com/en-us/cli/azure), use `az --version` to test if `az` works.
+
+### WebLogic Server Instance
+
+The DNS Configuraton ARM template will be applied to an existing {{ site.data.var.wlsFullBrandName }} instance. If you don't have one, please create a new instance from the Azure portal, by following the link to the offer [in the index](index.md).
+
+### Registered Domain Name
+
+You need to buy a domain name to create a custom DNS alias.
+
+### Azure DNS Zone
+
+If you create the DNS alias on an existing [Azure DNS Zone](https://docs.microsoft.com/en-us/azure/dns/dns-overview), make sure you have perfomed the [Azure DNS Delegation](https://docs.microsoft.com/en-us/azure/dns/dns-domain-delegation). Once you have completed the delegation, you can verify it with `nslookup`. For example, assuming your domain name is **contoso.com**, this output shows a correct delegation.
+
+```bash
+$ nslookup -type=SOA contoso.com
+Server: 172.29.80.1
+Address: 172.29.80.1#53
+
+Non-authoritative answer:
+contoso.com
+ origin = ns1-01.azure-dns.com
+ mail addr = azuredns-hostmaster.microsoft.com
+ serial = 1
+ refresh = 3600
+ retry = 300
+ expire = 2419200
+ minimum = 300
+Name: ns1-01.azure-dns.com
+Address: 40.90.4.1
+Name: ns1-01.azure-dns.com
+Address: 2603:1061::1
+```
+
+We strongly recommand you create an Azure DNS Zone for domain management and reuse it for other perpose. Follow the [guide](https://docs.microsoft.com/en-us/azure/dns/dns-getstarted-portal) to create an Azure DNS Zone.
+
+### Azure Managed Indentify
+
+If you are going to configure DNS alias based on an existing DNS Zone, you are required to input the ID of a user-assigned managed identity.
+
+Follow this [guide](https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/how-to-manage-ua-identity-portal) to create a user-assigned managed identity.
+
+To obtain ID of the indentify: go to Azure Portal; open the identity **Overview** page; click **JSON View** and copy the **Resource ID**.
+
+
+## Prepare the Parameters
+
+We provide an automation shell script for DNS configuration. You must specify the information of the existing Oracle WebLogic Server. This section shows how to obtain the values for the following required properties.
+
+| Parameter Name | Explanation |
+|----------------|-------------|
+| `--admin-vm-name`| Required. Name of vitual machine that hosts {{ site.data.var.wlsFullBrandName }} admin server. Must be the same value provided at initial deployment time.|
+| `--admin-console-label` | Required. Label for {{ site.data.var.wlsFullBrandName }} admin console. Used to generate subdomain of admin console. |
+| `--artifact-location`| Required. See below for details. |
+| `--resource-group` | Required. Name of resource group that has WebLogic cluster deployed. |
+| `--location ` | Required. Must be the same region into which the server was initially deployed. |
+| `--zone-name ` | Required. Azure DNS Zone name. |
+| `--identity-id` | Optional. ID of Azure user-assigned managed identity. The parameter is only required if you are creating DNS alias on an existing DNS Zone.|
+| `--zone-resource-group` | Optional. Name of resource group that has Azure DNS Zone deployed. The parameter is only required if you are creating DNS alias on an existing DNS Zone. |
+| `--help` | Help. |
+
+### Artifacts location
+
+This value must be the following.
+
+```bash
+{{ armTemplateBasePath }}
+```
+
+## Invoke the Automation Script
+
+We provide an automation script to configure a custom DNS alias. The script lets you do the following:
+
+ * If you have an Azure DNS Zone, it will create a DNS alias for the admin console on the existing DNS Zone.
+ * If you don't have an Azure DNS Zone, it will create the DNS Zone in the same resource group as the WebLogic cluster, then create the DNS alias for the admin console.
+
+### Configure DNS Alias on an Existing Azure DNS Zone
+
+To configure a DNS alias on an existing Azure DNS Zone, in addition to the required parameters, you must also specify an Azure user-assigned managed identity ID and the resource group name in which your DNS Zone is deployed.
+
+This is an example to create a DNS alias `admin.contoso.com` for the admin console in an existing Azure DNS Zone.
+
+```bash
+$ curl -fsSL {{ site.data.var.artifactsLocationBase }}{{ pageDir }}/{{ site.data.var.artifactsLocationTag }}/cli-scripts/custom-dns-alias-cli.sh \
+ | /bin/bash -s -- \
+ --resource-group `yourResourceGroup` \
+ --admin-vm-name adminVM \
+ --admin-console-label admin \
+ --artifact-location {{ armTemplateBasePath }} \
+ --location eastus \
+ --zone-name contoso.com \
+ --identity-id `yourIndentityID` \
+ --zone-resource-group `yourDNSZoneResourceGroup`
+```
+
+An example output:
+
+```text
+Done!
+
+Custom DNS alias:
+ Resource group: haiche-dns-doc
+ WebLogic Server Administration Console URL: http://admin.contoso.com:7001/console
+ WebLogic Server Administration Console secured URL: https://admin.contoso.com:7002/console
+
+```
+
+
+### Configure DNS Alias on a New Azure DNS Zone
+
+To configure a DNS alias on a new Azure DNS Zone, you must specify the required parameters.
+
+This is an example of creating an Azure DNS Zone, then creating a DNS alias `admin.contoso.com` for the admin console.
+
+```bash
+$ curl -fsSL {{ site.data.var.artifactsLocationBase }}{{ pageDir }}/{{ site.data.var.artifactsLocationTag }}/cli-scripts/custom-dns-alias-cli.sh \
+ | /bin/bash -s -- \
+ --resource-group `yourResourceGroup` \
+ --admin-vm-name adminVM \
+ --admin-console-label admin \
+ --artifact-location {{ armTemplateBasePath }} \
+ --location eastus \
+ --zone-name contoso.com
+```
+
+An example output:
+
+```text
+DONE!
+
+
+Action required:
+ Complete Azure DNS delegation to make the alias accessible.
+ Reference: https://aka.ms/dns-domain-delegation
+ Name servers:
+ [
+ "ns1-02.azure-dns.com.",
+ "ns2-02.azure-dns.net.",
+ "ns3-02.azure-dns.org.",
+ "ns4-02.azure-dns.info."
+ ]
+
+Custom DNS alias:
+ Resource group: haiche-dns-doc
+ WebLogic Server Administration Console URL: http://admin.contoso.com:7001/console
+ WebLogic Server Administration Console secured URL: https://admin.contoso.com:7002/console
+```
+
+**Note:** The DNS aliases are not accessible now, you must perform Azure DNS delegation after the deployment. Follow [Delegation of DNS zones with Azure DNS](https://aka.ms/dns-domain-delegation) to complete the Azure DNS delegation.
+
+
+## Verify the Custom Alias
+
+Access the URL from output to verify if the custom alias works.
diff --git a/admin/dbTemplate.md b/admin/dbTemplate.md
new file mode 100644
index 000000000..b46907b35
--- /dev/null
+++ b/admin/dbTemplate.md
@@ -0,0 +1,334 @@
+{% include variables.md %}
+
+# Apply Database ARM Template to {{ site.data.var.wlsFullBrandName }}
+
+This page documents how to configure an existing deployment of {{ site.data.var.wlsFullBrandName }} with an existing Azure database using Azure CLI.
+
+## Prerequisites
+
+### Environment for Setup
+
+* [Azure CLI](https://docs.microsoft.com/en-us/cli/azure), use `az --version` to test if `az` works.
+
+### WebLogic Server Instance
+
+The database ARM template will be applied to an existing {{ site.data.var.wlsFullBrandName }} instance. If you don't have one, please create a new instance from the Azure portal, by following the link to the offer [in the index](index.md).
+
+### Database Instance
+
+To apply configure a database with {{ site.data.var.wlsFullBrandName }},
+you must have an existing database instance to use. This template
+supports three popular Azure databases: [Oracle](https://ms.portal.azure.com/#blade/Microsoft_Azure_Marketplace/MarketplaceOffersBlade/selectedMenuItemId/home/searchQuery/oracle%20database), [Azure SQL Server](https://docs.microsoft.com/en-us/azure/azure-sql/) and [Azure Database for PostgreSQL](https://docs.microsoft.com/en-us/azure/azure-sql/database/single-database-create-quickstart?WT.mc_id=gallery&tabs=azure-portal). If you do not have an instance, please
+create one from the Azure portal.
+
+### Apply multiple databases
+
+You can deploy different databases using the database ARM template, by changing the ARM parameters file and invoking the template again with Azure CLI.
+
+To apply multiple databases, you have to remove the previous virtual machine extension. Last ARM parameters file is cached, it will block you from configuring the new database.
+
+Use the following command to remove virtual machine extension:
+
+```bash
+# remove existing vm extension
+az vm extension delete -g ${yourResourceGroup} --vm-name ${adminVMName} --name newuserscript
+```
+
+## Prepare the Parameters JSON file
+
+You must construct a parameters JSON file containing the parameters to the database ARM template. See [Create Resource Manager parameter file](https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/parameter-files) for background information about parameter files. We must specify the information of the existing {{ site.data.var.wlsFullBrandName }} and database instance. This section shows how to obtain the values for the following required properties.
+
+| Parameter Name | Explanation |
+|----------------|-------------|
+| `_artifactsLocation`| See below for details. |
+| `adminVMName`| At deployment time, if this value was changed from its default value, the value used at deployment time must be used. Otherwise, this parameter should be omitted. |
+| `databaseType`| Must be one of `postgresql`, `oracle` or `sqlserver` |
+| `dbPassword`| See below for details. |
+| `dbUser` | See below for details. |
+| `dsConnectionURL`| See below for details. |
+| `jdbcDataSourceName`| Must be the JNDI name for the JDBC DataSource. |
+| `location` | Must be the same region into which the server was initially deployed. |
+| `wlsPassword` | Must be the same value provided at deployment time. |
+| `wlsUserName` | Must be the same value provided at deployment time. |
+
+### `_artifactsLocation`
+
+This value must be the following.
+
+```bash
+{{ armTemplateBasePath }}
+```
+
+### Obtain the JDBC Connection String, Database User, and Database Password
+
+The parameter `dsConnectionURL` stands for JDBC connection string. The connection string is database specific.
+
+#### Oracle Database:
+
+The following is the format of the JDBC connection string for Oracle Database:
+
+```bash
+jdbc:oracle:thin:@HOSTNAME:1521/DATABASENAME
+```
+
+For example:
+
+```bash
+jdbc:oracle:thin:@benqoiz.southeastasia.cloudapp.azure.com:1521/pdb1
+```
+
+#### Azure Database for PostgreSQL:
+
+Deploy an Azure Database PostgreSQL as described in [Create an Azure Database for PostgreSQL server in the Azure portal](https://docs.microsoft.com/en-us/azure/postgresql/quickstart-create-server-database-portal).
+
+1. Access the [Azure portal](https://portal.azure.com), and go to the service instance.
+
+2. Click **Connection Strings** under **Settings**.
+
+3. Locate the **JDBC** section and click the copy icon on the right to copy the JDBC connection string to the clipboard. The JDBC connection string will be similar to the following:
+
+```bash
+jdbc:postgresql://20191015cbfgterfdy.postgres.database.azure.com:5432/{your_database}?user=jroybtvp@20191015cbfgterfdy&password={your_password}&sslmode=require
+```
+
+When passing this value to the ARM template, remove the database user and password values from the connection string, and let them be the parameters `dbUser` and `dbPassword`. In the above JDBC connection string sample, the value for `dsConnectionURL` argument after removing the database user and password, will be:
+
+```bash
+jdbc:postgresql://20191015cbfgterfdy.postgres.database.azure.com:5432/{your_database}?sslmode=require
+```
+
+Finally, replace `{your_database}` with the name of your database, typically `postgres`.
+
+#### Azure SQL Server
+
+Deploy Azure SQL Server as described in [Create a single database in Azure SQL Database using the Azure portal, PowerShell, and Azure CLI](https://docs.microsoft.com/en-us/azure/sql-database/sql-database-single-database-get-started?tabs=azure-portal).
+
+1. Access the [Azure portal](https://portal.azure.com) and go to the service instance.
+
+2. Click **Connection Strings** under **Settings**.
+
+3. Locate the **JDBC** section and click the copy icon on the right to copy the JDBC connection string to the clipboard. The JDBC connection string will be similar to the following:
+
+```bash
+jdbc:sqlserver://rwo102804.database.windows.net:1433;database=rwo102804;user=jroybtvp@rwo102804;password={your_password_here};encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;
+```
+
+When passing this value to the ARM template, remove the database user and password values, let them be the parameters `dbUser` and `dbPassword`. In the above JDBC connection string sample, the value for `dsConnectionURL` argument after removing the database user and password, will be:
+
+```bash
+jdbc:sqlserver://rwo102804.database.windows.net:1433;database={your_database};encrypt=true;tr
+```
+
+Finally, replace `{your_database}` with the name of your database.
+
+#### Example Parameters JSON
+
+Here is a fully filled out parameters file. Note that we did not include `adminVMName`.
+
+{{ site.data.var.passwordInFileNote }}
+
+```json
+{
+ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "_artifactsLocation":{
+ "value": "{{ armTemplateBasePath }}"
+ },
+ "location": {
+ "value": "eastus"
+ },
+ "databaseType": {
+ "value": "postgresql"
+ },
+ "dsConnectionURL": {
+ "value": "jdbc:postgresql://ejb060801p.postgres.database.azure.com:5432/postgres?sslmode=require"
+ },
+ "dbPassword": {
+ "value": "Secret123!"
+ },
+ "dbUser": {
+ "value": "postgres@ejb060801p"
+ },
+ "jdbcDataSourceName": {
+ "value": "jdbc/ejb060801p"
+ },
+ "wlsPassword": {
+ "value": "welcome1"
+ },
+ "wlsUserName": {
+ "value": "weblogic"
+ }
+ }
+}
+```
+
+## Invoke the ARM template
+
+Assume your parameters file is available in the current directory and is named `parameters.json`. This section shows the commands to configure your {{ site.data.var.wlsFullBrandName }} deployment with the specified database. Replace `yourResourceGroup` with the Azure resource group in which the {{ site.data.var.wlsFullBrandName }} is deployed.
+
+### First, validate your parameters file
+
+The `az group deployment validate` command is very useful to validate your parameters file is syntactically correct.
+
+```bash
+az group deployment validate --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateBasePath }}nestedtemplates/dbTemplate.json
+```
+
+If the command returns with an exit status other than `0`, inspect the output and resolve the problem before proceeding. You can check the exit status by executing the commad `echo $?` immediately after the `az` command.
+
+### Next, execute the template
+
+After successfully validating the template invocation, change `validate` to `create` to invoke the template.
+
+```bash
+az group deployment create --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateBasePath }}nestedtemplates/dbTemplate.json
+```
+
+As with the validate command, if the command returns with an exit status other than `0`, inspect the output and resolve the problem.
+
+This is an example output of successful deployment. Look for `"provisioningState": "Succeeded"` in your output.
+
+```json
+{
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-admin-0602/providers/Microsoft.Resources/deployments/db",
+ "location": null,
+ "name": "db",
+ "properties": {
+ "correlationId": "6fc805b9-1c47-4b32-b9b0-59745a21e559",
+ "debugSetting": null,
+ "dependencies": [
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-admin-0602/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "oraclevm-admin-0602",
+ "resourceName": "adminVM/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-admin-0602/providers/Microsoft.Resources/deployments/3b35b279-0e94-5264-85f5-0d9d662f8a38",
+ "resourceGroup": "oraclevm-admin-0602",
+ "resourceName": "3b35b279-0e94-5264-85f5-0d9d662f8a38",
+ "resourceType": "Microsoft.Resources/deployments"
+ }
+ ],
+ "duration": "PT17.4377546S",
+ "mode": "Incremental",
+ "onErrorDeployment": null,
+ "outputResources": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-admin-0602/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "oraclevm-admin-0602"
+ }
+ ],
+ "outputs": {
+ "artifactsLocationPassedIn": {
+ "type": "String",
+ "value": "{{ armTemplateBasePath }}"
+ }
+ },
+ "parameters": {
+ "_artifactsLocation": {
+ "type": "String",
+ "value": "{{ armTemplateBasePath }}"
+ },
+ "_artifactsLocationDbTemplate": {
+ "type": "String",
+ "value": "{{ armTemplateBasePath }}"
+ }
+ "adminVMName": {
+ "type": "String",
+ "value": "adminVM"
+ },
+ "databaseType": {
+ "type": "String",
+ "value": "postgresql"
+ },
+ "dbPassword": {
+ "type": "SecureString"
+ },
+ "dbUser": {
+ "type": "String",
+ "value": "weblogic@oraclevm"
+ },
+ "dsConnectionURL": {
+ "type": "String",
+ "value": "jdbc:postgresql://oraclevm.postgres.database.azure.com:5432/postgres"
+ },
+ "jdbcDataSourceName": {
+ "type": "String",
+ "value": "jdbc/WebLogicCafeDB"
+ },
+ "location": {
+ "type": "String",
+ "value": "eastus"
+ },
+ "wlsPassword": {
+ "type": "SecureString"
+ },
+ "wlsUserName": {
+ "type": "String",
+ "value": "weblogic"
+ }
+ },
+ "parametersLink": null,
+ "providers": [
+ {
+ "id": null,
+ "namespace": "Microsoft.Resources",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ null
+ ],
+ "properties": null,
+ "resourceType": "deployments"
+ }
+ ]
+ },
+ {
+ "id": null,
+ "namespace": "Microsoft.Compute",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "virtualMachines/extensions"
+ }
+ ]
+ }
+ ],
+ "provisioningState": "Succeeded",
+ "template": null,
+ "templateHash": "6381424766408193665",
+ "templateLink": null,
+ "timestamp": "2020-06-02T06:05:03.141828+00:00"
+ },
+ "resourceGroup": "oraclevm-admin-0602",
+ "type": "Microsoft.Resources/deployments"
+}
+```
+
+## Verify Database Connection
+
+Follow the steps to check if the database has successfully been connected.
+
+* Visit the {{ site.data.var.wlsFullBrandName }} Admin console.
+* In the left navigation pane, expand the **Services** tree node and the **DataSources** child node.
+* Select the row for the JDBC database name, for example `jdbc/WebLogicDB`.
+* Select the **Monitoring** tab and the **Testing** sub-tab.
+* Select `admin` and select **Test Data Source**
+* If the database is enabled, you will see a message similar to "Test of jdbc/WebLogicDB on server admin was successful."
diff --git a/admin/elkNestedTemplate.md b/admin/elkNestedTemplate.md
new file mode 100644
index 000000000..93759dc21
--- /dev/null
+++ b/admin/elkNestedTemplate.md
@@ -0,0 +1,287 @@
+{% include variables.md %}
+
+# Land {{ site.data.var.wlsFullBrandName }} logs to Elasticsearch and Kibana
+
+This page documents how to configure an existing deployment of {{ site.data.var.wlsFullBrandName }} to land logs to Elasticsearch and Kibana using Azure CLI.
+
+## Prerequisites
+
+### Environment for Setup
+
+* [Azure CLI](https://docs.microsoft.com/en-us/cli/azure), use `az --version` to test if `az` works.
+
+### WebLogic Server Instance
+
+The ELK ARM template will be applied to an existing {{ site.data.var.wlsFullBrandName }} instance. If you don't have one, please create a new instance from the Azure portal, by following the link to the offer [in the index](index.md).
+
+### Virtual machine size requirement
+Ensure the virtual machines that have been deployed have at least **2.5GB** of memory. The default virtual machine size for WLS does not have enough memory. Use at least `Standard_A2_v2`.
+
+### Elasticsearch instance
+
+Refer to [Create an an Elastic on Azure instance](https://aka.ms/arm-oraclelinux-wls-elk#create-an-an-elastic-on-azure-instance)
+
+## Prepare the Parameters JSON file
+
+You must construct a parameters JSON file containing the parameters to the ELK ARM template. See [Create Resource Manager parameter file](https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/parameter-files) for background information about parameter files.
+
+We must specify the information of the existing {{ site.data.var.wlsFullBrandName }} and Elasticsearch instance. This section shows how to obtain the values for the following required properties.
+
+| Parameter Name | Explanation |
+|----------------|-------------|
+| `_artifactsLocation`| See below for details. |
+| `adminVMName`| Virtual machine name of which hosts the {{ site.data.var.wlsFullBrandName }} admin server. |
+| `elasticsearchEndpoint` | The Elasticsearch endpoint. |
+| `elasticsearchPassword` | Password of the Elasticsearch account. Used to distibute message with REST API to Elasticsearch instance. |
+| `elasticsearchUserName` | User name of the Elasticsearch account. |
+| `location` | Must be the same region into which the server was initially deployed. |
+| `logsToIntegrate` | Specify the WebLogic logs to export to Elasticsearch, you must select at least one log. |
+| `wlsDomainName` | Must be the same value provided at initial deployment time. |
+| `wlsPassword` | Must be the same value provided at initial deployment time. |
+| `wlsUserName` | Must be the same value provided at initial deployment time. |
+
+### `_artifactsLocation`
+
+This value must be the following.
+
+```bash
+{{ armTemplateBasePath }}
+```
+
+#### Example Parameters JSON
+
+Here is a fully filled out parameters file. We will leave values of `adminUsername`, `authenticationType`, `dnsLabelPrefix`, and `usePreviewImage` as default value.
+
+{{ site.data.var.passwordInFileNote }}
+
+```json
+{
+ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "_artifactsLocation": {
+ "value": "{{ armTemplateBasePath }}"
+ },
+ "adminVMName": {
+ "value": "adminVM"
+ },
+ "elasticsearchEndpoint": {
+ "value": "https://example.eastus2.azure.elastic-cloud.com:9243"
+ },
+ "elasticsearchPassword": {
+ "value": "wlkpsw"
+ },
+ "elasticsearchUserName": {
+ "value": "elastic"
+ },
+ "location": {
+ "value": "eastus"
+ },
+ "wlsDomainName": {
+ "value": "adminDomain"
+ },
+ "wlsPassword": {
+ "value": "welcome1"
+ },
+ "wlsUserName": {
+ "value": "weblogic"
+ }
+ }
+}
+```
+
+## Invoke the ARM template
+
+Assume your parameters file is available in the current directory and is named `parameters.json`. This section shows the commands to configure your {{ site.data.var.wlsFullBrandName }} deployment to connect to Elasticsearch and Kinaba intance. Replace `yourResourceGroup` with the Azure resource group in which the {{ site.data.var.wlsFullBrandName }} is deployed.
+
+### First, validate your parameters file
+
+The `az group deployment validate` command is very useful to validate your parameters file is syntactically correct.
+
+```bash
+az deployment group validate --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateBasePath }}nestedtemplates/elkNestedTemplate.json
+```
+
+If the command returns with an exit status other than `0`, inspect the output and resolve the problem before proceeding. You can check the exit status by executing the commad `echo $?` immediately after the `az` command.
+
+### Next, execute the template
+
+After successfully validating the template invocation, change `validate` to `create` to invoke the template.
+
+```bash
+az deployment group create --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateBasePath }}nestedtemplates/elkNestedTemplate.json
+```
+
+As with the validate command, if the command returns with an exit status other than `0`, inspect the output and resolve the problem.
+
+This is an example output of successful deployment. Look for `"provisioningState": "Succeeded"` in your output.
+
+```json
+{
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-admin-elk/providers/Microsoft.Resources/deployments/elkNestedTemplate",
+ "location": null,
+ "name": "elkNestedTemplate",
+ "properties": {
+ "correlationId": "61a46b43-27d0-4478-baba-c288059892d5",
+ "debugSetting": null,
+ "dependencies": [
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-admin-elk/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "haiche-admin-elk",
+ "resourceName": "adminVM/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-admin-elk/providers/Microsoft.Resources/deployments/pid-e4165284-b017-5df9-9b91-3f11dd8a72e5",
+ "resourceGroup": "haiche-admin-elk",
+ "resourceName": "pid-e4165284-b017-5df9-9b91-3f11dd8a72e5",
+ "resourceType": "Microsoft.Resources/deployments"
+ },
+ ],
+ "duration": "PT8M54.4785762S",
+ "mode": "Incremental",
+ "onErrorDeployment": null,
+ "outputResources": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-admin-elk/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "haiche-admin-elk"
+ }
+ ],
+ "outputs": {
+ "artifactsLocationPassedIn": {
+ "type": "String",
+ "value": "{{ armTemplateBasePath }}"
+ },
+ "logIndex": {
+ "type": "String",
+ "value": "azure-weblogic-admin-b4e465d5-6ffc-49cf-b1d9-b4dbf6455d0a"
+ }
+ },
+ "parameters": {
+ "_artifactsLocation": {
+ "type": "String",
+ "value": "{{ armTemplateBasePath }}"
+ },
+ "_artifactsLocationELKTemplate": {
+ "type": "String",
+ "value": "{{ armTemplateBasePath }}"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "SecureString"
+ },
+ "adminVMName": {
+ "type": "String",
+ "value": "adminVM"
+ },
+ "elasticsearchEndpoint": {
+ "type": "String",
+ "value": "https://example.eastus2.azure.elastic-cloud.com:9243"
+ },
+ "elasticsearchPassword": {
+ "type": "SecureString"
+ },
+ "elasticsearchUserName": {
+ "type": "String",
+ "value": "elastic"
+ },
+ "guidValue": {
+ "type": "String",
+ "value": "b4e465d5-6ffc-49cf-b1d9-b4dbf6455d0a"
+ },
+ "location": {
+ "type": "String",
+ "value": "eastus"
+ },
+ "logsToIntegrate": {
+ "type": "Array",
+ "value": [
+ "HTTPAccessLog",
+ "ServerLog",
+ "DomainLog",
+ "DataSourceLog",
+ "StandardErrorAndOutput",
+ "NodeManagerLog"
+ ]
+ },
+ "wlsDomainName": {
+ "type": "String",
+ "value": "wlsd"
+ },
+ "wlsPassword": {
+ "type": "SecureString"
+ },
+ "wlsUserName": {
+ "type": "String",
+ "value": "weblogic"
+ }
+ },
+ "parametersLink": null,
+ "providers": [
+ {
+ "id": null,
+ "namespace": "Microsoft.Resources",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ null
+ ],
+ "properties": null,
+ "resourceType": "deployments"
+ }
+ ]
+ },
+ {
+ "id": null,
+ "namespace": "Microsoft.Compute",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "virtualMachines/extensions"
+ }
+ ]
+ }
+ ],
+ "provisioningState": "Succeeded",
+ "template": null,
+ "templateHash": "10060935779116645392",
+ "templateLink": null,
+ "timestamp": "2020-11-11T07:29:42.336797+00:00"
+ },
+ "resourceGroup": "haiche-admin-elk",
+ "type": "Microsoft.Resources/deployments"
+}
+```
+
+## Verify ELK connection
+
+Follow the steps to check if WebLogic Server logs are exported to Elasticsearch.
+
+* Go to Azure portal
+* Copy log index from your resource group -> deployments -> elkNestedTemplate -> output -> logIndex .
+* Go to Elasticsearch cloud and launch Kibana.
+* Create index
+ * Go to Kibana -> Management -> Kibana -> Index Patterns
+ * Click `Create index Patterns`
+ * Input the log index you copy from output in Index pattern
+ * There should be an index you can select, otherwise, the ELK deployment failed
+ * Next step
+ * Select `@timestamp` in Time Filter and hit `Create index pattern`
+* View logs
+ * Go to Kibana -> Discover
+ * Select the index you just created
+ * You will find the WebLogic Server logs listed
diff --git a/admin/index.md b/admin/index.md
new file mode 100644
index 000000000..79686ab2d
--- /dev/null
+++ b/admin/index.md
@@ -0,0 +1,13 @@
+# Single Node {{ site.data.var.wlsFullBrandName }} with Admin Server
+
+{% include sub-template-01.md %}
+
+Templates available for working with [{{ site.data.var.wlsFullBrandName }} with Admin Server](https://portal.azure.com/#create/oracle.20191009-arm-oraclelinux-wls-admin20191009-arm-oraclelinux-wls-admin):
+
+* [Configure a database connection](dbTemplate.md)
+
+* [Configure Azure Active Directory](aadNestedTemplate.md)
+
+* [Configure custom DNS alias](customDNSTemplate.md)
+
+* [Configure Elasticsearch and Kibana](elkNestedTemplate.md)
diff --git a/arm-oraclelinux-wls/src/main/scripts/create_datasource.py b/arm-oraclelinux-wls/src/main/scripts/create_datasource.py
new file mode 100644
index 000000000..5ddbd937b
--- /dev/null
+++ b/arm-oraclelinux-wls/src/main/scripts/create_datasource.py
@@ -0,0 +1,33 @@
+connect('weblogic','gumby1234','t3://ejb1024010-ejb102401rg-ejb102401.eastus.cloudapp.azure.com:7001')
+edit("Edwards-MacBook-Pro.local")
+startEdit()
+cd('/')
+try:
+ cmo.createJDBCSystemResource('postgreSQL-0')
+ cd('/JDBCSystemResources/postgreSQL-0/JDBCResource/postgreSQL-0')
+ cmo.setName('postgreSQL-0')
+ cd('/JDBCSystemResources/postgreSQL-0/JDBCResource/postgreSQL-0/JDBCDataSourceParams/postgreSQL-0')
+ set('JNDINames',jarray.array([String('jndi/postgreSQL-0')], String))
+ cd('/JDBCSystemResources/postgreSQL-0/JDBCResource/postgreSQL-0')
+ cmo.setDatasourceType('GENERIC')
+ cd('/JDBCSystemResources/postgreSQL-0/JDBCResource/postgreSQL-0/JDBCDriverParams/postgreSQL-0')
+ cmo.setUrl('jdbc:postgresql://20191015postgresql.postgres.database.azure.com:5432/wls20191015?sslmode=require')
+ cmo.setDriverName('org.postgresql.Driver')
+ cmo.setPassword('wlsEng@2019')
+ cd('/JDBCSystemResources/postgreSQL-0/JDBCResource/postgreSQL-0/JDBCConnectionPoolParams/postgreSQL-0')
+ cmo.setTestTableName('SQL ISVALID\r\n\r\n\r\n\r\n')
+ cd('/JDBCSystemResources/postgreSQL-0/JDBCResource/postgreSQL-0/JDBCDriverParams/postgreSQL-0/Properties/postgreSQL-0')
+ cmo.createProperty('user')
+ cd('/JDBCSystemResources/postgreSQL-0/JDBCResource/postgreSQL-0/JDBCDriverParams/postgreSQL-0/Properties/postgreSQL-0/Properties/user')
+ cmo.setValue('weblogic@20191015postgresql')
+ cd('/JDBCSystemResources/postgreSQL-0/JDBCResource/postgreSQL-0/JDBCDataSourceParams/postgreSQL-0')
+ cmo.setGlobalTransactionsProtocol('EmulateTwoPhaseCommit')
+ cd('/JDBCSystemResources/postgreSQL-0')
+ set('Targets',jarray.array([ObjectName('com.bea:Name=cluster1,Type=Cluster')], ObjectName))
+ save()
+ resolve()
+ activate()
+except Exception, e:
+ print "Already datasource with name postgreSQL-0 exists"
+destroyEditSession("Edwards-MacBook-Pro.local",force = true)
+disconnect()
diff --git a/assets/css/style.scss b/assets/css/style.scss
new file mode 100644
index 000000000..480ee1d3e
--- /dev/null
+++ b/assets/css/style.scss
@@ -0,0 +1,5 @@
+---
+---
+
+@import "{{ site.theme }}";
+
diff --git a/cluster/aadNestedTemplate.md b/cluster/aadNestedTemplate.md
new file mode 100644
index 000000000..0e72fe78c
--- /dev/null
+++ b/cluster/aadNestedTemplate.md
@@ -0,0 +1,310 @@
+{% include variables.md %}
+
+# Apply Azure Active Directory ARM Template to {{ site.data.var.wlsFullBrandName }}
+
+This page documents how to configure an existing deployment of {{ site.data.var.wlsFullBrandName }} with an existing Azure Active Directory Domain Service (AAD DS) using Azure CLI.
+
+## Prerequisites
+
+### Environment for Setup
+
+* [Azure CLI](https://docs.microsoft.com/en-us/cli/azure), use `az --version` to test if `az` works.
+
+### WebLogic Server Instance
+
+The AAD ARM template will be applied to an existing {{ site.data.var.wlsFullBrandName }} instance. If you don't have one, please create a new instance from the Azure portal, by following the link to the offer [in the index](index.md).
+
+### Azure Active Directory LDAP Instance
+
+To apply AAD to {{ site.data.var.wlsFullBrandName }}, you must have an existing Azure Active Directory LDAP instance to use. If you don't have AAD LADP instance, please follow the steps in the tutorial [Configure secure LDAP for an Azure Active Directory Domain Services managed domain](https://docs.microsoft.com/en-us/azure/active-directory-domain-services/tutorial-configure-ldaps).
+
+## Prepare the Parameters JSON file
+
+You must construct a parameters JSON file containing the parameters to the AAD ARM template. See [Create Resource Manager parameter file](https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/parameter-files) for background information about parameter files. We must specify the information of the existing {{ site.data.var.wlsFullBrandName }} and AAD instance. This section shows how to obtain the values for the following required properties.
+
+| Parameter Name | Explanation |
+|----------------|-------------|
+| `_artifactsLocation`| See below for details. |
+| `aadsPortNumber` | (optional) The LDAP port number, defaults to 636. |
+| `aadsPublicIP` | The IP address of the LDAP server |
+| `aadsServerHost` | The hostname of the Active Directory Domain Services server. |
+| `adminVMName`| At deployment time, if this value was changed from its default value, the value used at deployment time must be used. Otherwise, this parameter should be omitted. |
+| `location` | Must be the same region into which the server was initially deployed. |
+| `managedServerPrefix` | Must be the same managed server prefix with that in initial deployed. |
+| `numberOfInstances` | Numbers of Virtual Machines that have been deployed, including Virtual Machine that hosts Administration Server. |
+| `wlsDomainName` | The name of the {{ site.data.var.wlsFullBrandName }} domain. |
+| `wlsLDAPGroupBaseDN` | The base distinguished name (DN) of the tree in the LDAP directory that contains groups. |
+| `wlsLDAPPrincipalPassword` | The credential (usually a password) used to connect to the LDAP server. |
+| `wlsLDAPPrincipal` | The Distinguished Name (DN) of the LDAP user that {{ site.data.var.wlsFullBrandName }} should use to connect to the LDAP server. |
+| `wlsLDAPProviderName` | (optional) The value used for creating authentication provider name of WebLogic Server. |
+| `wlsLDAPSSLCertificate` | Client certificate that will be imported to trust store of SSL. |
+| `wlsLDAPSSLCertificate` | See below for details. |
+| `wlsLDAPUserBaseDN` | The base distinguished name (DN) of the tree in the LDAP directory that contains users. |
+| `wlsPassword` | Must be the same value provided at deployment time. |
+| `wlsUserName` | Must be the same value provided at deployment time. |
+
+### `_artifactsLocation`
+
+This value must be the following.
+
+```bash
+{{ armTemplateBasePath }}
+```
+
+### `wlsLDAPSSLCertificate`
+
+Use base64 to encode your existing SSL certificate.
+
+```bash
+base64 your-certificate.cer -w 0 >temp.txt
+```
+
+Use the content as this file as the value of the `wlsLDAPSSLCertificate` parameter.
+
+### `numberOfInstances`
+
+The number of existing nodes, includeing Administration Server node. It should equal to existing Virtual Machine number.
+
+#### Example Parameters JSON
+
+Here is a fully filled out parameters file. Note that we did not include values for parameters that have a default value. Pay attention to the value of `numberOfInstances`.
+
+{{ site.data.var.passwordInFileNote }}
+
+```json
+{
+ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "_artifactsLocation": {
+ "value": "{{ armTemplateBasePath }}"
+ },
+ "aadsPublicIP": {
+ "value": "1.2.3.4"
+ },
+ "aadsServerHost": {
+ "value": "ladps.fabrikam.com"
+ },
+ "location": {
+ "value": "eastus"
+ },
+ "wlsDomainName": {
+ "value": "wlsd"
+ },
+ "wlsLDAPGroupBaseDN": {
+ "value": "OU=AADDC Users,DC=fabrikam,DC=com"
+ },
+ "wlsLDAPPrincipal": {
+ "value": "CN=WLSTest,OU=AADDC Users,DC=fabrikam,DC=com"
+ },
+ "wlsLDAPPrincipalPassword": {
+ "value": "Secret123!"
+ },
+ "wlsLDAPSSLCertificate": {
+ "value": "MIIKQQIBAz....EkAgIIAA=="
+ },
+ "wlsLDAPUserBaseDN": {
+ "value": "OU=AADDC Users,DC=fabrikam,DC=com"
+ },
+ "wlsPassword": {
+ "value": "welcome1"
+ },
+ "wlsUserName": {
+ "value": "weblogic"
+ }
+ }
+}
+```
+
+## Invoke the ARM template
+
+Assume your parameters file is available in the current directory and is named `parameters.json`. This section shows the commands to configure your {{ site.data.var.wlsFullBrandName }} deployment with the specified AAD. Replace `yourResourceGroup` with the Azure resource group in which the {{ site.data.var.wlsFullBrandName }} is deployed.
+
+### First, validate your parameters file
+
+The `az group deployment validate` command is very useful to validate your parameters file is syntactically correct.
+
+```bash
+az group deployment validate --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateBasePath }}nestedtemplates/aadNestedTemplate.json
+```
+
+If the command returns with an exit status other than `0`, inspect the output and resolve the problem before proceeding. You can check the exit status by executing the commad `echo $?` immediately after the `az` command.
+
+### Next, execute the template
+
+After successfully validating the template invocation, change `validate` to `create` to invoke the template.
+
+```bash
+az group deployment create --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateBasePath }}nestedtemplates/aadNestedTemplate.json
+```
+
+As with the validate command, if the command returns with an exit status other than `0`, inspect the output and resolve the problem.
+
+This is an example output of successful deployment. Look for `"provisioningState": "Succeeded"` in your output.
+
+```json
+{
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-admin-06082/providers/Microsoft.Resources/deployments/cli",
+ "location": null,
+ "name": "cli",
+ "properties": {
+ "correlationId": "6d98e1c8-0778-4fa5-a30a-8f10bbbb6818",
+ "debugSetting": null,
+ "dependencies": [
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-admin-06082/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "oraclevm-admin-06082",
+ "resourceName": "adminVM/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-admin-06082/providers/Microsoft.Resources/deployments/pid-8295df19-fe6b-5745-ad24-51ef66522b24",
+ "resourceGroup": "oraclevm-admin-06082",
+ "resourceName": "pid-8295df19-fe6b-5745-ad24-51ef66522b24",
+ "resourceType": "Microsoft.Resources/deployments"
+ }
+ ],
+ "duration": "PT2M59.6052694S",
+ "mode": "Incremental",
+ "onErrorDeployment": null,
+ "outputResources": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-admin-06082/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "oraclevm-admin-06082"
+ }
+ ],
+ "outputs": {
+ "artifactsLocationPassedIn": {
+ "type": "String",
+ "value": "https://raw.githubusercontent.com/galiacheng/arm-oraclelinux-wls-admin/deploy/src/main/arm/"
+ }
+ },
+ "parameters": {
+ "_artifactsLocation": {
+ "type": "String",
+ "value": "https://raw.githubusercontent.com/galiacheng/arm-oraclelinux-wls-admin/deploy/src/main/arm/"
+ },
+ "_artifactsLocationAADTemplate": {
+ "type": "String",
+ "value": "https://raw.githubusercontent.com/galiacheng/arm-oraclelinux-wls-admin/deploy/src/main/arm/"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "SecureString"
+ },
+ "aadsPortNumber": {
+ "type": "String",
+ "value": "636"
+ },
+ "aadsPublicIP": {
+ "type": "String",
+ "value": "40.76.11.111"
+ },
+ "aadsServerHost": {
+ "type": "String",
+ "value": "ladps.wls-security.com"
+ },
+ "adminVMName": {
+ "type": "String",
+ "value": "adminVM"
+ },
+ "location": {
+ "type": "String",
+ "value": "eastus"
+ },
+ "wlsDomainName": {
+ "type": "String",
+ "value": "adminDomain"
+ },
+ "wlsLDAPGroupBaseDN": {
+ "type": "String",
+ "value": "OU=AADDC Users,DC=wls-security,DC=com"
+ },
+ "wlsLDAPPrincipal": {
+ "type": "String",
+ "value": "CN=WLSTest,OU=AADDC Users,DC=wls-security,DC=com"
+ },
+ "wlsLDAPPrincipalPassword": {
+ "type": "SecureString"
+ },
+ "wlsLDAPProviderName": {
+ "type": "String",
+ "value": "AzureActiveDirectoryProvider"
+ },
+ "wlsLDAPSSLCertificate": {
+ "type": "String",
+ "value": "LS0tLS1...LQ0K"
+ },
+ "wlsLDAPUserBaseDN": {
+ "type": "String",
+ "value": "OU=AADDC Users,DC=wls-security,DC=com"
+ },
+ "wlsPassword": {
+ "type": "SecureString"
+ },
+ "wlsUserName": {
+ "type": "String",
+ "value": "weblogic"
+ }
+ },
+ "parametersLink": null,
+ "providers": [
+ {
+ "id": null,
+ "namespace": "Microsoft.Resources",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ null
+ ],
+ "properties": null,
+ "resourceType": "deployments"
+ }
+ ]
+ },
+ {
+ "id": null,
+ "namespace": "Microsoft.Compute",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "virtualMachines/extensions"
+ }
+ ]
+ }
+ ],
+ "provisioningState": "Succeeded",
+ "template": null,
+ "templateHash": "2818584196763146470",
+ "templateLink": null,
+ "timestamp": "2020-06-09T07:07:03.444046+00:00"
+ },
+ "resourceGroup": "oraclevm-admin-06082",
+ "type": "Microsoft.Resources/deployments"
+}
+
+```
+
+## Verify AAD Integration
+
+Follow the steps to check if AAD is enabled.
+
+* Visit the {{ site.data.var.wlsFullBrandName }} Admin console.
+* In the left navigator, expand the tree to select **Security Realms** -> **myrealm** -> **Providers**.
+* If the integration was successful, you will find the AAD provider for example `AzureActiveDirectoryProvider`.
+* In the left navigator, expand the tree to select **Security Realms** -> **myrealm** -> **Users and Groups**.
+* If the integration was successful, you will find users from the AAD provider.
diff --git a/cluster/addnode-coherence.md b/cluster/addnode-coherence.md
new file mode 100644
index 000000000..2c601d597
--- /dev/null
+++ b/cluster/addnode-coherence.md
@@ -0,0 +1,572 @@
+{% include variables.md %}
+
+# Add cache managed server to {{ site.data.var.wlsFullBrandName }} Coherence cluster
+
+This page documents how to configure an existing deployment of {{ site.data.var.wlsFullBrandName }} to add new managed cache server using Azure CLI.
+
+## Prerequisites
+
+### Environment for Setup
+
+* [Azure CLI](https://docs.microsoft.com/en-us/cli/azure), use `az --version` to test if `az` works.
+
+### WebLogic Server Instance
+
+The `addnode-coherence.json` template will be applied to an existing {{ site.data.var.wlsFullBrandName }} **Coherence** cluster. If you don't have one, please create a new instance from the Azure portal, by following the link to the offer [in the index](index.md).
+
+### Coherence cluster
+
+You can configure Coherence cluster from Azure portal or running Coherence sub template.
+
+* Configure Coherence cluster from Azure portal
+
+ Select `yes` in Coherence section and input required settings, the Azure WebLogic IaaS offer will configure a Coherence cluster automatically.
+
+* Configure Coherence cluster via Coherence sub template
+
+ Refer to [Configure Coherence cluster](coherenceTemplate.html).
+
+## Prepare the Parameters JSON file
+
+You must construct a parameters JSON file containing the parameters to `addnode-coherence.json` template. See [Create Resource Manager parameter file](https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/parameter-files) for background information about parameter files. You must specify the information of the existing {{ site.data.var.wlsFullBrandName }} and nodes that to be added. This section shows how to obtain the values for the following required properties.
+
+
+
+
Parameter Name
+
Explanation
+
+
+
_artifactsLocation
+
See below for details.
+
+
+
elkSettings
+
Optional. JSON object type. You can specify this parameters for Elasticsearch and Kibana(ELK) connection. If enable is true, must specify other properties. See the page WebLogic with Elastic on Azure for further information.
+
+
+
+
enable
+
If enable is true, must specify all properties of the elkSettings.
+
+
+
+
elasticsearchEndpoint
+
Endpoint of the Elasticsearch instance.
+
+
+
+
elasticsearchPassword
+
Password for Elasticsearch account.
+
+
+
+
elasticsearchUserName
+
User name for Elasticsearch account.
+
+
+
+
logIndex
+
Must be the same value output at ELK deployment time.
+
+
+
+
logsToIntegrate
+
Array with string value. Specify the expeted logs to integrate, you must input at least one log.
+
+
+
adminPasswordOrKey
+
Password of administration account for the new Virtual Machine that host new nodes.
+
+
+
adminVMName
+
Virtual machine name of which hosts the {{ site.data.var.wlsFullBrandName }} admin server, for example: adminVM.
+
+
enableCoherenceWebLocalStorage
+
Specifies whether Local Storage is enabled for the Coherence*Web cluster tier.
+
+
+
location
+
Must be the same region into which the server was initially deployed.
+
+
+
managedServerPrefix
+
Must be the same prefix with which the cluster was initially deployed.
+
+
+
numberOfExistingCacheNodes
+
Number of existing Coherence cache servers, used to name new virtual machines and new managed server.
+
+
+
numberOfNewCacheNodes
+
Number of new Coherence cahce servers, used to create Virtual Machines and Managed Server.
+
+
+
skuUrnVersion
+
Must be the same urn with which the cluster was initially deployed.
+
+
+
storageAccountName
+
The name of an existing storage account.
+
+
+
vmSizeSelectForCoherence
+
Select appropriate VM Size for Coherence cache servers.
+
+
+
wlsDomainName
+
Must be the same value provided at deployment time.
+
+
+
wlsPassword
+
Must be the same value provided at deployment time.
+
+
+
wlsUserName
+
Must be the same value provided at deployment time.
+
+
+
+### `_artifactsLocation`
+
+This value must be the following.
+
+```bash
+{{ armTemplateAddCacheNodeBasePath }}
+```
+
+### Existing cache nodes
+To differentiate functionality of managed cache servers, we use **managed application server** to represent managed servers that host Java EE application, and use **managed cache server** to represent managed servers that used for cache.
+
+You can get the existing managed cache servers with the following command:
+
+```shell
+$ resourceGroup=
+$ managedServerPrefix=
+$ numberOfExistingCacheNodes=$(az resource list -g ${resourceGroup} --resource-type Microsoft.Compute/virtualMachines --query [*].name | grep "${managedServerPrefix}StorageVM[0-9]" | sed -e 's/[^0-9]/ /g' -e 's/^ *//g' -e 's/ *$//g' | tr -s ' ' | sed 's/ /\n/g' | sort -nr | head -n1)
+$ echo ${numberOfExistingCacheNodes}
+```
+
+### Log index
+
+If you configured ELK in your cluster to export WebLogic Server logs to ELK, please input the value of Kibana log index, this template will set up ELK connection and export logs to specified index.
+
+You can get the value from Azure portal with the following steps:
+
+* Go to Azure portal.
+* Open you resource group and click **Deployments**.
+* Open the ELK deployment, and click **Output**.
+* Copy the value of `logIndex`.
+
+Alternatively, use Azure CLI command to list log index inside the resource group deployments:
+
+```shell
+$ az deployment group list -g 'yourResourceGroup' --query [*].properties.outputs.logIndex.value
+[
+ "azure-weblogic-cluster-f984df74-ab4d-4c17-a532-7f248659fb28"
+]
+```
+
+### Storage account
+
+Each Storage Account handles up to 20,000 IOPS, and 500TB of data. If you use a storage account for Standard Virtual Machines, you can store until 40 virtual disks.
+
+We have two disks for one Virtual Machine, it's suggested no more than 20 Virtual Machines share the same storage account. Number of virtual machines that hosting managed servers should be less than or equal to 20.
+
+You can get the name of storage account from Azure portal with steps:
+
+ * Go to Azure portal
+ * Go to the your resource group
+ * Find storage account resource and copy its name
+
+Alternatively, use Azure CLI command to list storage account inside a resource group:
+
+```shell
+$ az resource list -g 'yourResourceGroup' --resource-type Microsoft.Storage/storageAccounts --query [*].name
+[
+ "219846olvm"
+]
+```
+
+#### Example Parameters JSON
+
+Here is a fully filled out parameters file. We will leave values of `adminUsername`, `authenticationType`, `dnsLabelPrefix`, `usePreviewImage` and `vmSizeSelectForCoherence` as default value.
+
+{{ site.data.var.passwordInFileNote }}
+
+```json
+{
+ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "_artifactsLocation": {
+ "value": "{{ armTemplateAddCacheNodeBasePath }}"
+ },
+ "adminPasswordOrKey": {
+ "value": "jyfRat@nht2019"
+ },
+ "adminVMName": {
+ "value": "adminVM"
+ },
+ "elkSettings": {
+ "value": {
+ "enable": true,
+ "elasticsearchEndpoint":"https://example.eastus2.azure.elastic-cloud.com:9243",
+ "elasticsearchPassword": "Secret123!",
+ "elasticsearchUserName":"elastic",
+ "logIndex": "azure-weblogic-dynamic-cluster-11122020",
+ "logsToIntegrate": ["HTTPAccessLog", "ServerLog", "DomainLog", "DataSourceLog", "StandardErrorAndOutput", "NodeManagerLog"]
+ }
+ },
+ "enableCoherenceWebLocalStorage": {
+ "value": true
+ },
+ "location": {
+ "value": "eastus"
+ },
+ "managedServerPrefix": {
+ "value": "msp"
+ },
+ "numberOfExistingCacheNodes": {
+ "value": 1
+ },
+ "numberOfNewCacheNodes": {
+ "value": 1
+ },
+ "skuUrnVersion": {
+ "value": "owls-122140-8u251-ol76;Oracle:weblogic-122140-jdk8u251-ol76:owls-122140-8u251-ol7;latest"
+ },
+ "storageAccountName": {
+ "value": "d40140olvm"
+ },
+ "wlsDomainName": {
+ "value": "wlsd"
+ },
+ "wlsPassword": {
+ "value": "welcome1"
+ },
+ "wlsUserName": {
+ "value": "weblogic"
+ }
+ }
+}
+```
+
+## Invoke the ARM template
+
+Assume your parameters file is available in the current directory and is named `parameters.json`. This section shows the commands to configure your {{ site.data.var.wlsFullBrandName }} deployment to add new nodes. Replace `yourResourceGroup` with the Azure resource group in which the {{ site.data.var.wlsFullBrandName }} is deployed.
+
+### First, validate your parameters file
+
+The `az deployment group validate` command is very useful to validate your parameters file is syntactically correct.
+
+```bash
+az deployment group validate --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateAddCacheNodeBasePath }}arm/mainTemplate.json
+```
+
+If the command returns with an exit status other than `0`, inspect the output and resolve the problem before proceeding. You can check the exit status by executing the commad `echo $?` immediately after the `az` command.
+
+### Next, execute the template
+
+After successfully validating the template invocation, change `validate` to `create` to invoke the template.
+
+```bash
+az deployment group create --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateAddCacheNodeBasePath }}arm/mainTemplate.json
+```
+
+As with the validate command, if the command returns with an exit status other than `0`, inspect the output and resolve the problem.
+
+This is an example output of successful deployment. Look for `"provisioningState": "Succeeded"` in your output.
+
+```bash
+{
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Resources/deployments/mainTemplate",
+ "location": null,
+ "name": "mainTemplate",
+ "properties": {
+ "correlationId": "19040fc8-2b74-4e64-9dd9-59a5a3ce401a",
+ "debugSetting": null,
+ "dependencies": [
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Compute/virtualMachines/mspStorageVM2/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "mspStorageVM2/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Resources/deployments/pid-157ea8ac-12ae-11eb-adc1-0242ac120002",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "pid-157ea8ac-12ae-11eb-adc1-0242ac120002",
+ "resourceType": "Microsoft.Resources/deployments"
+ },
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Network/publicIPAddresses/mspStorageVM2_PublicIP",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "mspStorageVM2_PublicIP",
+ "resourceType": "Microsoft.Network/publicIPAddresses"
+ }
+ ],
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Network/networkInterfaces/mspStorageVM2_NIC",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "mspStorageVM2_NIC",
+ "resourceType": "Microsoft.Network/networkInterfaces"
+ },
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Network/networkInterfaces/mspStorageVM2_NIC",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "mspStorageVM2_NIC",
+ "resourceType": "Microsoft.Network/networkInterfaces"
+ },
+ {
+ "apiVersion": "2019-06-01",
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Storage/storageAccounts/33f2e3olvm",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "33f2e3olvm",
+ "resourceType": "Microsoft.Storage/storageAccounts"
+ }
+ ],
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Compute/virtualMachines/mspStorageVM2",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "mspStorageVM2",
+ "resourceType": "Microsoft.Compute/virtualMachines"
+ },
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Compute/virtualMachines/mspStorageVM2",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "mspStorageVM2",
+ "resourceType": "Microsoft.Compute/virtualMachines"
+ },
+ {
+ "actionName": "listKeys",
+ "apiVersion": "2019-04-01",
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Storage/storageAccounts/33f2e3olvm",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "33f2e3olvm",
+ "resourceType": "Microsoft.Storage/storageAccounts"
+ }
+ ],
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Compute/virtualMachines/mspStorageVM2/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "mspStorageVM2/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "duration": "PT10M24.4018847S",
+ "mode": "Incremental",
+ "onErrorDeployment": null,
+ "outputResources": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Compute/virtualMachines/mspStorageVM2",
+ "resourceGroup": "haiche-cluster-1106"
+ },
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Compute/virtualMachines/mspStorageVM2/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-1106"
+ },
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Network/networkInterfaces/mspStorageVM2_NIC",
+ "resourceGroup": "haiche-cluster-1106"
+ },
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Network/publicIPAddresses/mspStorageVM2_PublicIP",
+ "resourceGroup": "haiche-cluster-1106"
+ }
+ ],
+ "outputs": {
+ "artifactsLocationPassedIn": {
+ "type": "String",
+ "value": "{{ armTemplateAddCacheNodeBasePath }}"
+ }
+ },
+ "parameters": {
+ "_artifactsLocation": {
+ "type": "String",
+ "value": "{{ armTemplateAddCacheNodeBasePath }}"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "SecureString"
+ },
+ "adminPasswordOrKey": {
+ "type": "SecureString"
+ },
+ "adminUsername": {
+ "type": "String",
+ "value": "weblogic"
+ },
+ "adminVMName": {
+ "type": "String",
+ "value": "adminVM"
+ },
+ "authenticationType": {
+ "type": "String",
+ "value": "password"
+ },
+ "dnsLabelPrefix": {
+ "type": "String",
+ "value": "wls"
+ },
+ "enableCoherenceWebLocalStorage": {
+ "type": "Bool",
+ "value": true
+ },
+ "guidValue": {
+ "type": "String",
+ "value": "d5dde421-44b0-48df-9d12-db02374654d3"
+ },
+ "location": {
+ "type": "String",
+ "value": "eastus"
+ },
+ "managedServerPrefix": {
+ "type": "String",
+ "value": "msp"
+ },
+ "numberOfExistingCacheNodes": {
+ "type": "Int",
+ "value": 1
+ },
+ "numberOfNewCacheNodes": {
+ "type": "Int",
+ "value": 1
+ },
+ "skuUrnVersion": {
+ "type": "String",
+ "value": "owls-122130-8u131-ol74;Oracle:weblogic-122130-jdk8u131-ol74:owls-122130-8u131-ol7;latest"
+ },
+ "storageAccountName": {
+ "type": "String",
+ "value": "33f2e3olvm"
+ },
+ "usePreviewImage": {
+ "type": "Bool",
+ "value": false
+ },
+ "vmSizeSelectForCoherence": {
+ "type": "String",
+ "value": "Standard_A1"
+ },
+ "wlsDomainName": {
+ "type": "String",
+ "value": "wlsd"
+ },
+ "wlsPassword": {
+ "type": "SecureString"
+ },
+ "wlsUserName": {
+ "type": "String",
+ "value": "weblogic"
+ }
+ },
+ "parametersLink": null,
+ "providers": [
+ {
+ "id": null,
+ "namespace": "Microsoft.Resources",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ null
+ ],
+ "properties": null,
+ "resourceType": "deployments"
+ }
+ ]
+ },
+ {
+ "id": null,
+ "namespace": "Microsoft.Network",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "publicIPAddresses"
+ },
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "networkInterfaces"
+ }
+ ]
+ },
+ {
+ "id": null,
+ "namespace": "Microsoft.Compute",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "virtualMachines"
+ },
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "virtualMachines/extensions"
+ }
+ ]
+ }
+ ],
+ "provisioningState": "Succeeded",
+ "template": null,
+ "templateHash": "16596437850900945013",
+ "templateLink": null,
+ "timestamp": "2020-11-09T06:28:40.936524+00:00"
+ },
+ "resourceGroup": "haiche-cluster-1106",
+ "type": "Microsoft.Resources/deployments"
+}
+```
+
+## Verify
+
+### Verify if new cache nodes are added to the WebLogic Server instance.
+
+* Go to the {{ site.data.var.wlsFullBrandName }} Administration Console.
+* Go to **Environment** -> **Machines**.
+
+ You should see logical machines with name parttern `^{managedServerPrefix}StorageVM[0-9]+$`, machine names with number suffix from `numberOfExistingCacheNodes` to `numberOfExistingCacheNodes + numberOfNewCacheNodes` are added.
+* Go to **Environment** -> **Servers**
+
+ You should see servers with name parttern `^{managedServerPrefix}Storage[0-9]+$`, server names with number suffix from `numberOfExistingCacheNodes` to `numberOfExistingCacheNodes + numberOfNewNodes` are added to `storage1`.
+
+### Verify if Azure resources are added
+
+* Go to [Azure Portal](https://ms.portal.azure.com/).
+* Go to resource group that the {{ site.data.var.wlsFullBrandName }} is deployed.
+
+ You should see corresponding Vitual Machines, Disks, Network Interfaces, Public IPs have been added.
diff --git a/cluster/addnode.md b/cluster/addnode.md
new file mode 100644
index 000000000..98b78da9e
--- /dev/null
+++ b/cluster/addnode.md
@@ -0,0 +1,736 @@
+{% include variables.md %}
+
+# Add nodes to {{ site.data.var.wlsFullBrandName }}
+
+This page documents how to configure an existing deployment of {{ site.data.var.wlsFullBrandName }} to add new managed application server using Azure CLI.
+
+## Prerequisites
+
+### Environment for Setup
+
+* [Azure CLI](https://docs.microsoft.com/en-us/cli/azure), use `az --version` to test if `az` works.
+
+### WebLogic Server Instance
+
+The template will be applied to an existing {{ site.data.var.wlsFullBrandName }} instance. If you don't have one, please create a new instance from the Azure portal, by following the link to the offer [in the index](index.md).
+
+### Azure Active Directory LDAP Instance
+
+Refer to [Azure Active Directory(AAD) LDAP Instance](aadNestedTemplate.html#azure-active-directory-ldap-instance).
+
+### Certificate for SSL Termination
+Refer to [Configure Azure Application Gateway#Certificate for SSL Termination](appGatewayNestedTemplate.html#certificate-for-ssl-termination).
+
+### Administering Security for Oracle WebLogic Server & Configuring KeyStores
+Refer to [Configuring Keystores](https://docs.oracle.com/en/middleware/fusion-middleware/weblogic-server/12.2.1.4/secmg/identity_trust.html).
+
+### Generate Base64 string for a given ssl certificate/keystore file
+
+Use the following command to generate a Base64 string for a given ssl certificate/keystore file, to be used as input in the parameters JSON file
+
+
+
+
+## Prepare the Parameters JSON file
+
+You must construct a parameters JSON file containing the parameters to the add-node ARM template. See [Create Resource Manager parameter file](https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/parameter-files) for background information about parameter files. You must specify the information of the existing {{ site.data.var.wlsFullBrandName }} and nodes that to be added. This section shows how to obtain the values for the following required properties.
+
+
+
+
Parameter Name
+
Explanation
+
+
+
_artifactsLocation
+
See below for details.
+
+
+
aadsSettings
+
Optional. JSON object type. You can specify this parameters for Azure Active Directory integration. If enable is true, must specify other properties. See the page WebLogic to Azure with AAD via LDAP for further information.
+
+
+
+
enable
+
If enable is true, must specify all properties of the aadSettings.
+
+
+
+
publicIP
+
The public IP address of Azure Active Directory LDAP server.
+
+
+
+
serverHost
+
The server host of Azure Active Directory LDAP server.
+
+
+
+
certificateBase64String
+
The based64 string of LADP client certificate that will be imported to trust store of WebLogic Server to enable SSL connection of AD provider.
+
+
+
adminPasswordOrKey
+
Password of administration account for the new Virtual Machine that host new nodes.
+
+
+
adminURL
+
The URL of WebLogic Administration Server, usually made up with Virtual Machine name and port, for example: adminVM:7001.
If enable is true, must specify all properties of the appGatewaySettings.
+
+
+
+
publicIPName
+
Azure resource name of application gateway public IP, default value is gwip
+
+
+
+
certificateBase64String
+
Base64 string of server certificate for application gateway.
+
+
+
+
certificatePassword
+
Password of server certificate.
+
+
+
elkSettings
+
Optional. JSON object type. You can specify this parameters for Elasticsearch and Kibana(ELK) connection. If enable is true, must specify other properties. See the page WebLogic with Elastic on Azure for further information.
+
+
+
+
enable
+
If enable is true, must specify all properties of the elkSettings.
+
+
+
+
elasticsearchEndpoint
+
Endpoint of the Elasticsearch instance.
+
+
+
+
elasticsearchPassword
+
Password for Elasticsearch account.
+
+
+
+
elasticsearchUserName
+
User name for Elasticsearch account.
+
+
+
+
logIndex
+
Must be the same value output at ELK deployment time.
+
+
+
+
logsToIntegrate
+
Array with string value. Specify the expeted logs to integrate, you must input at least one log.
+
+
+
enableCoherence
+
If true, create application managed server and add to the Coherence cluster application tier.
+
+
+
numberOfExistingNodes
+
The number of existing managed application servers, used to generate new virtual machine name.
+
+
+
numberOfNewNodes
+
The number of application managed server to add.
+
+
+
storageAccountName
+
The name of an existing storage account.
+
+
+
wlsDomainName
+
Must be the same value provided at deployment time.
+
+
+
wlsUserName
+
Must be the same value provided at deployment time.
+
+
+
wlsPassword
+
Must be the same value provided at deployment time.
If enable is true, must specify all properties of the customSSLSettings.
+ Set to false by default.
+
+
+
customIdentityKeyStoreBase64String
+
The based64 string of the custom identity keystore file that will be configured in the WebLogic Administration Server to enable SSL connection.
+
+
+
customIdentityKeyStorePassPhrase
+
The identity keystore pass phrase
+
+
+
customIdentityKeyStoreType
+
Identity Key Store Type. This can be either JKS or PKCS12
+
+
+
customTrustKeyStoreBase64String
+
The based64 string of the custom trust keystore file that will be configured in the WebLogic Administration Server to enable SSL connection.
+
+
+
customTrustKeyStorePassPhrase
+
The trust keystore pass phrase
+
+
+
customTrustKeyStoreType
+
Trust Key Store Type. This can be either JKS or PKCS12
+
+
+
privateKeyAlias
+
The private key alias
+
+
+
privateKeyPassPhrase
+
The private Key Pass phrase.
+
+
+
+### `_artifactsLocation`
+
+This value must be the following.
+
+```bash
+{{ armTemplateAddNodeBasePath }}
+```
+
+### Enable SSH Authentication to VMs
+If the cluster was deployed with SSH Authentication to VMs enabled, add this variable to your parameter file and fill in the base64 decoded public SSH key string to the `adminPasswordOrKey` field:
+```
+ "authenticationType": {
+ "value": "sshPublicKey"
+ },
+ "adminPasswordOrKey": {
+ "value": "ssh-rsa ...."
+ },
+```
+
+### Enable coherence
+If `enableCoherence` is `true`, the template will create Azure resources to host new managed servers, and configure new application nodes to Coherence cluster. If your cluster is not Coherence cluster, please do not set this parameter `true`.
+
+### Existing managed application servers
+To differentiate functionality of managed servers, we use **managed application server** to represent managed servers that host Java EE application, and use **managed cache server** to represent managed servers that used for cache.
+
+You can get the existing managed application servers with the following command:
+
+```shell
+$ resourceGroup=
+$ managedServerPrefix=
+$ numberOfExistingNodes=$(az resource list -g ${resourceGroup} --resource-type Microsoft.Compute/virtualMachines --query [*].name | grep "${managedServerPrefix}VM[0-9]" | sed -e 's/[^0-9]/ /g' -e 's/^ *//g' -e 's/ *$//g' | tr -s ' ' | sed 's/ /\n/g' | sort -nr | head -n1)
+$ echo ${numberOfExistingNodes}
+```
+
+### Log index
+
+If you configured ELK in your cluster to export WebLogic Server logs to ELK, please input the value of Kibana log index, this template will set up ELK connection and export logs to specified index.
+
+You can get the value from Azure portal with the following steps:
+
+* Go to Azure portal.
+* Open you resource group and click **Deployments**.
+* Open the ELK deployment, and click **Output**.
+* Copy the value of `logIndex`.
+
+Alternatively, use Azure CLI command to list log index inside the resource group deployments:
+
+```shell
+$ az deployment group list -g 'yourResourceGroup' --query [*].properties.outputs.logIndex.value
+[
+ "azure-weblogic-cluster-f984df74-ab4d-4c17-a532-7f248659fb28"
+]
+```
+
+### Storage account
+
+Each Storage Account handles up to 20,000 IOPS, and 500TB of data. If you use a storage account for Standard Virtual Machines, you can store until 40 virtual disks.
+
+We have two disks for one Virtual Machine, it's suggested no more than 20 Virtual Machines share the same storage account. Number of virtual machines that hosting managed servers should be less than or equal to 20.
+
+You can get the name of storage account from Azure portal with steps:
+
+ * Go to Azure portal
+ * Go to the your resource group
+ * Find storage account resource and copy its name
+
+Alternatively, use Azure CLI command to list storage account inside a resource group:
+
+```shell
+$ az resource list -g 'yourResourceGroup' --resource-type Microsoft.Storage/storageAccounts --query [*].name
+[
+ "219846olvm"
+]
+```
+
+#### Example Parameters JSON
+
+Here is a fully filled out parameters file, with Azure Active Directory enabled. We will leave values of `adminUsername`, `authenticationType`, `dnsLabelPrefix`, `managedServerPrefix`, `skuUrnVersion`, `usePreviewImage` and `vmSizeSelect` as default value.
+
+{{ site.data.var.passwordInFileNote }}
+
+```json
+{
+ "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "_artifactsLocation": {
+ "value": "{{ armTemplateAddNodeBasePath }}"
+ },
+ "aadsSettings": {
+ "value": {
+ "enable": true,
+ "publicIP":"13.68.244.90",
+ "serverHost": "ladps.wls-security.com",
+ "certificateBase64String":"LS0tLS1C...tLS0tLQ0K"
+ }
+ },
+ "adminPasswordOrKey": {
+ "value": "Secret123!"
+ },
+ "adminURL":{
+ "value": "adminVM:7001"
+ },
+ "appGatewaySettings": {
+ "value": {
+ "enable": true,
+ "publicIPName": "gwip",
+ "certificateBase64String": "MIIKQQI...gIIAA==",
+ "certificatePassword": "Secret123!"
+ }
+ },
+ "elkSettings": {
+ "value": {
+ "enable": true,
+ "elasticsearchEndpoint":"https://example.eastus2.azure.elastic-cloud.com:9243",
+ "elasticsearchPassword": "Secret123!",
+ "elasticsearchUserName":"elastic",
+ "logIndex": "azure-weblogic-dynamic-cluster-11122020",
+ "logsToIntegrate": ["HTTPAccessLog", "ServerLog", "DomainLog", "DataSourceLog", "StandardErrorAndOutput", "NodeManagerLog"]
+ }
+ },
+ "location": {
+ "value": "eastus"
+ },
+ "numberOfExistingNodes": {
+ "value": 4
+ },
+ "numberOfNewNodes": {
+ "value": 3
+ },
+ "storageAccountName": {
+ "value": "496dfdolvm"
+ },
+ "wlsDomainName": {
+ "value": "wlsd"
+ },
+ "wlsUserName": {
+ "value": "weblogic"
+ },
+ "wlsPassword": {
+ "value": "welcome1"
+ },
+ "customSSLSettings": {
+ "value": {
+ "enable": true,
+ "customIdentityKeyStoreBase64String": "/u3+7QAAAAIAAAABAAAAAQAKc2VydmV....QZL24ljJLq",
+ "customIdentityKeyStorePassPhrase": "mypassword",
+ "customIdentityKeyStoreType": "JKS",
+ "customTrustKeyStoreBase64String": "/u3+7QAAAAIAAAABAAAAAgAJdHJ1c3R....Td4bYVnONyS0PC7k=",
+ "customTrustKeyStorePassPhrase": "mypassword",
+ "customTrustKeyStoreType": "JKS",
+ "privateKeyAlias": "servercert",
+ "privateKeyPassPhrase": "mypassword"
+ }
+ }
+ }
+}
+```
+
+## Invoke the ARM template
+
+Assume your parameters file is available in the current directory and is named `parameters.json`. This section shows the commands to configure your {{ site.data.var.wlsFullBrandName }} deployment to add new nodes. Replace `yourResourceGroup` with the Azure resource group in which the {{ site.data.var.wlsFullBrandName }} is deployed.
+
+### First, validate your parameters file
+
+The `az group deployment validate` command is very useful to validate your parameters file is syntactically correct.
+
+```bash
+az group deployment validate --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateAddNodeBasePath }}arm/mainTemplate.json
+```
+
+If the command returns with an exit status other than `0`, inspect the output and resolve the problem before proceeding. You can check the exit status by executing the commad `echo $?` immediately after the `az` command.
+
+### Next, execute the template
+
+After successfully validating the template invocation, change `validate` to `create` to invoke the template.
+
+```bash
+az group deployment create --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateAddNodeBasePath }}arm/mainTemplate.json
+```
+
+As with the validate command, if the command returns with an exit status other than `0`, inspect the output and resolve the problem.
+
+This is an example output of successful deployment. Look for `"provisioningState": "Succeeded"` in your output.
+
+```bash
+{
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Resources/deployments/mainTemplate",
+ "location": null,
+ "name": "mainTemplate",
+ "properties": {
+ "correlationId": "54517529-a1c4-422f-a539-23b9a5129e80",
+ "debugSetting": null,
+ "dependencies": [
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Compute/virtualMachines/mspVM7/extensions/newuserscript",
+ "resourceGroup": "oraclevm-dcluster-0727",
+ "resourceName": "mspVM7/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Resources/deployments/pid-c7671c10-ae59-5ec5-bff3-c60db22d7ea4",
+ "resourceGroup": "oraclevm-dcluster-0727",
+ "resourceName": "pid-c7671c10-ae59-5ec5-bff3-c60db22d7ea4",
+ "resourceType": "Microsoft.Resources/deployments"
+ },
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Network/publicIPAddresses/mspVM7_PublicIP",
+ "resourceGroup": "oraclevm-dcluster-0727",
+ "resourceName": "mspVM7_PublicIP",
+ "resourceType": "Microsoft.Network/publicIPAddresses"
+ }
+ ],
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Network/networkInterfaces/mspVM7_NIC",
+ "resourceGroup": "oraclevm-dcluster-0727",
+ "resourceName": "mspVM7_NIC",
+ "resourceType": "Microsoft.Network/networkInterfaces"
+ },
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Network/networkInterfaces/mspVM7_NIC",
+ "resourceGroup": "oraclevm-dcluster-0727",
+ "resourceName": "mspVM7_NIC",
+ "resourceType": "Microsoft.Network/networkInterfaces"
+ },
+ {
+ "apiVersion": "2019-06-01",
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Storage/storageAccounts/09b943olvm",
+ "resourceGroup": "oraclevm-dcluster-0727",
+ "resourceName": "09b943olvm",
+ "resourceType": "Microsoft.Storage/storageAccounts"
+ }
+ ],
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Compute/virtualMachines/mspVM7",
+ "resourceGroup": "oraclevm-dcluster-0727",
+ "resourceName": "mspVM7",
+ "resourceType": "Microsoft.Compute/virtualMachines"
+ },
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Compute/virtualMachines/mspVM7",
+ "resourceGroup": "oraclevm-dcluster-0727",
+ "resourceName": "mspVM7",
+ "resourceType": "Microsoft.Compute/virtualMachines"
+ },
+ {
+ "actionName": "listKeys",
+ "apiVersion": "2019-04-01",
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Storage/storageAccounts/09b943olvm",
+ "resourceGroup": "oraclevm-dcluster-0727",
+ "resourceName": "09b943olvm",
+ "resourceType": "Microsoft.Storage/storageAccounts"
+ }
+ ],
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Compute/virtualMachines/mspVM7/extensions/newuserscript",
+ "resourceGroup": "oraclevm-dcluster-0727",
+ "resourceName": "mspVM7/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "duration": "PT9M6.8098765S",
+ "mode": "Incremental",
+ "onErrorDeployment": null,
+ "outputResources": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Compute/virtualMachines/mspVM7",
+ "resourceGroup": "oraclevm-dcluster-0727"
+ },
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Compute/virtualMachines/mspVM7/extensions/newuserscript",
+ "resourceGroup": "oraclevm-dcluster-0727"
+ },
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Network/networkInterfaces/mspVM7_NIC",
+ "resourceGroup": "oraclevm-dcluster-0727"
+ },
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Network/publicIPAddresses/mspVM7_PublicIP",
+ "resourceGroup": "oraclevm-dcluster-0727"
+ }
+ ],
+ "outputs": {
+ "wlsDomainLocation": {
+ "type": "String",
+ "value": "/u01/domains/wlsd"
+ }
+ },
+ "parameters": {
+ "_artifactsLocation": {
+ "type": "String",
+ "value": "{{ armTemplateAddNodeBasePath }}"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "SecureString"
+ },
+ "aadsSettings": {
+ "type": "Object",
+ "value": {
+ "certificateBase64String": "LS0tLS1C...S0tLQ0K",
+ "enable": true,
+ "publicIP": "40.76.11.111",
+ "serverHost": "ladps.wls-security.com"
+ }
+ },
+ "adminPasswordOrKey": {
+ "type": "SecureString"
+ },
+ "adminURL": {
+ "type": "String",
+ "value": "adminVM:7001"
+ },
+ "adminUsername": {
+ "type": "String",
+ "value": "weblogic"
+ },
+ "authenticationType": {
+ "type": "String",
+ "value": "password"
+ },
+ "dnsLabelPrefix": {
+ "type": "String",
+ "value": "wls"
+ },
+ "guidValue": {
+ "type": "String",
+ "value": "67657ba3-6248-46e5-bedc-53e16ac82571"
+ },
+ "location": {
+ "type": "String",
+ "value": "eastus"
+ },
+ "managedServerPrefix": {
+ "type": "String",
+ "value": "msp"
+ },
+ "numberOfExistingNodes": {
+ "type": "Int",
+ "value": 7
+ },
+ "numberOfNewNodes": {
+ "type": "Int",
+ "value": 1
+ },
+ "skuUrnVersion": {
+ "type": "String",
+ "value": "owls-122130-8u131-ol74;Oracle:weblogic-122130-jdk8u131-ol74:owls-122130-8u131-ol7;1.1.1"
+ },
+ "storageAccountName": {
+ "type": "String",
+ "value": "09b943olvm"
+ },
+ "usePreviewImage": {
+ "type": "Bool",
+ "value": false
+ },
+ "vmSizeSelect": {
+ "type": "String",
+ "value": "Standard_A3"
+ },
+ "wlsDomainName": {
+ "type": "String",
+ "value": "wlsd"
+ },
+ "wlsPassword": {
+ "type": "SecureString"
+ },
+ "wlsUserName": {
+ "type": "String",
+ "value": "weblogic"
+ },
+ "customSSLSettings": {
+ "type": "Object",
+ "value": {
+ "enable": true,
+ "customIdentityKeyStoreBase64String": "/u3+7QAAAAIAAAABAAAAAQAKc2VydmV....QZL24ljJLq",
+ "customIdentityKeyStorePassPhrase": "mypassword",
+ "customIdentityKeyStoreType": "JKS",
+ "customTrustKeyStoreBase64String": "/u3+7QAAAAIAAAABAAAAAgAJdHJ1c3R....Td4bYVnONyS0PC7k=",
+ "customTrustKeyStorePassPhrase": "mypassword",
+ "customTrustKeyStoreType": "JKS",
+ "privateKeyAliasSecret": "servercert",
+ "privateKeyPassPhraseSecret": "mypassword"
+ }
+ }
+ },
+ "parametersLink": null,
+ "providers": [
+ {
+ "id": null,
+ "namespace": "Microsoft.Resources",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ null
+ ],
+ "properties": null,
+ "resourceType": "deployments"
+ }
+ ]
+ },
+ {
+ "id": null,
+ "namespace": "Microsoft.Network",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "publicIPAddresses"
+ },
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "networkInterfaces"
+ }
+ ]
+ },
+ {
+ "id": null,
+ "namespace": "Microsoft.Compute",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "virtualMachines"
+ },
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "virtualMachines/extensions"
+ }
+ ]
+ }
+ ],
+ "provisioningState": "Succeeded",
+ "template": null,
+ "templateHash": "15879952829017360289",
+ "templateLink": {
+ "contentVersion": "1.0.0.0",
+ "uri": "{{ armTemplateAddNodeBasePath }}arm/mainTemplate.json"
+ },
+ "timestamp": "2020-07-27T12:37:03.733682+00:00"
+ },
+ "resourceGroup": "oraclevm-dcluster-0727",
+ "type": "Microsoft.Resources/deployments"
+}
+```
+
+## Verify
+
+### Verify if new nodes are added to the WebLogic Server instance.
+
+* Go to the {{ site.data.var.wlsFullBrandName }} Administration Console.
+* Go to **Environment** -> **Machines**.
+
+ You should see logical machines with name parttern `^{managedServerPrefix}VM[0-9]+`, machine names with number suffix from `numberOfExistingNodes` to `numberOfExistingNodes + numberOfNewNodes` are added.
+* Go to **Environment** -> **Servers**
+
+ You should see servers with name parttern `^{managedServerPrefix}[0-9]+$`, server names with number suffix from `numberOfExistingNodes` to `numberOfExistingNodes + numberOfNewNodes` are added to `cluster1`.
+
+
+### Verify if the newly added server has SSL configured successfully
+* If the input parameter customSSLSettings.enable is set to true and the required custom SSL configuration values have been provided, then you should see the SSL configuration for the newly added server under **Environment** -> **Servers** -> **New Server** -> **Keystores**
+
+### Verify if Azure resources are added
+
+* Go to [Azure Portal](https://ms.portal.azure.com/).
+* Go to resource group that the {{ site.data.var.wlsFullBrandName }} is deployed.
+
+ You should see corresponding Vitual Machines, Disks, Network Interfaces, Public IPs have been added.
+
+### Verify AAD Integration
+
+Verify AAD integration by delpoying a simple Java EE applciation with basic authentication.
+
+* Go to Administration Server Console and deploy [testing application](../resources/basicauth.war).
+ * Select **Deployments**.
+ * Select **Install**.
+ * Select file `basicauth.war`.
+ * Select **Next**. Choose "Install this deployment as an application".
+ * Select **Next**. Select "cluster-1" and "All servers in the cluster".
+ * Keep configuration as default and select **Finish**.
+ * Select **Activate Changes**
+ * In the left navigation pane, select **Deployments**.
+ * Select **Control**
+ * Select `basicauth`
+ * Select **Start**
+ * Select **Servicing all requests**
+
+* Access the sample application
+ * Go to Administration Server Console
+ * Go to **Environment -> Machines**. Click one of the new machines, make sure there are servers running on that machine. Click **Node Manager** and make note of the machine host in **Listen Address**, here named it as `machineName`. Click **Servers** and make note of **Listen Port**, here named it as `port`.
+ * Go to [Azure Portal](https://ms.portal.azure.com/), and get DNS name from Virtual Machine has the same name of `machineName`, named it `machineDNS`
+ * Go to `http://${machineDNS}:${port}/basicauth`, the browser will prompt up to ask for credentials, input one of AAD users from group **AAD DC Administrators**, note that use name should be **sAMAccountName**, for example `wlstest` for user `wlstest@javaeehotmailcom.onmicrosoft.com`.
+ * Expected result, you can access the sample application without error.
diff --git a/cluster/appGatewayNestedTemplate.md b/cluster/appGatewayNestedTemplate.md
new file mode 100644
index 000000000..3d8e98ee5
--- /dev/null
+++ b/cluster/appGatewayNestedTemplate.md
@@ -0,0 +1,367 @@
+{% include variables.md %}
+
+# Apply Azure App Gateway ARM Template to {{ site.data.var.wlsFullBrandName }}
+
+This page documents how to configure an existing deployment of {{ site.data.var.wlsFullBrandName }} with Azure Application Gateway using the Azure CLI.
+
+## Prerequisites
+
+### Environment for Setup
+
+* [Azure CLI](https://docs.microsoft.com/en-us/cli/azure), use `az --version` to test if `az` works.
+
+### WebLogic Server Instance
+
+The Application Gateway ARM tempate will be applied to an existing {{ site.data.var.wlsFullBrandName }} instance. If you don't have one, please create a new instance from the Azure portal, by following the link to the offer [in the index](index.md).
+
+### Certificate for SSL Termination
+
+Because the Application Gateway serves as the front end load balancer for the {{ site.data.var.wlsFullBrandName }} cluster, it must be provided with a certificate to allow browsers to connect via SSL.
+
+When deploying the {{ site.data.var.wlsFullBrandName }} offer from the Azure Portal, you can configure the deployment to fetch the SSL certificate and its password from a pre-existing Azure Key Vault. For a high-level introduction to SSL Certificates with Azure Key Vault see [Get started with Key Vault certificates](https://docs.microsoft.com/en-us/azure/key-vault/certificates/certificate-scenarios). For an overview of TLS termination with Application Gateway see [Overview of TLS termination and end to end TLS with Application Gateway](https://docs.microsoft.com/en-us/azure/application-gateway/ssl-overview). When configuring the Application Gateway after deployment, you must base64 encode the certificate and also know the password for the certificate.
+
+## Prepare the Parameters JSON file
+
+You must construct a parameters JSON file containing the parameters to the database ARM template. See [Create Resource Manager parameter file](https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/parameter-files) for background information about parameter files. We must specify the information of the existing SSL certificate. This section shows how to obtain the values for the following required properties.
+
+| Parameter Name | Explanation |
+|----------------|-------------|
+| `_artifactsLocation`| See below for details. |
+| `adminVMName`| At deployment time, if this value was changed from its default value, the value used at deployment time must be used. Otherwise, this parameter should be omitted. |
+| `customDomainName`| Specify a custome domain name if want to override application gateway hostname. You are required to input the value if you use a pre-assigned SSL for application gateway. |
+| `appGatewaySSLCertificateData`| See below for details. |
+| `appGatewaySSLCertificatePassword`| See below for details. |
+| `dnsNameforApplicationGateway`| (optional) A prefix value for the dns name of the Application Gateway. |
+| `gatewayPublicIPAddressName` | (optional) A prefix value for the public IP address of the Application Gateway. |
+| `location` | Must be the same region into which the server was initially deployed. |
+| `managedServerPrefix` | At deployment time, if this value was changed from its default value, the value used at deployment time must be used. Otherwise, this parameter should be omitted. |
+| `numberOfInstances` | The number of instances in the cluster. Must be the same as the value used at deployment time. |
+| `overrideHostName` | If `true` the template will override the application gateway hostname with value of `customDomainName`. The vaule should be `true` if you use a pre-assigned SSL for application gateway. |
+| `wlsDomainName` | At deployment time, if this value was changed from its default value, the value used at deployment time must be used. Otherwise, this parameter should be omitted. |
+| `wlsPassword` | Must be the same value provided at deployment time. |
+| `wlsUserName` | Must be the same value provided at deployment time. |
+
+### `_artifactsLocation`
+
+This value must be the following.
+
+```bash
+{{ armTemplateBasePath }}
+```
+
+### SSL Certificate Data and Password
+
+Use base64 to encode your existing PFX format certificate.
+
+```bash
+base64 your-certificate.pfx -w 0 >temp.txt
+```
+
+Use the content as this file as the value of the `appGatewaySSLCertificateData` parameter.
+
+It is assumed that you have the password for the certificate. Use this as the value of the `appGatewaySSLCertificatePassword` parameter.
+
+#### Example Parameters JSON
+
+Here is a fully filled out parameters file. Note that we did not include any optional parameters, assuming the {{ site.data.var.wlsFullBrandName }} was deployed accepting the default values.
+
+{{ site.data.var.passwordInFileNote }}
+
+
+```json
+{
+ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "_artifactsLocation":{
+ "value": "{{ armTemplateBasePath }}"
+ },
+ "appGatewaySSLCertificateData": {
+ "value": "MIIKCQIB...sOr3QICCAA="
+ },
+ "appGatewaySSLCertificatePassword": {
+ "value": "myPasswordInClearText"
+ },
+ "numberOfInstances": {
+ "value": 3
+ },
+ "location": {
+ "value": "eastus"
+ },
+ "wlsPassword": {
+ "value": "welcome1"
+ },
+ "wlsUserName": {
+ "value": "weblogic"
+ }
+ }
+}
+```
+
+## Invoke the ARM template
+
+Assume your parameters file is available in the current directory and is named `parameters.json`. This section shows the commands to configure your {{ site.data.var.wlsFullBrandName }} deployment with the specified database. Replace `yourResourceGroup` with the Azure resource group in which the {{ site.data.var.wlsFullBrandName }} is deployed.
+
+### First, validate your parameters file
+
+The `az group deployment validate` command is very useful to validate your parameters file is syntactically correct.
+
+```bash
+az group deployment validate --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateBasePath }}nestedtemplates/appGatewayNestedTemplate.json
+```
+
+If the command returns with an exit status other than `0`, inspect the output and resolve the problem before proceeding. You can check the exit status by executing the commad `echo $?` immediately after the `az` command.
+
+### Next, execute the template
+
+After successfully validating the template invocation, change `validate` to `create` to invoke the template.
+
+```bash
+az group deployment create --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateBasePath }}nestedtemplates/appGatewayNestedTemplate.json
+```
+
+As with the validate command, if the command returns with an exit status other than `0`, inspect the output and resolve the problem.
+
+This is an example output of successful deployment. Look for `"provisioningState": "Succeeded"` in your output.
+
+```json
+{
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-0604/providers/Microsoft.Resources/deployments/cli",
+ "location": null,
+ "name": "cli",
+ "properties": {
+ "correlationId": "4cc63f27-0f43-4244-9d89-a09bf417e943",
+ "debugSetting": null,
+ "dependencies": [
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-0604/providers/Microsoft.Network/publicIPAddresses/gwip",
+ "resourceGroup": "oraclevm-cluster-0604",
+ "resourceName": "gwip",
+ "resourceType": "Microsoft.Network/publicIPAddresses"
+ }
+ ],
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-0604/providers/Microsoft.Network/applicationGateways/myAppGateway",
+ "resourceGroup": "oraclevm-cluster-0604",
+ "resourceName": "myAppGateway",
+ "resourceType": "Microsoft.Network/applicationGateways"
+ },
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-0604/providers/Microsoft.Network/applicationGateways/myAppGateway",
+ "resourceGroup": "oraclevm-cluster-0604",
+ "resourceName": "myAppGateway",
+ "resourceType": "Microsoft.Network/applicationGateways"
+ },
+ {
+ "apiVersion": "2019-11-01",
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-0604/providers/Microsoft.Network/publicIPAddresses/gwip",
+ "resourceGroup": "oraclevm-cluster-0604",
+ "resourceName": "gwip",
+ "resourceType": "Microsoft.Network/publicIPAddresses"
+ }
+ ],
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-0604/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "oraclevm-cluster-0604",
+ "resourceName": "adminVM/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ },
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-0604/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "oraclevm-cluster-0604",
+ "resourceName": "adminVM/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-0604/providers/Microsoft.Resources/deployments/pid-36deb858-08fe-5c07-bc77-ba957a59a080",
+ "resourceGroup": "oraclevm-cluster-0604",
+ "resourceName": "pid-36deb858-08fe-5c07-bc77-ba957a59a080",
+ "resourceType": "Microsoft.Resources/deployments"
+ }
+ ],
+ "duration": "PT8M41.2104793S",
+ "mode": "Incremental",
+ "onErrorDeployment": null,
+ "outputResources": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-0604/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "oraclevm-cluster-0604"
+ },
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-0604/providers/Microsoft.Network/applicationGateways/myAppGateway",
+ "resourceGroup": "oraclevm-cluster-0604"
+ },
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-0604/providers/Microsoft.Network/publicIPAddresses/gwip",
+ "resourceGroup": "oraclevm-cluster-0604"
+ }
+ ],
+ "outputs": {
+ "appGatewayURL": {
+ "type": "String",
+ "value": "http://wlsgw9e6ed1-oraclevm-cluster-0604-wlsd.eastus.cloudapp.azure.com"
+ }
+ },
+ "parameters": {
+ "_artifactsLocation": {
+ "type": "String",
+ "value": "{{ armTemplateBasePath }}"
+ },
+ "_artifactsLocationAGWTemplate": {
+ "type": "String",
+ "value": "{{ armTemplateBasePath }}"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "SecureString"
+ },
+ "adminVMName": {
+ "type": "String",
+ "value": "adminVM"
+ },
+ "appGatewaySSLCertificateData": {
+ "type": "String",
+ "value": "MIIKQQIBAz....EkAgIIAA=="
+ },
+ "appGatewaySSLCertificatePassword": {
+ "type": "String",
+ "value": "myRedactedPassword"
+ },
+ "dnsNameforApplicationGateway": {
+ "type": "String",
+ "value": "wlsgw"
+ },
+ "gatewayPublicIPAddressName": {
+ "type": "String",
+ "value": "gwip"
+ },
+ "guidValue": {
+ "type": "String",
+ "value": "9e6ed15b-d386-4cb9-a617-3cb6f785f6a0"
+ },
+ "location": {
+ "type": "String",
+ "value": "eastus"
+ },
+ "managedServerPrefix": {
+ "type": "String",
+ "value": "msp"
+ },
+ "numberOfInstances": {
+ "type": "Int",
+ "value": 4
+ },
+ "wlsDomainName": {
+ "type": "String",
+ "value": "wlsd"
+ },
+ "wlsPassword": {
+ "type": "SecureString"
+ },
+ "wlsUserName": {
+ "type": "String",
+ "value": "weblogic"
+ }
+ },
+ "parametersLink": null,
+ "providers": [
+ {
+ "id": null,
+ "namespace": "Microsoft.Resources",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ null
+ ],
+ "properties": null,
+ "resourceType": "deployments"
+ }
+ ]
+ },
+ {
+ "id": null,
+ "namespace": "Microsoft.Network",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "publicIPAddresses"
+ },
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "applicationGateways"
+ }
+ ]
+ },
+ {
+ "id": null,
+ "namespace": "Microsoft.Compute",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "virtualMachines/extensions"
+ }
+ ]
+ }
+ ],
+ "provisioningState": "Succeeded",
+ "template": null,
+ "templateHash": "12239709219097081949",
+ "templateLink": null,
+ "timestamp": "2020-06-04T03:17:01.168329+00:00"
+ },
+ "resourceGroup": "oraclevm-cluster-0604",
+ "type": "Microsoft.Resources/deployments"
+}
+```
+
+## Verify Application Gateway
+
+We will deploy a testing application to verify if the appliaction gateway is enabled.
+
+Go to Admin Server Console and deploy [webtestapp.war](../resources/webtestapp.war).
+
+* Visit the {{ site.data.var.wlsFullBrandName }} Admin console.
+* Select **Deployments**.
+* Select **Install**.
+* Select file `webtestapp.war`.
+* Select **Next**. Choose "Install this deployment as an application".
+* Select **Next**. Select "cluster-1" and "All servers in the cluster".
+* Keep configuration as default and select **Finish**.
+* Select **Activate Changes**
+* In the left navigation pane, select **Deployments**.
+* Select **Control**
+* Select `webtestapp`
+* Select **Start**
+* Select **Servicing all requests**
+
+Then access the application with `/webtestapp`, you will get a page with server host information if application gateway was successfully enabled.
diff --git a/cluster/coherenceTemplate.md b/cluster/coherenceTemplate.md
new file mode 100644
index 000000000..546572006
--- /dev/null
+++ b/cluster/coherenceTemplate.md
@@ -0,0 +1,528 @@
+{% include variables.md %}
+
+# Configure Coherence cluster to {{ site.data.var.wlsFullBrandName }}
+
+This page documents how to configure an existing deployment of {{ site.data.var.wlsFullBrandName }} with a Coherence cluster using Azure CLI.
+
+## Prerequisites
+
+### Environment for Setup
+
+* [Azure CLI](https://docs.microsoft.com/en-us/cli/azure), use `az --version` to test if `az` works.
+
+### WebLogic Server Instance
+
+The Coherence ARM template will be applied to an existing {{ site.data.var.wlsFullBrandName }} instance. If you don't have one, please create a new instance from the Azure portal, by following the link to the offer [in the index](index.md).
+
+**Note:** if you have enabled Coherence in the initial offer deployment from Azure portal, the Coherence cluster has been set up, you don't need to run Coherence tempalte.
+
+### Elasticsearch instance
+
+Optional.
+
+Refer to [Create an an Elastic on Azure instance](https://aka.ms/arm-oraclelinux-wls-elk#create-an-an-elastic-on-azure-instance)
+
+## Prepare the Parameters JSON file
+
+You must construct a parameters JSON file containing the parameters to the Coherence ARM template. See [Create Resource Manager parameter file](https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/parameter-files) for background information about parameter files.
+
+The deployment of coherenceTemplate.json will:
+ * Provision Azure resources, including virtual machine, network interface, disk, public IP to host new Coherence cache servers.
+ * Configure WebLogic Coherence cluster, including:
+ * Create Coherence cluster `myCoherence`
+ * Create data tier `storage1` cluster.
+ * Associate `cluster1` and `storage1` to `myCoherence` cluster.
+ * Create cache servers and assign them to `storage1` cluster.
+
+We must specify the information of the existing {{ site.data.var.wlsFullBrandName }}. This section shows how to obtain the values for the following required properties.
+
+| Parameter Name | Explanation |
+|----------------|-------------|
+| `_artifactsLocation`| See below for details. |
+| `adminPasswordOrKey` | SSH Key or password for the Virtual Machine. SSH key is recommended. |
+| `adminVMName`| Virtual machine name of which hosts the {{ site.data.var.wlsFullBrandName }} admin server. |
+| `elasticsearchEndpoint` | The Elasticsearch endpoint. |
+| `elasticsearchPassword` | Password for the Elasticsearch account. |
+| `elasticsearchUserName` | User name for the Elasticsearch account. |
+| `enableCoherenceWebLocalStorage` | Specifies whether Local Storage is enabled for the Coherence*Web cluster tier. |
+| `enableELK` | If true, use the supplied parameters to distribute WebLogic Server logs to the Elasticsearch instance. |
+| `location` | Must be the same region into which the server was initially deployed. |
+| `logIndex` | Elasticsearch index you expect to export the logs to. Must be the same value with output from initial ELK deployment. |
+| `logsToIntegrate` | Specify the WebLogic logs to export to Elasticsearch, you must select at least one log. |
+| `managedServerPrefix` | Must be the same prefix with which the cluster was initially deployed. |
+| `numberOfCoherenceCacheInstances` | Number of Coherence cache servers, used to create Virtual Machines and Managed Server. |
+| `skuUrnVersion` | Must be the same urn with which the cluster was initially deployed. |
+| `storageAccountName` | The name of an existing storage account. |
+| `vmSizeSelectForCoherence` | Select appropriate VM Size for Coherence cache servers. |
+| `wlsDomainName` | Must be the same value provided at initial deployment time. |
+| `wlsPassword` | Must be the same value provided at initial deployment time. |
+| `wlsUserName` | Must be the same value provided at initial deployment time. |
+
+### `_artifactsLocation`
+
+This value must be the following.
+
+```bash
+{{ armTemplateBasePath }}
+```
+
+### Log index
+
+If you configured ELK in your cluster to export WebLogic Server logs to ELK, please input the value of Kibana log index, this template will set up ELK connection and export logs to specified index.
+
+You can get the value from Azure portal with the following steps:
+
+* Go to Azure portal.
+* Open you resource group and click **Deployments**.
+* Open the ELK deployment, and click **Output**.
+* Copy the value of `logIndex`.
+
+Alternatively, use Azure CLI command to list log index inside the resource group deployments:
+
+```shell
+$ az deployment group list -g 'yourResourceGroup' --query [*].properties.outputs.logIndex.value
+[
+ "azure-weblogic-cluster-f984df74-ab4d-4c17-a532-7f248659fb28"
+]
+```
+
+### Storage account
+
+Each Storage Account handles up to 20,000 IOPS, and 500TB of data. If you use a storage account for Standard Virtual Machines, you can store until 40 virtual disks.
+
+We have two disks for one Virtual Machine, it's suggested no more than 20 Virtual Machines share the same storage account. Number of virtual machines that hosting managed servers should be less than or equal to 20.
+
+You can get the name of storage account from Azure portal with steps:
+
+ * Go to Azure portal
+ * Go to the your resource group
+ * Find storage account resource and copy its name
+
+Alternatively, use Azure CLI command to list storage account inside a resource group:
+
+```shell
+$ az resource list -g 'yourResourceGroup' --resource-type Microsoft.Storage/storageAccounts --query [*].name
+[
+ "219846olvm"
+]
+```
+
+#### Example Parameters JSON
+
+Here is a fully filled out parameters file. This is an example to set up Coherence*Web. We will leave values of `adminUsername`, `authenticationType`, `dnsLabelPrefix`, and `usePreviewImage` as default value.
+
+{{ site.data.var.passwordInFileNote }}
+
+```json
+{
+ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "_artifactsLocation": {
+ "value": "{{ armTemplateBasePath }}"
+ },
+ "adminPasswordOrKey": {
+ "value": "jyfRat@nht2019"
+ },
+ "adminVMName": {
+ "value": "adminVM"
+ },
+ "elasticsearchEndpoint": {
+ "value": "https://example.eastus2.azure.elastic-cloud.com:9243"
+ },
+ "elasticsearchPassword": {
+ "value": "Secret123!"
+ },
+ "elasticsearchUserName": {
+ "value": "elastic"
+ },
+ "enableCoherenceWebLocalStorage": {
+ "value": true
+ },
+ "enableELK": {
+ "value": true
+ },
+ "managedServerPrefix": {
+ "value": "msp"
+ },
+ "location": {
+ "value": "eastus"
+ },
+ "logIndex": {
+ "value": "azure-weblogic-cluster-11122020"
+ },
+ "logsToIntegrate": {
+ "value": ["HTTPAccessLog", "ServerLog", "DomainLog", "DataSourceLog", "StandardErrorAndOutput","NodeManagerLog"]
+ },
+ "numberOfCoherenceCacheInstances": {
+ "value": 1
+ },
+ "skuUrnVersion": {
+ "value": "owls-122140-8u251-ol76;Oracle:weblogic-122140-jdk8u251-ol76:owls-122140-8u251-ol7;latest"
+ },
+ "storageAccountName": {
+ "value": "d40140olvm"
+ },
+ "vmSizeSelectForCoherence": {
+ "value": "Standard_A1"
+ },
+ "wlsDomainName": {
+ "value": "wlsd"
+ },
+ "wlsPassword": {
+ "value": "welcome1"
+ },
+ "wlsUserName": {
+ "value": "weblogic"
+ }
+ }
+}
+```
+
+## Invoke the ARM template
+
+Assume your parameters file is available in the current directory and is named `parameters.json`. This section shows the commands to configure your {{ site.data.var.wlsFullBrandName }} deployment with a Coherence cluster. Replace `yourResourceGroup` with the Azure resource group in which the {{ site.data.var.wlsFullBrandName }} is deployed.
+
+### First, validate your parameters file
+
+The `az deployment group validate` command is very useful to validate your parameters file is syntactically correct.
+
+```bash
+az deployment group validate --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateBasePath }}nestedtemplates/coherenceTemplate.json
+```
+
+If the command returns with an exit status other than `0`, inspect the output and resolve the problem before proceeding. You can check the exit status by executing the commad `echo $?` immediately after the `az` command.
+
+### Next, execute the template
+
+After successfully validating the template invocation, change `validate` to `create` to invoke the template.
+
+```bash
+az deployment group create --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateBasePath }}nestedtemplates/coherenceTemplate.json
+```
+
+As with the validate command, if the command returns with an exit status other than `0`, inspect the output and resolve the problem.
+
+This is an example output of successful deployment. Look for `"provisioningState": "Succeeded"` in your output.
+
+```json
+{
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Resources/deployments/coherenceTemplate",
+ "location": null,
+ "name": "coherenceTemplate",
+ "properties": {
+ "correlationId": "07555c54-2384-4ca3-b427-6cf7d8b53052",
+ "debugSetting": null,
+ "dependencies": [
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "adminVM/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ },
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Compute/virtualMachines/mspStorageVM1/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "mspStorageVM1/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Resources/deployments/pid-157eaa6e-12ae-11eb-adc1-0242ac120002",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "pid-157eaa6e-12ae-11eb-adc1-0242ac120002",
+ "resourceType": "Microsoft.Resources/deployments"
+ },
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Network/publicIPAddresses/mspStorageVM1_PublicIP",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "mspStorageVM1_PublicIP",
+ "resourceType": "Microsoft.Network/publicIPAddresses"
+ }
+ ],
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Network/networkInterfaces/mspStorageVM1_NIC",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "mspStorageVM1_NIC",
+ "resourceType": "Microsoft.Network/networkInterfaces"
+ },
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Network/networkInterfaces/mspStorageVM1_NIC",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "mspStorageVM1_NIC",
+ "resourceType": "Microsoft.Network/networkInterfaces"
+ },
+ {
+ "apiVersion": "2019-06-01",
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Storage/storageAccounts/33f2e3olvm",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "33f2e3olvm",
+ "resourceType": "Microsoft.Storage/storageAccounts"
+ }
+ ],
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Compute/virtualMachines/mspStorageVM1",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "mspStorageVM1",
+ "resourceType": "Microsoft.Compute/virtualMachines"
+ },
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Compute/virtualMachines/mspStorageVM1",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "mspStorageVM1",
+ "resourceType": "Microsoft.Compute/virtualMachines"
+ },
+ {
+ "actionName": "listKeys",
+ "apiVersion": "2019-06-01",
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Storage/storageAccounts/33f2e3olvm",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "33f2e3olvm",
+ "resourceType": "Microsoft.Storage/storageAccounts"
+ }
+ ],
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "adminVM/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ },
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Compute/virtualMachines/mspStorageVM1",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "mspStorageVM1",
+ "resourceType": "Microsoft.Compute/virtualMachines"
+ },
+ {
+ "actionName": "listKeys",
+ "apiVersion": "2019-06-01",
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Storage/storageAccounts/33f2e3olvm",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "33f2e3olvm",
+ "resourceType": "Microsoft.Storage/storageAccounts"
+ }
+ ],
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Compute/virtualMachines/mspStorageVM1/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "mspStorageVM1/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "duration": "PT9M26.6278882S",
+ "mode": "Incremental",
+ "onErrorDeployment": null,
+ "outputResources": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-1106"
+ },
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Compute/virtualMachines/mspStorageVM1",
+ "resourceGroup": "haiche-cluster-1106"
+ },
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Compute/virtualMachines/mspStorageVM1/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-1106"
+ },
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Network/networkInterfaces/mspStorageVM1_NIC",
+ "resourceGroup": "haiche-cluster-1106"
+ },
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Network/publicIPAddresses/mspStorageVM1_PublicIP",
+ "resourceGroup": "haiche-cluster-1106"
+ }
+ ],
+ "outputs": {
+ "artifactsLocationPassedIn": {
+ "type": "String",
+ "value": "{{ armTemplateBasePath }}"
+ }
+ },
+ "parameters": {
+ "_artifactsLocation": {
+ "type": "String",
+ "value": "{{ armTemplateBasePath }}"
+ },
+ "_artifactsLocationCoherenceTemplate": {
+ "type": "String",
+ "value": "{{ armTemplateBasePath }}"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "SecureString"
+ },
+ "adminPasswordOrKey": {
+ "type": "SecureString"
+ },
+ "adminUsername": {
+ "type": "String",
+ "value": "weblogic"
+ },
+ "adminVMName": {
+ "type": "String",
+ "value": "adminVM"
+ },
+ "authenticationType": {
+ "type": "String",
+ "value": "password"
+ },
+ "dnsLabelPrefix": {
+ "type": "String",
+ "value": "wls"
+ },
+ "enableCoherenceWebLocalStorage": {
+ "type": "Bool",
+ "value": true
+ },
+ "guidValue": {
+ "type": "String",
+ "value": "b4c17707-b932-43f0-a4cc-6d6990bb850f"
+ },
+ "location": {
+ "type": "String",
+ "value": "eastus"
+ },
+ "managedServerPrefix": {
+ "type": "String",
+ "value": "msp"
+ },
+ "numberOfCoherenceCacheInstances": {
+ "type": "Int",
+ "value": 1
+ },
+ "skuUrnVersion": {
+ "type": "String",
+ "value": "owls-122130-8u131-ol74;Oracle:weblogic-122130-jdk8u131-ol74:owls-122130-8u131-ol7;latest"
+ },
+ "storageAccountName": {
+ "type": "String",
+ "value": "33f2e3olvm"
+ },
+ "usePreviewImage": {
+ "type": "Bool",
+ "value": false
+ },
+ "vmSizeSelectForCoherence": {
+ "type": "String",
+ "value": "Standard_A1"
+ },
+ "wlsDomainName": {
+ "type": "String",
+ "value": "wlsd"
+ },
+ "wlsPassword": {
+ "type": "SecureString"
+ },
+ "wlsUserName": {
+ "type": "String",
+ "value": "weblogic"
+ }
+ },
+ "parametersLink": null,
+ "providers": [
+ {
+ "id": null,
+ "namespace": "Microsoft.Resources",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ null
+ ],
+ "properties": null,
+ "resourceType": "deployments"
+ }
+ ]
+ },
+ {
+ "id": null,
+ "namespace": "Microsoft.Network",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "publicIPAddresses"
+ },
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "networkInterfaces"
+ }
+ ]
+ },
+ {
+ "id": null,
+ "namespace": "Microsoft.Compute",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "virtualMachines"
+ },
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "virtualMachines/extensions"
+ }
+ ]
+ }
+ ],
+ "provisioningState": "Succeeded",
+ "template": null,
+ "templateHash": "7840329080326569798",
+ "templateLink": null,
+ "timestamp": "2020-11-06T08:48:57.229200+00:00"
+ },
+ "resourceGroup": "haiche-cluster-1106",
+ "type": "Microsoft.Resources/deployments"
+}
+```
+
+## Verify Coherence cluster
+
+Follow the steps to check if Coherence*Web is enabled.
+
+* Follow the example parameters to set up Coherence*Web.
+* Go to admin console portal.
+* Deploy [coherence-sample.war](../resources/coherence-sample.war) to `cluster1`.
+ Please select `cluster1` in the Targets page.
+* Start `coherence-sample`.
+* Open the sample with browser, click "add session" to add session infomation. Click "test session" to verify.
+
+If the Coherence cluster does not set up successfully, the application deployment will fail.
+
+If the cache server does not work correctly, session can not be saved, as we disabled local storage in application servers.
diff --git a/cluster/customDNSTemplate.md b/cluster/customDNSTemplate.md
new file mode 100644
index 000000000..944709c37
--- /dev/null
+++ b/cluster/customDNSTemplate.md
@@ -0,0 +1,174 @@
+{% include variables.md %}
+
+# Configure DNS alias to {{ site.data.var.wlsFullBrandName }}
+
+This page documents how to configure an existing deployment of {{ site.data.var.wlsFullBrandName }} with a custom DNS alias.
+
+## Prerequisites
+
+### Environment for Setup
+
+* [Azure CLI](https://docs.microsoft.com/en-us/cli/azure), use `az --version` to test if `az` works.
+
+### WebLogic Server Instance
+
+The DNS Configuraton ARM template will be applied to an existing {{ site.data.var.wlsFullBrandName }} instance. If you don't have one, please create a new instance from the Azure portal, by following the link to the offer [in the index](index.md).
+
+### Registered Domain Name
+
+You need to buy a domain name to create a custom DNS alias.
+
+### Azure DNS Zone
+
+If you create the DNS alias on an existing [Azure DNS Zone](https://docs.microsoft.com/en-us/azure/dns/dns-overview), make sure you have perfomed the [Azure DNS Delegation](https://docs.microsoft.com/en-us/azure/dns/dns-domain-delegation). Once you have completed the delegation, you can verify it with `nslookup`. For example, assuming your domain name is **contoso.com**, this output shows a correct delegation.
+
+```bash
+$ nslookup -type=SOA contoso.com
+Server: 172.29.80.1
+Address: 172.29.80.1#53
+
+Non-authoritative answer:
+contoso.com
+ origin = ns1-01.azure-dns.com
+ mail addr = azuredns-hostmaster.microsoft.com
+ serial = 1
+ refresh = 3600
+ retry = 300
+ expire = 2419200
+ minimum = 300
+Name: ns1-01.azure-dns.com
+Address: 40.90.4.1
+Name: ns1-01.azure-dns.com
+Address: 2603:1061::1
+```
+
+We strongly recommand you create an Azure DNS Zone for domain management and reuse it for other perpose. Follow the [guide](https://docs.microsoft.com/en-us/azure/dns/dns-getstarted-portal) to create an Azure DNS Zone.
+
+### Azure Managed Indentify
+
+If you are going to configure DNS alias based on an existing DNS Zone, you are required to input the ID of a user-assigned managed identity.
+
+Follow this [guide](https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/how-to-manage-ua-identity-portal) to create a user-assigned managed identity.
+
+To obtain ID of the indentify: go to Azure Portal; open the identity **Overview** page; click **JSON View** and copy the **Resource ID**.
+
+
+## Prepare the Parameters
+
+We provide an automation shell script for DNS configuration. You must specify the information of the existing Oracle WebLogic Server. This section shows how to obtain the values for the following required properties.
+
+| Parameter Name | Explanation |
+|----------------|-------------|
+| `--admin-vm-name`| Required. Name of vitual machine that hosts {{ site.data.var.wlsFullBrandName }} admin server. Must be the same value provided at initial deployment time.|
+| `--admin-console-label` | Required. Label for {{ site.data.var.wlsFullBrandName }} admin console. Used to generate subdomain of admin console. |
+| `--artifact-location`| Required. See below for details. |
+| `--resource-group` | Required. Name of resource group that has WebLogic cluster deployed. |
+| `--location ` | Required. Must be the same region into which the server was initially deployed. |
+| `--zone-name ` | Required. Azure DNS Zone name. |
+| `--gateway-label` | Optional. Label for applciation gateway. Used to generate subdomain of application gateway. The parameter is only required if you want to create DNS alias for application gateway.|
+| `--identity-id` | Optional. ID of Azure user-assigned managed identity. The parameter is only required if you are creating DNS alias on an existing DNS Zone.|
+| `--zone-resource-group` | Optional. Name of resource group that has Azure DNS Zone deployed. The parameter is only required if you are creating DNS alias on an existing DNS Zone. |
+| `--help` | Help. |
+
+### Artifacts location
+
+This value must be the following.
+
+```bash
+{{ armTemplateBasePath }}
+```
+
+## Invoke the Automation Script
+
+We provide an automation script to configure a custom DNS alias. The script lets you do the following:
+
+ * If you have an Azure DNS Zone, it will create a DNS alias for the admin console and application gateway on the existing DNS Zone.
+ * If you don't have an Azure DNS Zone, it will create the DNS Zone in the same resource group as the WebLogic cluster, then create the DNS alias for the admin console and application gateway.
+
+### Configure DNS Alias on an Existing Azure DNS Zone
+
+To configure a DNS alias on an existing Azure DNS Zone, in addition to the required parameters, you must also specify an Azure user-assigned managed identity ID and the resource group name in which your DNS Zone is deployed.
+
+This is an example to create a DNS alias `admin.contoso.com` for the admin console and `applciations.contoso.com` for the application gateway on an existing Azure DNS Zone.
+
+```bash
+$ curl -fsSL {{ site.data.var.artifactsLocationBase }}{{ pageDir }}/{{ site.data.var.artifactsLocationTag }}/cli-scripts/custom-dns-alias-cli.sh \
+ | /bin/bash -s -- \
+ --resource-group `yourResourceGroup` \
+ --admin-vm-name adminVM \
+ --admin-console-label admin \
+ --artifact-location {{ armTemplateBasePath }} \
+ --location eastus \
+ --zone-name contoso.com \
+ --gateway-label applications \
+ --identity-id `yourIndentityID` \
+ --zone-resource-group `yourDNSZoneResourceGroup`
+```
+
+An example output:
+
+```text
+Done!
+
+Custom DNS alias:
+ Resource group: haiche-dns-doc
+ WebLogic Server Administration Console URL: http://admin.contoso.com:7001/console
+ WebLogic Server Administration Console secured URL: https://admin.contoso.com:7002/console
+
+
+ Application Gateway URL: http://applications.contoso.com
+ Application Gateway secured URL: https://applications.contoso.com
+```
+
+
+### Configure DNS Alias on a New Azure DNS Zone
+
+To configure a DNS alias on a new Azure DNS Zone, you must specify the required parameters.
+
+This is an example of creating an Azure DNS Zone, then creating a DNS alias `admin.contoso.com` for the admin console and `applications.contoso.com` for application gateway.
+
+```bash
+$ curl -fsSL {{ site.data.var.artifactsLocationBase }}{{ pageDir }}/{{ site.data.var.artifactsLocationTag }}/cli-scripts/custom-dns-alias-cli.sh \
+ | /bin/bash -s -- \
+ --resource-group `yourResourceGroup` \
+ --admin-vm-name adminVM \
+ --admin-console-label admin \
+ --artifact-location {{ armTemplateBasePath }} \
+ --location eastus \
+ --zone-name contoso.com \
+ --gateway-label applications
+```
+
+An example output:
+
+```text
+DONE!
+
+
+Action required:
+ Complete Azure DNS delegation to make the alias accessible.
+ Reference: https://aka.ms/dns-domain-delegation
+ Name servers:
+ [
+ "ns1-02.azure-dns.com.",
+ "ns2-02.azure-dns.net.",
+ "ns3-02.azure-dns.org.",
+ "ns4-02.azure-dns.info."
+ ]
+
+Custom DNS alias:
+ Resource group: haiche-dns-doc
+ WebLogic Server Administration Console URL: http://admin.contoso.com:7001/console
+ WebLogic Server Administration Console secured URL: https://admin.contoso.com:7002/console
+
+
+ Application Gateway URL: http://applications.contoso.com
+ Application Gateway secured URL: https://applications.contoso.com
+```
+
+**Note:** The DNS aliases are not accessible now, you must perform Azure DNS delegation after the deployment. Follow [Delegation of DNS zones with Azure DNS](https://aka.ms/dns-domain-delegation) to complete the Azure DNS delegation.
+
+
+## Verify the Custom Alias
+
+Access the URL from output to verify if the custom alias works.
diff --git a/cluster/dbTemplate.md b/cluster/dbTemplate.md
new file mode 100644
index 000000000..b46907b35
--- /dev/null
+++ b/cluster/dbTemplate.md
@@ -0,0 +1,334 @@
+{% include variables.md %}
+
+# Apply Database ARM Template to {{ site.data.var.wlsFullBrandName }}
+
+This page documents how to configure an existing deployment of {{ site.data.var.wlsFullBrandName }} with an existing Azure database using Azure CLI.
+
+## Prerequisites
+
+### Environment for Setup
+
+* [Azure CLI](https://docs.microsoft.com/en-us/cli/azure), use `az --version` to test if `az` works.
+
+### WebLogic Server Instance
+
+The database ARM template will be applied to an existing {{ site.data.var.wlsFullBrandName }} instance. If you don't have one, please create a new instance from the Azure portal, by following the link to the offer [in the index](index.md).
+
+### Database Instance
+
+To apply configure a database with {{ site.data.var.wlsFullBrandName }},
+you must have an existing database instance to use. This template
+supports three popular Azure databases: [Oracle](https://ms.portal.azure.com/#blade/Microsoft_Azure_Marketplace/MarketplaceOffersBlade/selectedMenuItemId/home/searchQuery/oracle%20database), [Azure SQL Server](https://docs.microsoft.com/en-us/azure/azure-sql/) and [Azure Database for PostgreSQL](https://docs.microsoft.com/en-us/azure/azure-sql/database/single-database-create-quickstart?WT.mc_id=gallery&tabs=azure-portal). If you do not have an instance, please
+create one from the Azure portal.
+
+### Apply multiple databases
+
+You can deploy different databases using the database ARM template, by changing the ARM parameters file and invoking the template again with Azure CLI.
+
+To apply multiple databases, you have to remove the previous virtual machine extension. Last ARM parameters file is cached, it will block you from configuring the new database.
+
+Use the following command to remove virtual machine extension:
+
+```bash
+# remove existing vm extension
+az vm extension delete -g ${yourResourceGroup} --vm-name ${adminVMName} --name newuserscript
+```
+
+## Prepare the Parameters JSON file
+
+You must construct a parameters JSON file containing the parameters to the database ARM template. See [Create Resource Manager parameter file](https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/parameter-files) for background information about parameter files. We must specify the information of the existing {{ site.data.var.wlsFullBrandName }} and database instance. This section shows how to obtain the values for the following required properties.
+
+| Parameter Name | Explanation |
+|----------------|-------------|
+| `_artifactsLocation`| See below for details. |
+| `adminVMName`| At deployment time, if this value was changed from its default value, the value used at deployment time must be used. Otherwise, this parameter should be omitted. |
+| `databaseType`| Must be one of `postgresql`, `oracle` or `sqlserver` |
+| `dbPassword`| See below for details. |
+| `dbUser` | See below for details. |
+| `dsConnectionURL`| See below for details. |
+| `jdbcDataSourceName`| Must be the JNDI name for the JDBC DataSource. |
+| `location` | Must be the same region into which the server was initially deployed. |
+| `wlsPassword` | Must be the same value provided at deployment time. |
+| `wlsUserName` | Must be the same value provided at deployment time. |
+
+### `_artifactsLocation`
+
+This value must be the following.
+
+```bash
+{{ armTemplateBasePath }}
+```
+
+### Obtain the JDBC Connection String, Database User, and Database Password
+
+The parameter `dsConnectionURL` stands for JDBC connection string. The connection string is database specific.
+
+#### Oracle Database:
+
+The following is the format of the JDBC connection string for Oracle Database:
+
+```bash
+jdbc:oracle:thin:@HOSTNAME:1521/DATABASENAME
+```
+
+For example:
+
+```bash
+jdbc:oracle:thin:@benqoiz.southeastasia.cloudapp.azure.com:1521/pdb1
+```
+
+#### Azure Database for PostgreSQL:
+
+Deploy an Azure Database PostgreSQL as described in [Create an Azure Database for PostgreSQL server in the Azure portal](https://docs.microsoft.com/en-us/azure/postgresql/quickstart-create-server-database-portal).
+
+1. Access the [Azure portal](https://portal.azure.com), and go to the service instance.
+
+2. Click **Connection Strings** under **Settings**.
+
+3. Locate the **JDBC** section and click the copy icon on the right to copy the JDBC connection string to the clipboard. The JDBC connection string will be similar to the following:
+
+```bash
+jdbc:postgresql://20191015cbfgterfdy.postgres.database.azure.com:5432/{your_database}?user=jroybtvp@20191015cbfgterfdy&password={your_password}&sslmode=require
+```
+
+When passing this value to the ARM template, remove the database user and password values from the connection string, and let them be the parameters `dbUser` and `dbPassword`. In the above JDBC connection string sample, the value for `dsConnectionURL` argument after removing the database user and password, will be:
+
+```bash
+jdbc:postgresql://20191015cbfgterfdy.postgres.database.azure.com:5432/{your_database}?sslmode=require
+```
+
+Finally, replace `{your_database}` with the name of your database, typically `postgres`.
+
+#### Azure SQL Server
+
+Deploy Azure SQL Server as described in [Create a single database in Azure SQL Database using the Azure portal, PowerShell, and Azure CLI](https://docs.microsoft.com/en-us/azure/sql-database/sql-database-single-database-get-started?tabs=azure-portal).
+
+1. Access the [Azure portal](https://portal.azure.com) and go to the service instance.
+
+2. Click **Connection Strings** under **Settings**.
+
+3. Locate the **JDBC** section and click the copy icon on the right to copy the JDBC connection string to the clipboard. The JDBC connection string will be similar to the following:
+
+```bash
+jdbc:sqlserver://rwo102804.database.windows.net:1433;database=rwo102804;user=jroybtvp@rwo102804;password={your_password_here};encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;
+```
+
+When passing this value to the ARM template, remove the database user and password values, let them be the parameters `dbUser` and `dbPassword`. In the above JDBC connection string sample, the value for `dsConnectionURL` argument after removing the database user and password, will be:
+
+```bash
+jdbc:sqlserver://rwo102804.database.windows.net:1433;database={your_database};encrypt=true;tr
+```
+
+Finally, replace `{your_database}` with the name of your database.
+
+#### Example Parameters JSON
+
+Here is a fully filled out parameters file. Note that we did not include `adminVMName`.
+
+{{ site.data.var.passwordInFileNote }}
+
+```json
+{
+ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "_artifactsLocation":{
+ "value": "{{ armTemplateBasePath }}"
+ },
+ "location": {
+ "value": "eastus"
+ },
+ "databaseType": {
+ "value": "postgresql"
+ },
+ "dsConnectionURL": {
+ "value": "jdbc:postgresql://ejb060801p.postgres.database.azure.com:5432/postgres?sslmode=require"
+ },
+ "dbPassword": {
+ "value": "Secret123!"
+ },
+ "dbUser": {
+ "value": "postgres@ejb060801p"
+ },
+ "jdbcDataSourceName": {
+ "value": "jdbc/ejb060801p"
+ },
+ "wlsPassword": {
+ "value": "welcome1"
+ },
+ "wlsUserName": {
+ "value": "weblogic"
+ }
+ }
+}
+```
+
+## Invoke the ARM template
+
+Assume your parameters file is available in the current directory and is named `parameters.json`. This section shows the commands to configure your {{ site.data.var.wlsFullBrandName }} deployment with the specified database. Replace `yourResourceGroup` with the Azure resource group in which the {{ site.data.var.wlsFullBrandName }} is deployed.
+
+### First, validate your parameters file
+
+The `az group deployment validate` command is very useful to validate your parameters file is syntactically correct.
+
+```bash
+az group deployment validate --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateBasePath }}nestedtemplates/dbTemplate.json
+```
+
+If the command returns with an exit status other than `0`, inspect the output and resolve the problem before proceeding. You can check the exit status by executing the commad `echo $?` immediately after the `az` command.
+
+### Next, execute the template
+
+After successfully validating the template invocation, change `validate` to `create` to invoke the template.
+
+```bash
+az group deployment create --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateBasePath }}nestedtemplates/dbTemplate.json
+```
+
+As with the validate command, if the command returns with an exit status other than `0`, inspect the output and resolve the problem.
+
+This is an example output of successful deployment. Look for `"provisioningState": "Succeeded"` in your output.
+
+```json
+{
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-admin-0602/providers/Microsoft.Resources/deployments/db",
+ "location": null,
+ "name": "db",
+ "properties": {
+ "correlationId": "6fc805b9-1c47-4b32-b9b0-59745a21e559",
+ "debugSetting": null,
+ "dependencies": [
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-admin-0602/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "oraclevm-admin-0602",
+ "resourceName": "adminVM/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-admin-0602/providers/Microsoft.Resources/deployments/3b35b279-0e94-5264-85f5-0d9d662f8a38",
+ "resourceGroup": "oraclevm-admin-0602",
+ "resourceName": "3b35b279-0e94-5264-85f5-0d9d662f8a38",
+ "resourceType": "Microsoft.Resources/deployments"
+ }
+ ],
+ "duration": "PT17.4377546S",
+ "mode": "Incremental",
+ "onErrorDeployment": null,
+ "outputResources": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-admin-0602/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "oraclevm-admin-0602"
+ }
+ ],
+ "outputs": {
+ "artifactsLocationPassedIn": {
+ "type": "String",
+ "value": "{{ armTemplateBasePath }}"
+ }
+ },
+ "parameters": {
+ "_artifactsLocation": {
+ "type": "String",
+ "value": "{{ armTemplateBasePath }}"
+ },
+ "_artifactsLocationDbTemplate": {
+ "type": "String",
+ "value": "{{ armTemplateBasePath }}"
+ }
+ "adminVMName": {
+ "type": "String",
+ "value": "adminVM"
+ },
+ "databaseType": {
+ "type": "String",
+ "value": "postgresql"
+ },
+ "dbPassword": {
+ "type": "SecureString"
+ },
+ "dbUser": {
+ "type": "String",
+ "value": "weblogic@oraclevm"
+ },
+ "dsConnectionURL": {
+ "type": "String",
+ "value": "jdbc:postgresql://oraclevm.postgres.database.azure.com:5432/postgres"
+ },
+ "jdbcDataSourceName": {
+ "type": "String",
+ "value": "jdbc/WebLogicCafeDB"
+ },
+ "location": {
+ "type": "String",
+ "value": "eastus"
+ },
+ "wlsPassword": {
+ "type": "SecureString"
+ },
+ "wlsUserName": {
+ "type": "String",
+ "value": "weblogic"
+ }
+ },
+ "parametersLink": null,
+ "providers": [
+ {
+ "id": null,
+ "namespace": "Microsoft.Resources",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ null
+ ],
+ "properties": null,
+ "resourceType": "deployments"
+ }
+ ]
+ },
+ {
+ "id": null,
+ "namespace": "Microsoft.Compute",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "virtualMachines/extensions"
+ }
+ ]
+ }
+ ],
+ "provisioningState": "Succeeded",
+ "template": null,
+ "templateHash": "6381424766408193665",
+ "templateLink": null,
+ "timestamp": "2020-06-02T06:05:03.141828+00:00"
+ },
+ "resourceGroup": "oraclevm-admin-0602",
+ "type": "Microsoft.Resources/deployments"
+}
+```
+
+## Verify Database Connection
+
+Follow the steps to check if the database has successfully been connected.
+
+* Visit the {{ site.data.var.wlsFullBrandName }} Admin console.
+* In the left navigation pane, expand the **Services** tree node and the **DataSources** child node.
+* Select the row for the JDBC database name, for example `jdbc/WebLogicDB`.
+* Select the **Monitoring** tab and the **Testing** sub-tab.
+* Select `admin` and select **Test Data Source**
+* If the database is enabled, you will see a message similar to "Test of jdbc/WebLogicDB on server admin was successful."
diff --git a/cluster/deletenode.md b/cluster/deletenode.md
new file mode 100644
index 000000000..5f9311fa1
--- /dev/null
+++ b/cluster/deletenode.md
@@ -0,0 +1,537 @@
+{% include variables.md %}
+
+# Delete nodes from {{ site.data.var.wlsFullBrandName }}
+
+This page documents how to configure an existing deployment of {{ site.data.var.wlsFullBrandName }} to delete nodes using Azure CLI.
+
+## Prerequisites
+
+### Environment for Setup
+
+* [Azure CLI](https://docs.microsoft.com/en-us/cli/azure), use `az --version` to test if `az` works.
+
+### WebLogic Server Instance
+
+The template will be applied to an existing {{ site.data.var.wlsFullBrandName }} instance. If you don't have one, please create a new instance from the Azure portal, by following the link to the offer [in the index](index.md).
+
+## Prepare the Parameters JSON file
+
+You must construct a parameters JSON file containing the parameters to the delete-node ARM template. See [Create Resource Manager parameter file](https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/parameter-files) for background information about parameter files. You must specify the information of the existing {{ site.data.var.wlsFullBrandName }} and nodes to be deleted. This section shows how to obtain the values for the following required properties.
+
+| Parameter Name | Explanation |
+|----------------|-------------|
+| `_artifactsLocation`| See below for details. |
+| `adminVMName`| At deployment time, if this value was changed from its default value, the value used at deployment time must be used. Otherwise, this parameter should be omitted. |
+| `deletingManagedServerNames` | The names of managed server that you want to delete. |
+| `deletingManagedServerMachineNames`| The resource names of Azure Virtual Machine hosting managed servers that you want to delete. |
+| `wlsPassword` | Must be the same value provided at deployment time. |
+| `wlsUserName` | Must be the same value provided at deployment time. |
+
+### `_artifactsLocation`
+
+This value must be the following.
+
+```bash
+{{ armTemplateDeleteNodeBasePath }}
+```
+
+### `deletingManagedServerNames`
+
+This value must be an array of strings, for example: `["msp1", "msp2"]`.
+
+You can get the server names from WebLogic Server Administration Console, following the steps:
+
+* Go to WebLogic Server Administration Console, http://admin-host:7001/console.
+
+* Go to **Environment** -> **Servers**.
+
+ You will find all available servers. Server names are listed in **Name** column.
+
+ Make note of the machine for the deleting servers, you need to find out corresponding Azure Virtual Machine names of those machines.
+
+### `deletingManagedServerMachineNames`
+
+This value must be an array of strings, for example: `["mspVM1", "mspVM2"]`.
+
+You can get the server names from WebLogic Server Administration Console, following the steps:
+
+* Go to WebLogic Server Administration Console, http://admin-host:7001/console.
+
+* Go to **Environment** -> **Machines**.
+
+ Open the machine you noted down in step `deletingManagedServerNames`.
+
+ Click **Configuration** -> **Node Manager**, you will get compute name from **Listen Address**.
+
+ The Azure Virtual Machine name was set with the same value of compute name during {{ site.data.var.wlsFullBrandName }} deployment.
+
+#### Example Parameters JSON
+
+Here is a fully filled out parameters file. Note that here we do not include `adminVMName`.
+
+{{ site.data.var.passwordInFileNote }}
+
+```json
+{
+ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "_artifactsLocation": {
+ "value": "{{ armTemplateDeleteNodeBasePath }}"
+ },
+ "deletingManagedServerNames": {
+ "value": [
+ "msp4",
+ "mspStorage2"
+ ]
+ },
+ "deletingManagedServerMachineNames": {
+ "value": [
+ "mspVM4",
+ "mspStorageVM2"
+ ]
+ },
+ "wlsPassword": {
+ "value": "welcome1"
+ },
+ "wlsUserName": {
+ "value": "weblogic"
+ }
+ }
+}
+```
+
+## Invoke the delete-node script
+
+To delete managed nodes completely, you have to delete managed servers logically from the WebLogic Server instance, and physically release Azure resources that host the managed servers. We realize the two purposes in different ways:
+ * Delete managed servers and machines logically from WebLogic Server instance by deploying delete-node ARM template with Azure CLI. You have to specify the parameters file.
+ * Release corresponding Azure resources by running Azure CLI commands. The following resources will be removed:
+ * Virtual Machines that host managed servers that will be deleted.
+ * Data disks attached to the Virtual Machines
+ * OS disks attached to the Virtual Machines
+ * Network Interfaces added to the Virtual Machines
+ * Public IPs attached to the Virtual Machines
+ * If the Application Gateway is deployed, will remove the manged server hosts from gateway.
+
+We have provided an automation script for above two purposes, you can delete managed nodes easily with the following instructions.
+
+### Invoke the script
+
+Assume your parameters file is available in the current directory and is named `parameters.json`. Replace `yourResourceGroup` with the Azure resource group in which the {{ site.data.var.wlsFullBrandName }} is deployed.
+
+The following command runs the script in silent mode with option `-s`, this mode will delete managed nodes logically and physically.
+
+If you want to keep Azure resources, refer to [advanced usage](#advanced-usage) for further information.
+
+```bash
+$ curl -fsSL {{ armTemplateDeleteNodeBasePath }}scripts/deletenode-cli.sh | /bin/bash -s -- -s -g `yourResourceGroup` -u {{ armTemplateDeleteNodeBasePath }}arm/mainTemplate.json -p parameters.json
+```
+
+The script will validate the template with your parameters file; deploy the template to delete managed servers from WebLogic Server cluster; run Azure CLI commands to delete corresponding Azure resources.
+
+This is an example output of successful deployment, the {{ site.data.var.wlsFullBrandName }} is deployed with Application Gateway. Look for `Completed!` in your output.
+
+```bash
+{
+ "error": null,
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-07232/providers/Microsoft.Resources/deployments/mainTemplate",
+ "name": "mainTemplate",
+ "properties": {
+ "correlationId": "cbfaa443-3a72-4217-83e1-cc91485597fa",
+ "debugSetting": null,
+ "dependencies": [
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-07232/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "oraclevm-cluster-07232",
+ "resourceName": "adminVM/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-07232/providers/Microsoft.Resources/deployments/pid-4b263220-3cc6-53b9-aef3-23ad10c45d52",
+ "resourceGroup": "oraclevm-cluster-07232",
+ "resourceName": "pid-4b263220-3cc6-53b9-aef3-23ad10c45d52",
+ "resourceType": "Microsoft.Resources/deployments"
+ }
+ ],
+ "duration": "PT0S",
+ "mode": "Incremental",
+ "onErrorDeployment": null,
+ "outputs": null,
+ "parameters": {
+ "_artifactsLocation": {
+ "type": "String",
+ "value": "{{ armTemplateDeleteNodeBasePath }}"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "SecureString"
+ },
+ "adminVMName": {
+ "type": "String",
+ "value": "adminVM"
+ },
+ "deletingManagedServerMachineNames": {
+ "type": "Array",
+ "value": [
+ "mspVM2"
+ ]
+ },
+ "deletingManagedServerNames": {
+ "type": "Array",
+ "value": [
+ "msp2"
+ ]
+ },
+ "location": {
+ "type": "String",
+ "value": "eastus"
+ },
+ "wlsForceShutDown": {
+ "type": "String",
+ "value": "true"
+ },
+ "wlsPassword": {
+ "type": "SecureString"
+ },
+ "wlsUserName": {
+ "type": "String",
+ "value": "weblogic"
+ }
+ },
+ "parametersLink": null,
+ "providers": [
+ {
+ "id": null,
+ "namespace": "Microsoft.Resources",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ null
+ ],
+ "properties": null,
+ "resourceType": "deployments"
+ }
+ ]
+ },
+ {
+ "id": null,
+ "namespace": "Microsoft.Compute",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "virtualMachines/extensions"
+ }
+ ]
+ }
+ ],
+ "provisioningState": "Succeeded",
+ "template": null,
+ "templateHash": "3171958496378517565",
+ "templateLink": {
+ "contentVersion": "1.0.0.0",
+ "uri": "{{ armTemplateDeleteNodeBasePath }}arm/mainTemplate.json"
+ },
+ "timestamp": "2020-07-23T07:44:38.977624+00:00",
+ "validatedResources": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-07232/providers/Microsoft.Resources/deployments/pid-7d4ae6d6-17c5-5168-b7d2-e0bf33a1e878",
+ "resourceGroup": "oraclevm-cluster-07232"
+ },
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-07232/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "oraclevm-cluster-07232"
+ },
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-07232/providers/Microsoft.Resources/deployments/pid-4b263220-3cc6-53b9-aef3-23ad10c45d52",
+ "resourceGroup": "oraclevm-cluster-07232"
+ }
+ ]
+ },
+ "resourceGroup": "oraclevm-cluster-07232",
+ "type": "Microsoft.Resources/deployments"
+}
+Accepted: newuserscript (Microsoft.Compute/virtualMachines/extensions)
+Accepted: deletenode-1595490274 (Microsoft.Resources/deployments)
+Command ran in 102.719 seconds (init: 0.061, invoke: 102.658)
+Extension 'resource-graph' is already installed.
+List resource Ids to be deleted:
+/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-07232/providers/Microsoft.Compute/virtualMachines/mspVM2
+/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-07232/providers/Microsoft.Network/networkInterfaces/mspVM2_NIC
+/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-07232/providers/Microsoft.Network/publicIPAddresses/mspVM2_PublicIP
+/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/ORACLEVM-CLUSTER-07232/providers/Microsoft.Compute/disks/mspVM2_OsDisk_1_e6d8ffb0e73649a4a713acf5e6ca7099
+/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/ORACLEVM-CLUSTER-07232/providers/Microsoft.Compute/disks/mspVM2_lun_0_2_942609646fdc4e1dab06b23ffeee650f
+Are you sure to delete these resources (y/n)?Deleting managed resources...Please do not stop.
+[
+ null,
+ null,
+ null,
+ null,
+ null
+]
+Command ran in 112.375 seconds (init: 0.062, invoke: 112.313)
+Check if application gateway has deployed...
+Removing mspVM2 from application gateway, please do not stop.
+{
+ "backendAddresses": [
+ {
+ "fqdn": "mspVM1",
+ "ipAddress": null
+ },
+ {
+ "fqdn": "mspVM3",
+ "ipAddress": null
+ }
+ ],
+ "backendIpConfigurations": null,
+ "etag": "W/\"23399346-e17b-4f56-bda4-5e77c1d82195\"",
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-07232/providers/Microsoft.Network/applicationGateways/myAppGateway/backendAddressPools/myGatewayBackendPool",
+ "name": "myGatewayBackendPool",
+ "provisioningState": "Succeeded",
+ "resourceGroup": "oraclevm-cluster-07232",
+ "type": "Microsoft.Network/applicationGateways/backendAddressPools"
+}
+
+Complete!
+```
+
+### Advanced usage
+
+If you want to learn more about the script and run it manually, follow the advanced instructions to interact with the ternimal.
+
+ * Download the script
+
+ ```bash
+ $ curl -fsSL {{ armTemplateDeleteNodeBasePath }}scripts/deletenode-cli.sh
+ ```
+
+ You will get a shell script named `deletenode-cli.sh` in your current directory. Usage of the script:
+
+ ```bash
+ ./deletenode-cli.sh -h
+ usage: deletenode-cli.sh -g resource-group [-f template-file] [-u template-url] -p paramter-file [-h]
+ -g Azure Resource Group of the Vitural Machines that host deleting manages servers, must be specified.
+ -f Path of ARM template to delete nodes, must be specified -f option or -u option.
+ -u URL of ARM template, must be specified -f option or -u option.
+ -p Path of ARM parameter, must be specified.
+ -s Execute the script in silent mode. The script will input y automatically for the prompt.
+ -h Help
+ ```
+
+ You can not only run the script with a local template file by specifying `-f` option, but also with a templatle URL using `-u` option.
+
+ * Run the script
+
+ Run the script with your parameters file in your current directory. The following command runs with a template URL:
+
+ ```bash
+ ./deletenode-cli.sh -g yourResourceGroup -u {{ armTemplateDeleteNodeBasePath }}arm/mainTemplate.json -p parameters.json
+ ```
+
+ Before deleting any Azure resource, the script will prompt up message **Are you sure to delete these resources (y/n)?** to comfirm if you want to delete Azure resources. If you input `Y/y`, the Azure resources will be deleted. Otherwise, keep the resource and exit.
+
+ This is an example output of deployment that will not delete Azure resources from your resource group, the {{ site.data.var.wlsFullBrandName }} is deployed with Application Gateway. Look for `Completed!` in your output.
+
+ ```bash
+ {
+ "error": null,
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-07232/providers/Microsoft.Resources/deployments/mainTemplate",
+ "name": "mainTemplate",
+ "properties": {
+ "correlationId": "4b15b45b-fb1f-4def-ad32-d96201000ac1",
+ "debugSetting": null,
+ "dependencies": [
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-07232/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "oraclevm-cluster-07232",
+ "resourceName": "adminVM/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-07232/providers/Microsoft.Resources/deployments/pid-4b263220-3cc6-53b9-aef3-23ad10c45d52",
+ "resourceGroup": "oraclevm-cluster-07232",
+ "resourceName": "pid-4b263220-3cc6-53b9-aef3-23ad10c45d52",
+ "resourceType": "Microsoft.Resources/deployments"
+ }
+ ],
+ "duration": "PT0S",
+ "mode": "Incremental",
+ "onErrorDeployment": null,
+ "outputs": null,
+ "parameters": {
+ "_artifactsLocation": {
+ "type": "String",
+ "value": "{{ armTemplateDeleteNodeBasePath }}"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "SecureString"
+ },
+ "adminVMName": {
+ "type": "String",
+ "value": "adminVM"
+ },
+ "deletingManagedServerMachineNames": {
+ "type": "Array",
+ "value": [
+ "mspVM3"
+ ]
+ },
+ "deletingManagedServerNames": {
+ "type": "Array",
+ "value": [
+ "msp3"
+ ]
+ },
+ "location": {
+ "type": "String",
+ "value": "eastus"
+ },
+ "wlsForceShutDown": {
+ "type": "String",
+ "value": "true"
+ },
+ "wlsPassword": {
+ "type": "SecureString"
+ },
+ "wlsUserName": {
+ "type": "String",
+ "value": "weblogic"
+ }
+ },
+ "parametersLink": null,
+ "providers": [
+ {
+ "id": null,
+ "namespace": "Microsoft.Resources",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ null
+ ],
+ "properties": null,
+ "resourceType": "deployments"
+ }
+ ]
+ },
+ {
+ "id": null,
+ "namespace": "Microsoft.Compute",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "virtualMachines/extensions"
+ }
+ ]
+ }
+ ],
+ "provisioningState": "Succeeded",
+ "template": null,
+ "templateHash": "3171958496378517565",
+ "templateLink": {
+ "contentVersion": "1.0.0.0",
+ "uri": "{{ armTemplateDeleteNodeBasePath }}arm/mainTemplate.json"
+ },
+ "timestamp": "2020-07-24T04:17:38.500948+00:00",
+ "validatedResources": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-07232/providers/Microsoft.Resources/deployments/pid-7d4ae6d6-17c5-5168-b7d2-e0bf33a1e878",
+ "resourceGroup": "oraclevm-cluster-07232"
+ },
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-07232/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "oraclevm-cluster-07232"
+ },
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-07232/providers/Microsoft.Resources/deployments/pid-4b263220-3cc6-53b9-aef3-23ad10c45d52",
+ "resourceGroup": "oraclevm-cluster-07232"
+ }
+ ]
+ },
+ "resourceGroup": "oraclevm-cluster-07232",
+ "type": "Microsoft.Resources/deployments"
+}
+Succeeded: pid-7d4ae6d6-17c5-5168-b7d2-e0bf33a1e878 (Microsoft.Resources/deployments)
+Accepted: deletenode-1595564252 (Microsoft.Resources/deployments)
+Accepted: newuserscript (Microsoft.Compute/virtualMachines/extensions)
+Command ran in 102.182 seconds (init: 0.089, invoke: 102.092)
+Extension 'resource-graph' is already installed.
+List resource Ids to be deleted:
+/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-07232/providers/Microsoft.Compute/virtualMachines/mspVM3
+/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-07232/providers/Microsoft.Network/networkInterfaces/mspVM3_NIC
+/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-07232/providers/Microsoft.Network/publicIPAddresses/mspVM3_PublicIP
+/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/ORACLEVM-CLUSTER-07232/providers/Microsoft.Compute/disks/mspVM3_OsDisk_1_d5e69682dbff491e97b7a04eea3896eb
+/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/ORACLEVM-CLUSTER-07232/providers/Microsoft.Compute/disks/mspVM3_lun_0_2_f5bfbf93870f4ed3b1d90a8b953818e7
+Are you sure to delete these resources (y/n)?n
+Check if application gateway has deployed...
+Removing mspVM3 from application gateway, please do not stop.
+{
+ "backendAddresses": [
+ {
+ "fqdn": "mspVM1",
+ "ipAddress": null
+ }
+ ],
+ "backendIpConfigurations": null,
+ "etag": "W/\"b6f76f57-be98-406d-ac9c-d11035fd3b5b\"",
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-07232/providers/Microsoft.Network/applicationGateways/myAppGateway/backendAddressPools/myGatewayBackendPool",
+ "name": "myGatewayBackendPool",
+ "provisioningState": "Succeeded",
+ "resourceGroup": "oraclevm-cluster-07232",
+ "type": "Microsoft.Network/applicationGateways/backendAddressPools"
+}
+
+Complete!
+ ```
+
+## Verify
+
+### Verify if the managed servers are deleted from WebLogic Server instance.
+
+* Go to the {{ site.data.var.wlsFullBrandName }} Administration Console.
+* Go to **Environment** -> **Servers**.
+ You should see no server names that have been deleted listed in **Name** column.
+* Go to **Environment -> Machines**.
+ You should see logical machines that host the servers that have been deleted are removed.
+
+### Verify if the Azure resources are deleted
+
+* Go to [Azure Portal](https://ms.portal.azure.com/).
+* Go to resource group that the {{ site.data.var.wlsFullBrandName }} is deployed.
+ You should see corresponding Vitual Machines, Disks, Network Interfaces, Public IPs have been removed.
+
+ For example, I want to delete managed server `msp1`, corresponding Virtual Machine name is `mspVM1`, Azure resource names are:
+ * Virtual Machine: `mspVM1`
+ * Data Disk: `mspVM1_lun_0_2_9d41e2c965744665adb6965625c20d9a`
+ * OS Disk: `mspVM1_OsDisk_1_05a8d81f5d01419a97ee17a45f974dca`
+ * Network Interface: `mspVM1_NIC`
+ * Public IP: `mspVM1_PublicIP`
+
+ All of these resource should be deleted after the script finishes, unless you don't expect to delete them without specifying "Y/y" to the prompt.
diff --git a/cluster/elkNestedTemplate.md b/cluster/elkNestedTemplate.md
new file mode 100644
index 000000000..fd485693d
--- /dev/null
+++ b/cluster/elkNestedTemplate.md
@@ -0,0 +1,402 @@
+{% include variables.md %}
+
+# Land {{ site.data.var.wlsFullBrandName }} logs to Elasticsearch and Kibana
+
+This page documents how to configure an existing deployment of {{ site.data.var.wlsFullBrandName }} to land logs to Elasticsearch and Kibana using Azure CLI.
+
+## Prerequisites
+
+### Environment for Setup
+
+* [Azure CLI](https://docs.microsoft.com/en-us/cli/azure), use `az --version` to test if `az` works.
+
+### WebLogic Server Instance
+
+The ELK ARM template will be applied to an existing {{ site.data.var.wlsFullBrandName }} instance. If you don't have one, please create a new instance from the Azure portal, by following the link to the offer [in the index](index.md).
+
+### Virtual machine size requirement
+Ensure the virtual machines that have been deployed have at least **2.5GB** of memory. The default virtual machine size for WLS does not have enough memory. Use at least `Standard_A2_v2`.
+
+### Elasticsearch instance
+
+Refer to [Create an an Elastic on Azure instance](https://aka.ms/arm-oraclelinux-wls-elk#create-an-an-elastic-on-azure-instance)
+
+## Prepare the Parameters JSON file
+
+You must construct a parameters JSON file containing the parameters to the ELK ARM template. See [Create Resource Manager parameter file](https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/parameter-files) for background information about parameter files.
+
+We must specify the information of the existing {{ site.data.var.wlsFullBrandName }} and Elasticsearch instance. This section shows how to obtain the values for the following required properties.
+
+| Parameter Name | Explanation |
+|----------------|-------------|
+| `_artifactsLocation`| See below for details. |
+| `adminVMName`| Virtual machine name of which hosts the {{ site.data.var.wlsFullBrandName }} admin server. |
+| `elasticsearchEndpoint` | The Elasticsearch endpoint. |
+| `elasticsearchPassword` | Password of the Elasticsearch account. Used to distibute message with REST API to Elasticsearch instance. |
+| `elasticsearchUserName` | User name of the Elasticsearch account. |
+| `location` | Must be the same region into which the server was initially deployed. |
+| `logsToIntegrate` | Specify the WebLogic logs to export to Elasticsearch, you must select at least one log. |
+| `managedServerPrefix` | Must be the same prefix with which the cluster was initially deployed. |
+| `numberOfManagedApplicationInstances` | Number of VMs that have been deployed to host managed application server. |
+| `numberOfManagedCacheInstances` | Number of VMs that have been deployed to host managed cache server, please set the value if your cluster is Coherence cluster. |
+| `wlsDomainName` | Must be the same value provided at initial deployment time. |
+| `wlsPassword` | Must be the same value provided at initial deployment time. |
+| `wlsUserName` | Must be the same value provided at initial deployment time. |
+
+### `_artifactsLocation`
+
+This value must be the following.
+
+```bash
+{{ armTemplateBasePath }}
+```
+
+### Number of Managed application instances
+
+You can get the existing Managed application instances number with the following command using Azure CLI.
+
+```shell
+$ resourceGroup=
+$ managedServerPrefix=
+$ numberOfManagedApplicationInstances=$(az resource list -g ${resourceGroup} --resource-type Microsoft.Compute/virtualMachines --query [*].name | grep "${managedServerPrefix}VM[0-9]" | sed -e 's/[^0-9]/ /g' -e 's/^ *//g' -e 's/ *$//g' | tr -s ' ' | sed 's/ /\n/g' | sort -nr | head -n1)
+$ echo ${numberOfManagedApplicationInstances}
+```
+
+### Number of Managed cache instances
+
+This parameter works for Coherence cluster. If your cluster is not Coherence cluter, keep it with default value `0`.
+
+You can get the existing Managed cache instances number with the following command using Azure CLI. It should be `0` if no value returned.
+
+```shell
+$ resourceGroup=
+$ managedServerPrefix=
+$ numberOfManagedCacheInstances=$(az resource list -g ${resourceGroup} --resource-type Microsoft.Compute/virtualMachines --query [*].name | grep "${managedServerPrefix}StorageVM[0-9]" | sed -e 's/[^0-9]/ /g' -e 's/^ *//g' -e 's/ *$//g' | tr -s ' ' | sed 's/ /\n/g' | sort -nr | head -n1)
+$ echo ${numberOfManagedCacheInstances}
+```
+
+#### Example Parameters JSON
+
+Here is a fully filled out parameters file. We will leave values of `adminUsername`, `authenticationType`, `dnsLabelPrefix`, and `usePreviewImage` as default value.
+
+{{ site.data.var.passwordInFileNote }}
+
+
+```json
+{
+ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "_artifactsLocation": {
+ "value": "{{ armTemplateBasePath }}"
+ },
+ "adminVMName": {
+ "value": "adminVM"
+ },
+ "elasticsearchEndpoint": {
+ "value": "https://example.eastus2.azure.elastic-cloud.com:9243"
+ },
+ "elasticsearchPassword": {
+ "value": "wlkpsw"
+ },
+ "elasticsearchUserName": {
+ "value": "elastic"
+ },
+ "location": {
+ "value": "eastus"
+ },
+ "managedServerPrefix": {
+ "value": "msp"
+ },
+ "numberOfManagedApplicationInstances": {
+ "value": 2
+ },
+ "numberOfManagedCacheInstances": {
+ "value": 0
+ },
+ "wlsDomainName": {
+ "value": "wlsd"
+ },
+ "wlsPassword": {
+ "value": "welcome1"
+ },
+ "wlsUserName": {
+ "value": "weblogic"
+ }
+ }
+}
+```
+
+## Invoke the ARM template
+
+Assume your parameters file is available in the current directory and is named `parameters.json`. This section shows the commands to configure your {{ site.data.var.wlsFullBrandName }} deployment to connect to Elasticsearch and Kinaba intance. Replace `yourResourceGroup` with the Azure resource group in which the {{ site.data.var.wlsFullBrandName }} is deployed.
+
+### First, validate your parameters file
+
+The `az group deployment validate` command is very useful to validate your parameters file is syntactically correct.
+
+```bash
+az deployment group validate --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateBasePath }}nestedtemplates/elkNestedTemplate.json
+```
+
+If the command returns with an exit status other than `0`, inspect the output and resolve the problem before proceeding. You can check the exit status by executing the commad `echo $?` immediately after the `az` command.
+
+### Next, execute the template
+
+After successfully validating the template invocation, change `validate` to `create` to invoke the template.
+
+```bash
+az deployment group create --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateBasePath }}nestedtemplates/elkNestedTemplate.json
+```
+
+As with the validate command, if the command returns with an exit status other than `0`, inspect the output and resolve the problem.
+
+This is an example output of successful deployment. Look for `"provisioningState": "Succeeded"` in your output.
+
+```json
+{
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Resources/deployments/elkNestedTemplate",
+ "location": null,
+ "name": "elkNestedTemplate",
+ "properties": {
+ "correlationId": "61a46b43-27d0-4478-baba-c288059892d5",
+ "debugSetting": null,
+ "dependencies": [
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Compute/virtualMachines/mspVM1/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-elk",
+ "resourceName": "mspVM1/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ },
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Compute/virtualMachines/mspVM2/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-elk",
+ "resourceName": "mspVM2/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ },
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Compute/virtualMachines/mspStorageVM1/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-elk",
+ "resourceName": "mspStorageVM1/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Resources/deployments/pid-e4165284-b017-5df9-9b91-3f11dd8a72e5",
+ "resourceGroup": "haiche-cluster-elk",
+ "resourceName": "pid-e4165284-b017-5df9-9b91-3f11dd8a72e5",
+ "resourceType": "Microsoft.Resources/deployments"
+ },
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-elk",
+ "resourceName": "adminVM/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Compute/virtualMachines/mspVM1/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-elk",
+ "resourceName": "mspVM1/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ },
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-elk",
+ "resourceName": "adminVM/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Compute/virtualMachines/mspVM2/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-elk",
+ "resourceName": "mspVM2/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ },
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-elk",
+ "resourceName": "adminVM/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Compute/virtualMachines/mspStorageVM1/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-elk",
+ "resourceName": "mspStorageVM1/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "duration": "PT8M54.4785762S",
+ "mode": "Incremental",
+ "onErrorDeployment": null,
+ "outputResources": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-elk"
+ },
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Compute/virtualMachines/mspStorageVM1/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-elk"
+ },
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Compute/virtualMachines/mspVM1/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-elk"
+ },
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Compute/virtualMachines/mspVM2/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-elk"
+ }
+ ],
+ "outputs": {
+ "artifactsLocationPassedIn": {
+ "type": "String",
+ "value": "{{ armTemplateBasePath }}"
+ },
+ "logIndex": {
+ "type": "String",
+ "value": "azure-weblogic-cluster-b4e465d5-6ffc-49cf-b1d9-b4dbf6455d0a"
+ }
+ },
+ "parameters": {
+ "_artifactsLocation": {
+ "type": "String",
+ "value": "{{ armTemplateBasePath }}"
+ },
+ "_artifactsLocationELKTemplate": {
+ "type": "String",
+ "value": "{{ armTemplateBasePath }}"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "SecureString"
+ },
+ "adminVMName": {
+ "type": "String",
+ "value": "adminVM"
+ },
+ "elasticsearchEndpoint": {
+ "type": "String",
+ "value": "https://example.eastus2.azure.elastic-cloud.com:9243"
+ },
+ "elasticsearchPassword": {
+ "type": "SecureString"
+ },
+ "elasticsearchUserName": {
+ "type": "String",
+ "value": "elastic"
+ },
+ "guidValue": {
+ "type": "String",
+ "value": "b4e465d5-6ffc-49cf-b1d9-b4dbf6455d0a"
+ },
+ "location": {
+ "type": "String",
+ "value": "eastus"
+ },
+ "logsToIntegrate": {
+ "type": "Array",
+ "value": [
+ "HTTPAccessLog",
+ "ServerLog",
+ "DomainLog",
+ "DataSourceLog",
+ "StandardErrorAndOutput",
+ "NodeManagerLog"
+ ]
+ },
+ "managedServerPrefix": {
+ "type": "String",
+ "value": "msp"
+ },
+ "numberOfManagedApplicationInstances": {
+ "type": "Int",
+ "value": 2
+ },
+ "numberOfManagedCacheInstances": {
+ "type": "Int",
+ "value": 1
+ },
+ "wlsDomainName": {
+ "type": "String",
+ "value": "wlsd"
+ },
+ "wlsPassword": {
+ "type": "SecureString"
+ },
+ "wlsUserName": {
+ "type": "String",
+ "value": "weblogic"
+ }
+ },
+ "parametersLink": null,
+ "providers": [
+ {
+ "id": null,
+ "namespace": "Microsoft.Resources",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ null
+ ],
+ "properties": null,
+ "resourceType": "deployments"
+ }
+ ]
+ },
+ {
+ "id": null,
+ "namespace": "Microsoft.Compute",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "virtualMachines/extensions"
+ }
+ ]
+ }
+ ],
+ "provisioningState": "Succeeded",
+ "template": null,
+ "templateHash": "10060935779116645392",
+ "templateLink": null,
+ "timestamp": "2020-11-11T07:29:42.336797+00:00"
+ },
+ "resourceGroup": "haiche-cluster-elk",
+ "type": "Microsoft.Resources/deployments"
+}
+```
+
+## Verify ELK connection
+
+Follow the steps to check if WebLogic Server logs are exported to Elasticsearch.
+
+* Go to Azure portal
+* Copy log index from your resource group -> deployments -> elkNestedTemplate -> output -> logIndex .
+* Go to Elasticsearch cloud and launch Kibana.
+* Create index
+ * Go to Kibana -> Management -> Kibana -> Index Patterns
+ * Click `Create index Patterns`
+ * Input the log index you copy from output in Index pattern
+ * There should be an index you can select, otherwise, the ELK deployment failed
+ * Next step
+ * Select `@timestamp` in Time Filter and hit `Create index pattern`
+* View logs
+ * Go to Kibana -> Discover
+ * Select the index you just created
+ * You will find the WebLogic Server logs listed
diff --git a/cluster/index.md b/cluster/index.md
new file mode 100644
index 000000000..4f20c5bda
--- /dev/null
+++ b/cluster/index.md
@@ -0,0 +1,25 @@
+# {{ site.data.var.wlsFullBrandName }} Cluster
+
+{% include sub-template-01.md %}
+
+Templates available for working with [{{ site.data.var.wlsFullBrandName }} Cluster](https://portal.azure.com/#create/oracle.20191007-arm-oraclelinux-wls-cluster20191007-arm-oraclelinux-wls-cluster):
+
+* [Add Managed application servers](addnode.md)
+
+* [Add Managed Coherence cache servers](addnode-coherence.md)
+
+* [Configure a database connection](dbTemplate.md)
+
+* [Configure Azure Active Directory](aadNestedTemplate.md)
+
+* [Configure Azure Application Gateway](appGatewayNestedTemplate.md)
+
+* [Configure Coherence cluster](coherenceTemplate.md)
+
+* [Configure custom DNS alias](customDNSTemplate.md)
+
+* [Configure Elasticsearch and Kibana](elkNestedTemplate.md)
+
+* [Configure Azure Network Security Group rules](nsgRulesTemplate.md)
+
+* [Delete nodes](deletenode.md)
\ No newline at end of file
diff --git a/cluster/nsgRulesTemplate.md b/cluster/nsgRulesTemplate.md
new file mode 100644
index 000000000..510330b3b
--- /dev/null
+++ b/cluster/nsgRulesTemplate.md
@@ -0,0 +1,81 @@
+{% include variables.md %}
+
+# Apply Azure Network Security Rule ARM Template to {{ site.data.var.wlsFullBrandName }}
+
+This page documents how to append addtional security rules to an existing Azure Network Security Group deployed with {{ site.data.var.wlsFullBrandName }} using the Azure CLI.
+
+## Prerequisies
+
+### Environment for Setup
+
+* [Azure CLI](https://docs.microsoft.com/en-us/cli/azure), use `az --version` to test if `az` works.
+
+### Azure Network Security Group
+
+The Azure Network Security Rule ARM template will be applied to an existing Azure Network Security Group (NSG) instance. If you don't have one, please create a new instance from the Azure portal, by following the link to the offer [in the index](index.md).
+
+### Prepare the Parameters JSON file
+
+You must construct a parameter JSON file containing the parameters to the NSG template. See [Create Resource Manager parameter file](https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/parameter-files) for background information about parameter files. The options to this template declare the desired configuration of the NSG.
+
+| Parameter Name | Description |
+| `denyPublicTrafficForAdminServer` | Deny public tranffic for the admin server on port 7001, 7002. |
+| `denyPublicTrafficForManagedServer` | Deny public tranffic for the managed servers on port 8001. |
+| `enableAppGateway` | We deal with the configuration for managed servers when the Application Gateway is enabled. |
+| `networkSecurityGroupName` | The name of the NSG. |
+
+#### Example Parameters JSON file
+
+Here is a fully filled out parameters file, assuming the {{ site.data.var.wlsFullBrandName }} was deployed accepting the default values.
+
+```json
+{
+ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "denyPublicTrafficForManagedServer": {
+ "value": true
+ },
+ "denyPublicTrafficForAdminServer": {
+ "value": false
+ },
+ "enableAppGateway": {
+ "value": true
+ },
+ "networkSecurityGroupName": {
+ "value": "wls-nsg"
+ }
+ }
+}
+```
+
+## Invoke the ARM template
+
+This section shows how to kick off the deployment step-by-step. After the deployment, your existing NSG will append two additional Inbound Rules for admin and managed servers. Here we assume you have the parameter file in the current directory, the file is named `parameters.json`, and your NSG is named `wls-nsg`. Don't forget to replace `yourResourceGroup` with the Azure resource group in which the NSG is created.
+
+### First, validate your parameters file
+
+The `az group deployment validate` command is very useful to validate your parameters file is syntactically correct.
+
+```bash
+az group deployment validate --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateBasePath }}nestedtemplates/nsgNestedTemplate.json
+```
+
+If the command returns with an exit status other than `0`, inspect the output and resolve the problem before proceeding. You can check the exit status by executing the commad `echo $?` immediately after the `az` command.
+
+### Next, execute the template with it
+
+After successfully validating the template invocation, change `validate` to `create` to invoke the template.
+
+```bash
+az group deployment create --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateBasePath }}nestedtemplates/nsgNestedTemplate.json
+```
+
+## Verify the rules have been appended to the Azure Network Security Group successfully
+
+When the deployment is completed, you can verify the appended rules via Azure Portal
+* Visit the Azure Network Security Group under your resource group used above.
+* Go to `Settings -> Inbound security rules`.
+* Verify there is a rule named `WebLogicAdminPortsAllowed` with **Priority = '210'; Port = '7001, 7002'; Protocol = 'TCP'; Source = '10.0.0.0/24'; Aciton = 'Allow'**.
+* Verify there is a rule named `WebLogicManagedPortsDenied` with **Priority = '221'; Port = '8001'; Protocol = '*'; Aciton = 'Deny'**.
+
diff --git a/dynamic-cluster/aadNestedTemplate.md b/dynamic-cluster/aadNestedTemplate.md
new file mode 100644
index 000000000..b4a6c5c27
--- /dev/null
+++ b/dynamic-cluster/aadNestedTemplate.md
@@ -0,0 +1,310 @@
+{% include variables.md %}
+
+# Apply Azure Active Directory ARM Template to {{ site.data.var.wlsFullBrandName }}
+
+This page documents how to configure an existing deployment of {{ site.data.var.wlsFullBrandName }} with an existing Azure Active Directory Domain Service (AAD DS) using Azure CLI.
+
+## Prerequisites
+
+### Environment for Setup
+
+* [Azure CLI](https://docs.microsoft.com/en-us/cli/azure), use `az --version` to test if `az` works.
+
+### WebLogic Server Instance
+
+The AAD ARM template will be applied to an existing {{ site.data.var.wlsFullBrandName }} instance. If you don't have one, please create a new instance from the Azure portal, by following the link to the offer [in the index](index.md).
+
+### Azure Active Directory LDAP Instance
+
+To apply AAD to {{ site.data.var.wlsFullBrandName }}, you must have an existing Azure Active Directory LDAP instance to use. If you don't have AAD LADP instance, please follow the steps in the tutorial [Configure secure LDAP for an Azure Active Directory Domain Services managed domain](https://docs.microsoft.com/en-us/azure/active-directory-domain-services/tutorial-configure-ldaps).
+
+## Prepare the Parameters JSON file
+
+You must construct a parameters JSON file containing the parameters to the AAD ARM template. See [Create Resource Manager parameter file](https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/parameter-files) for background information about parameter files. We must specify the information of the existing {{ site.data.var.wlsFullBrandName }} and AAD instance. This section shows how to obtain the values for the following required properties.
+
+| Parameter Name | Explanation |
+|----------------|-------------|
+| `_artifactsLocation`| See below for details. |
+| `aadsPortNumber` | (optional) The LDAP port number, defaults to 636. |
+| `aadsPublicIP` | The IP address of the LDAP server |
+| `aadsServerHost` | The hostname of the Active Directory Domain Services server. |
+| `adminVMName`| At deployment time, if this value was changed from its default value, the value used at deployment time must be used. Otherwise, this parameter should be omitted. |
+| `dynamicClusterSize` | Size of the dynamic cluster. |
+| `location` | Must be the same region into which the server was initially deployed. |
+| `managedServerPrefix` | Must be the same managed server prefix with that in initial deployed. |
+| `wlsDomainName` | The name of the {{ site.data.var.wlsFullBrandName }} domain. |
+| `wlsLDAPGroupBaseDN` | The base distinguished name (DN) of the tree in the LDAP directory that contains groups. |
+| `wlsLDAPPrincipalPassword` | The credential (usually a password) used to connect to the LDAP server. |
+| `wlsLDAPPrincipal` | The Distinguished Name (DN) of the LDAP user that {{ site.data.var.wlsFullBrandName }} should use to connect to the LDAP server. |
+| `wlsLDAPProviderName` | (optional) The value used for creating authentication provider name of WebLogic Server. |
+| `wlsLDAPSSLCertificate` | Client certificate that will be imported to trust store of SSL. |
+| `wlsLDAPSSLCertificate` | See below for details. |
+| `wlsLDAPUserBaseDN` | The base distinguished name (DN) of the tree in the LDAP directory that contains users. |
+| `wlsPassword` | Must be the same value provided at deployment time. |
+| `wlsUserName` | Must be the same value provided at deployment time. |
+
+### `_artifactsLocation`
+
+This value must be the following.
+
+```bash
+{{ armTemplateBasePath }}
+```
+
+### `wlsLDAPSSLCertificate`
+
+Use base64 to encode your existing SSL certificate.
+
+```bash
+base64 your-certificate.cer -w 0 >temp.txt
+```
+
+Use the content as this file as the value of the `wlsLDAPSSLCertificate` parameter.
+
+### `dynamicClusterSize`
+
+Size of the dynamic cluster, it should equal to numbers of Virtual Machines that have names starting with `msp`.
+
+#### Example Parameters JSON
+
+Here is a fully filled out parameters file. Note that we did not include values for parameters that have a default value. Pay attention to the value of `dynamicClusterSize`.
+
+{{ site.data.var.passwordInFileNote }}
+
+```json
+{
+ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "_artifactsLocation": {
+ "value": "{{ armTemplateBasePath }}"
+ },
+ "aadsPublicIP": {
+ "value": "1.2.3.4"
+ },
+ "aadsServerHost": {
+ "value": "ladps.fabrikam.com"
+ },
+ "location": {
+ "value": "eastus"
+ },
+ "wlsDomainName": {
+ "value": "wlsd"
+ },
+ "wlsLDAPGroupBaseDN": {
+ "value": "OU=AADDC Users,DC=fabrikam,DC=com"
+ },
+ "wlsLDAPPrincipal": {
+ "value": "CN=WLSTest,OU=AADDC Users,DC=fabrikam,DC=com"
+ },
+ "wlsLDAPPrincipalPassword": {
+ "value": "Secret123!"
+ },
+ "wlsLDAPSSLCertificate": {
+ "value": "MIIKQQIBAz....EkAgIIAA=="
+ },
+ "wlsLDAPUserBaseDN": {
+ "value": "OU=AADDC Users,DC=fabrikam,DC=com"
+ },
+ "wlsPassword": {
+ "value": "welcome1"
+ },
+ "wlsUserName": {
+ "value": "weblogic"
+ }
+ }
+}
+```
+
+## Invoke the ARM template
+
+Assume your parameters file is available in the current directory and is named `parameters.json`. This section shows the commands to configure your {{ site.data.var.wlsFullBrandName }} deployment with the specified AAD. Replace `yourResourceGroup` with the Azure resource group in which the {{ site.data.var.wlsFullBrandName }} is deployed.
+
+### First, validate your parameters file
+
+The `az group deployment validate` command is very useful to validate your parameters file is syntactically correct.
+
+```bash
+az group deployment validate --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateBasePath }}nestedtemplates/aadNestedTemplate.json
+```
+
+If the command returns with an exit status other than `0`, inspect the output and resolve the problem before proceeding. You can check the exit status by executing the commad `echo $?` immediately after the `az` command.
+
+### Next, execute the template
+
+After successfully validating the template invocation, change `validate` to `create` to invoke the template.
+
+```bash
+az group deployment create --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateBasePath }}nestedtemplates/aadNestedTemplate.json
+```
+
+As with the validate command, if the command returns with an exit status other than `0`, inspect the output and resolve the problem.
+
+This is an example output of successful deployment. Look for `"provisioningState": "Succeeded"` in your output.
+
+```json
+{
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-admin-06082/providers/Microsoft.Resources/deployments/cli",
+ "location": null,
+ "name": "cli",
+ "properties": {
+ "correlationId": "6d98e1c8-0778-4fa5-a30a-8f10bbbb6818",
+ "debugSetting": null,
+ "dependencies": [
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-admin-06082/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "oraclevm-admin-06082",
+ "resourceName": "adminVM/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-admin-06082/providers/Microsoft.Resources/deployments/pid-8295df19-fe6b-5745-ad24-51ef66522b24",
+ "resourceGroup": "oraclevm-admin-06082",
+ "resourceName": "pid-8295df19-fe6b-5745-ad24-51ef66522b24",
+ "resourceType": "Microsoft.Resources/deployments"
+ }
+ ],
+ "duration": "PT2M59.6052694S",
+ "mode": "Incremental",
+ "onErrorDeployment": null,
+ "outputResources": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-admin-06082/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "oraclevm-admin-06082"
+ }
+ ],
+ "outputs": {
+ "artifactsLocationPassedIn": {
+ "type": "String",
+ "value": "https://raw.githubusercontent.com/galiacheng/arm-oraclelinux-wls-admin/deploy/src/main/arm/"
+ }
+ },
+ "parameters": {
+ "_artifactsLocation": {
+ "type": "String",
+ "value": "https://raw.githubusercontent.com/galiacheng/arm-oraclelinux-wls-admin/deploy/src/main/arm/"
+ },
+ "_artifactsLocationAADTemplate": {
+ "type": "String",
+ "value": "https://raw.githubusercontent.com/galiacheng/arm-oraclelinux-wls-admin/deploy/src/main/arm/"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "SecureString"
+ },
+ "aadsPortNumber": {
+ "type": "String",
+ "value": "636"
+ },
+ "aadsPublicIP": {
+ "type": "String",
+ "value": "40.76.11.111"
+ },
+ "aadsServerHost": {
+ "type": "String",
+ "value": "ladps.wls-security.com"
+ },
+ "adminVMName": {
+ "type": "String",
+ "value": "adminVM"
+ },
+ "location": {
+ "type": "String",
+ "value": "eastus"
+ },
+ "wlsDomainName": {
+ "type": "String",
+ "value": "adminDomain"
+ },
+ "wlsLDAPGroupBaseDN": {
+ "type": "String",
+ "value": "OU=AADDC Users,DC=wls-security,DC=com"
+ },
+ "wlsLDAPPrincipal": {
+ "type": "String",
+ "value": "CN=WLSTest,OU=AADDC Users,DC=wls-security,DC=com"
+ },
+ "wlsLDAPPrincipalPassword": {
+ "type": "SecureString"
+ },
+ "wlsLDAPProviderName": {
+ "type": "String",
+ "value": "AzureActiveDirectoryProvider"
+ },
+ "wlsLDAPSSLCertificate": {
+ "type": "String",
+ "value": "LS0tLS1...LQ0K"
+ },
+ "wlsLDAPUserBaseDN": {
+ "type": "String",
+ "value": "OU=AADDC Users,DC=wls-security,DC=com"
+ },
+ "wlsPassword": {
+ "type": "SecureString"
+ },
+ "wlsUserName": {
+ "type": "String",
+ "value": "weblogic"
+ }
+ },
+ "parametersLink": null,
+ "providers": [
+ {
+ "id": null,
+ "namespace": "Microsoft.Resources",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ null
+ ],
+ "properties": null,
+ "resourceType": "deployments"
+ }
+ ]
+ },
+ {
+ "id": null,
+ "namespace": "Microsoft.Compute",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "virtualMachines/extensions"
+ }
+ ]
+ }
+ ],
+ "provisioningState": "Succeeded",
+ "template": null,
+ "templateHash": "2818584196763146470",
+ "templateLink": null,
+ "timestamp": "2020-06-09T07:07:03.444046+00:00"
+ },
+ "resourceGroup": "oraclevm-admin-06082",
+ "type": "Microsoft.Resources/deployments"
+}
+
+```
+
+## Verify AAD Integration
+
+Follow the steps to check if AAD is enabled.
+
+* Visit the {{ site.data.var.wlsFullBrandName }} Admin console.
+* In the left navigator, expand the tree to select **Security Realms** -> **myrealm** -> **Providers**.
+* If the integration was successful, you will find the AAD provider for example `AzureActiveDirectoryProvider`.
+* In the left navigator, expand the tree to select **Security Realms** -> **myrealm** -> **Users and Groups**.
+* If the integration was successful, you will find users from the AAD provider.
diff --git a/dynamic-cluster/addnode-coherence.md b/dynamic-cluster/addnode-coherence.md
new file mode 100644
index 000000000..2c601d597
--- /dev/null
+++ b/dynamic-cluster/addnode-coherence.md
@@ -0,0 +1,572 @@
+{% include variables.md %}
+
+# Add cache managed server to {{ site.data.var.wlsFullBrandName }} Coherence cluster
+
+This page documents how to configure an existing deployment of {{ site.data.var.wlsFullBrandName }} to add new managed cache server using Azure CLI.
+
+## Prerequisites
+
+### Environment for Setup
+
+* [Azure CLI](https://docs.microsoft.com/en-us/cli/azure), use `az --version` to test if `az` works.
+
+### WebLogic Server Instance
+
+The `addnode-coherence.json` template will be applied to an existing {{ site.data.var.wlsFullBrandName }} **Coherence** cluster. If you don't have one, please create a new instance from the Azure portal, by following the link to the offer [in the index](index.md).
+
+### Coherence cluster
+
+You can configure Coherence cluster from Azure portal or running Coherence sub template.
+
+* Configure Coherence cluster from Azure portal
+
+ Select `yes` in Coherence section and input required settings, the Azure WebLogic IaaS offer will configure a Coherence cluster automatically.
+
+* Configure Coherence cluster via Coherence sub template
+
+ Refer to [Configure Coherence cluster](coherenceTemplate.html).
+
+## Prepare the Parameters JSON file
+
+You must construct a parameters JSON file containing the parameters to `addnode-coherence.json` template. See [Create Resource Manager parameter file](https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/parameter-files) for background information about parameter files. You must specify the information of the existing {{ site.data.var.wlsFullBrandName }} and nodes that to be added. This section shows how to obtain the values for the following required properties.
+
+
+
+
Parameter Name
+
Explanation
+
+
+
_artifactsLocation
+
See below for details.
+
+
+
elkSettings
+
Optional. JSON object type. You can specify this parameters for Elasticsearch and Kibana(ELK) connection. If enable is true, must specify other properties. See the page WebLogic with Elastic on Azure for further information.
+
+
+
+
enable
+
If enable is true, must specify all properties of the elkSettings.
+
+
+
+
elasticsearchEndpoint
+
Endpoint of the Elasticsearch instance.
+
+
+
+
elasticsearchPassword
+
Password for Elasticsearch account.
+
+
+
+
elasticsearchUserName
+
User name for Elasticsearch account.
+
+
+
+
logIndex
+
Must be the same value output at ELK deployment time.
+
+
+
+
logsToIntegrate
+
Array with string value. Specify the expeted logs to integrate, you must input at least one log.
+
+
+
adminPasswordOrKey
+
Password of administration account for the new Virtual Machine that host new nodes.
+
+
+
adminVMName
+
Virtual machine name of which hosts the {{ site.data.var.wlsFullBrandName }} admin server, for example: adminVM.
+
+
enableCoherenceWebLocalStorage
+
Specifies whether Local Storage is enabled for the Coherence*Web cluster tier.
+
+
+
location
+
Must be the same region into which the server was initially deployed.
+
+
+
managedServerPrefix
+
Must be the same prefix with which the cluster was initially deployed.
+
+
+
numberOfExistingCacheNodes
+
Number of existing Coherence cache servers, used to name new virtual machines and new managed server.
+
+
+
numberOfNewCacheNodes
+
Number of new Coherence cahce servers, used to create Virtual Machines and Managed Server.
+
+
+
skuUrnVersion
+
Must be the same urn with which the cluster was initially deployed.
+
+
+
storageAccountName
+
The name of an existing storage account.
+
+
+
vmSizeSelectForCoherence
+
Select appropriate VM Size for Coherence cache servers.
+
+
+
wlsDomainName
+
Must be the same value provided at deployment time.
+
+
+
wlsPassword
+
Must be the same value provided at deployment time.
+
+
+
wlsUserName
+
Must be the same value provided at deployment time.
+
+
+
+### `_artifactsLocation`
+
+This value must be the following.
+
+```bash
+{{ armTemplateAddCacheNodeBasePath }}
+```
+
+### Existing cache nodes
+To differentiate functionality of managed cache servers, we use **managed application server** to represent managed servers that host Java EE application, and use **managed cache server** to represent managed servers that used for cache.
+
+You can get the existing managed cache servers with the following command:
+
+```shell
+$ resourceGroup=
+$ managedServerPrefix=
+$ numberOfExistingCacheNodes=$(az resource list -g ${resourceGroup} --resource-type Microsoft.Compute/virtualMachines --query [*].name | grep "${managedServerPrefix}StorageVM[0-9]" | sed -e 's/[^0-9]/ /g' -e 's/^ *//g' -e 's/ *$//g' | tr -s ' ' | sed 's/ /\n/g' | sort -nr | head -n1)
+$ echo ${numberOfExistingCacheNodes}
+```
+
+### Log index
+
+If you configured ELK in your cluster to export WebLogic Server logs to ELK, please input the value of Kibana log index, this template will set up ELK connection and export logs to specified index.
+
+You can get the value from Azure portal with the following steps:
+
+* Go to Azure portal.
+* Open you resource group and click **Deployments**.
+* Open the ELK deployment, and click **Output**.
+* Copy the value of `logIndex`.
+
+Alternatively, use Azure CLI command to list log index inside the resource group deployments:
+
+```shell
+$ az deployment group list -g 'yourResourceGroup' --query [*].properties.outputs.logIndex.value
+[
+ "azure-weblogic-cluster-f984df74-ab4d-4c17-a532-7f248659fb28"
+]
+```
+
+### Storage account
+
+Each Storage Account handles up to 20,000 IOPS, and 500TB of data. If you use a storage account for Standard Virtual Machines, you can store until 40 virtual disks.
+
+We have two disks for one Virtual Machine, it's suggested no more than 20 Virtual Machines share the same storage account. Number of virtual machines that hosting managed servers should be less than or equal to 20.
+
+You can get the name of storage account from Azure portal with steps:
+
+ * Go to Azure portal
+ * Go to the your resource group
+ * Find storage account resource and copy its name
+
+Alternatively, use Azure CLI command to list storage account inside a resource group:
+
+```shell
+$ az resource list -g 'yourResourceGroup' --resource-type Microsoft.Storage/storageAccounts --query [*].name
+[
+ "219846olvm"
+]
+```
+
+#### Example Parameters JSON
+
+Here is a fully filled out parameters file. We will leave values of `adminUsername`, `authenticationType`, `dnsLabelPrefix`, `usePreviewImage` and `vmSizeSelectForCoherence` as default value.
+
+{{ site.data.var.passwordInFileNote }}
+
+```json
+{
+ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "_artifactsLocation": {
+ "value": "{{ armTemplateAddCacheNodeBasePath }}"
+ },
+ "adminPasswordOrKey": {
+ "value": "jyfRat@nht2019"
+ },
+ "adminVMName": {
+ "value": "adminVM"
+ },
+ "elkSettings": {
+ "value": {
+ "enable": true,
+ "elasticsearchEndpoint":"https://example.eastus2.azure.elastic-cloud.com:9243",
+ "elasticsearchPassword": "Secret123!",
+ "elasticsearchUserName":"elastic",
+ "logIndex": "azure-weblogic-dynamic-cluster-11122020",
+ "logsToIntegrate": ["HTTPAccessLog", "ServerLog", "DomainLog", "DataSourceLog", "StandardErrorAndOutput", "NodeManagerLog"]
+ }
+ },
+ "enableCoherenceWebLocalStorage": {
+ "value": true
+ },
+ "location": {
+ "value": "eastus"
+ },
+ "managedServerPrefix": {
+ "value": "msp"
+ },
+ "numberOfExistingCacheNodes": {
+ "value": 1
+ },
+ "numberOfNewCacheNodes": {
+ "value": 1
+ },
+ "skuUrnVersion": {
+ "value": "owls-122140-8u251-ol76;Oracle:weblogic-122140-jdk8u251-ol76:owls-122140-8u251-ol7;latest"
+ },
+ "storageAccountName": {
+ "value": "d40140olvm"
+ },
+ "wlsDomainName": {
+ "value": "wlsd"
+ },
+ "wlsPassword": {
+ "value": "welcome1"
+ },
+ "wlsUserName": {
+ "value": "weblogic"
+ }
+ }
+}
+```
+
+## Invoke the ARM template
+
+Assume your parameters file is available in the current directory and is named `parameters.json`. This section shows the commands to configure your {{ site.data.var.wlsFullBrandName }} deployment to add new nodes. Replace `yourResourceGroup` with the Azure resource group in which the {{ site.data.var.wlsFullBrandName }} is deployed.
+
+### First, validate your parameters file
+
+The `az deployment group validate` command is very useful to validate your parameters file is syntactically correct.
+
+```bash
+az deployment group validate --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateAddCacheNodeBasePath }}arm/mainTemplate.json
+```
+
+If the command returns with an exit status other than `0`, inspect the output and resolve the problem before proceeding. You can check the exit status by executing the commad `echo $?` immediately after the `az` command.
+
+### Next, execute the template
+
+After successfully validating the template invocation, change `validate` to `create` to invoke the template.
+
+```bash
+az deployment group create --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateAddCacheNodeBasePath }}arm/mainTemplate.json
+```
+
+As with the validate command, if the command returns with an exit status other than `0`, inspect the output and resolve the problem.
+
+This is an example output of successful deployment. Look for `"provisioningState": "Succeeded"` in your output.
+
+```bash
+{
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Resources/deployments/mainTemplate",
+ "location": null,
+ "name": "mainTemplate",
+ "properties": {
+ "correlationId": "19040fc8-2b74-4e64-9dd9-59a5a3ce401a",
+ "debugSetting": null,
+ "dependencies": [
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Compute/virtualMachines/mspStorageVM2/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "mspStorageVM2/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Resources/deployments/pid-157ea8ac-12ae-11eb-adc1-0242ac120002",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "pid-157ea8ac-12ae-11eb-adc1-0242ac120002",
+ "resourceType": "Microsoft.Resources/deployments"
+ },
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Network/publicIPAddresses/mspStorageVM2_PublicIP",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "mspStorageVM2_PublicIP",
+ "resourceType": "Microsoft.Network/publicIPAddresses"
+ }
+ ],
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Network/networkInterfaces/mspStorageVM2_NIC",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "mspStorageVM2_NIC",
+ "resourceType": "Microsoft.Network/networkInterfaces"
+ },
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Network/networkInterfaces/mspStorageVM2_NIC",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "mspStorageVM2_NIC",
+ "resourceType": "Microsoft.Network/networkInterfaces"
+ },
+ {
+ "apiVersion": "2019-06-01",
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Storage/storageAccounts/33f2e3olvm",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "33f2e3olvm",
+ "resourceType": "Microsoft.Storage/storageAccounts"
+ }
+ ],
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Compute/virtualMachines/mspStorageVM2",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "mspStorageVM2",
+ "resourceType": "Microsoft.Compute/virtualMachines"
+ },
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Compute/virtualMachines/mspStorageVM2",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "mspStorageVM2",
+ "resourceType": "Microsoft.Compute/virtualMachines"
+ },
+ {
+ "actionName": "listKeys",
+ "apiVersion": "2019-04-01",
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Storage/storageAccounts/33f2e3olvm",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "33f2e3olvm",
+ "resourceType": "Microsoft.Storage/storageAccounts"
+ }
+ ],
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Compute/virtualMachines/mspStorageVM2/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "mspStorageVM2/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "duration": "PT10M24.4018847S",
+ "mode": "Incremental",
+ "onErrorDeployment": null,
+ "outputResources": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Compute/virtualMachines/mspStorageVM2",
+ "resourceGroup": "haiche-cluster-1106"
+ },
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Compute/virtualMachines/mspStorageVM2/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-1106"
+ },
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Network/networkInterfaces/mspStorageVM2_NIC",
+ "resourceGroup": "haiche-cluster-1106"
+ },
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Network/publicIPAddresses/mspStorageVM2_PublicIP",
+ "resourceGroup": "haiche-cluster-1106"
+ }
+ ],
+ "outputs": {
+ "artifactsLocationPassedIn": {
+ "type": "String",
+ "value": "{{ armTemplateAddCacheNodeBasePath }}"
+ }
+ },
+ "parameters": {
+ "_artifactsLocation": {
+ "type": "String",
+ "value": "{{ armTemplateAddCacheNodeBasePath }}"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "SecureString"
+ },
+ "adminPasswordOrKey": {
+ "type": "SecureString"
+ },
+ "adminUsername": {
+ "type": "String",
+ "value": "weblogic"
+ },
+ "adminVMName": {
+ "type": "String",
+ "value": "adminVM"
+ },
+ "authenticationType": {
+ "type": "String",
+ "value": "password"
+ },
+ "dnsLabelPrefix": {
+ "type": "String",
+ "value": "wls"
+ },
+ "enableCoherenceWebLocalStorage": {
+ "type": "Bool",
+ "value": true
+ },
+ "guidValue": {
+ "type": "String",
+ "value": "d5dde421-44b0-48df-9d12-db02374654d3"
+ },
+ "location": {
+ "type": "String",
+ "value": "eastus"
+ },
+ "managedServerPrefix": {
+ "type": "String",
+ "value": "msp"
+ },
+ "numberOfExistingCacheNodes": {
+ "type": "Int",
+ "value": 1
+ },
+ "numberOfNewCacheNodes": {
+ "type": "Int",
+ "value": 1
+ },
+ "skuUrnVersion": {
+ "type": "String",
+ "value": "owls-122130-8u131-ol74;Oracle:weblogic-122130-jdk8u131-ol74:owls-122130-8u131-ol7;latest"
+ },
+ "storageAccountName": {
+ "type": "String",
+ "value": "33f2e3olvm"
+ },
+ "usePreviewImage": {
+ "type": "Bool",
+ "value": false
+ },
+ "vmSizeSelectForCoherence": {
+ "type": "String",
+ "value": "Standard_A1"
+ },
+ "wlsDomainName": {
+ "type": "String",
+ "value": "wlsd"
+ },
+ "wlsPassword": {
+ "type": "SecureString"
+ },
+ "wlsUserName": {
+ "type": "String",
+ "value": "weblogic"
+ }
+ },
+ "parametersLink": null,
+ "providers": [
+ {
+ "id": null,
+ "namespace": "Microsoft.Resources",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ null
+ ],
+ "properties": null,
+ "resourceType": "deployments"
+ }
+ ]
+ },
+ {
+ "id": null,
+ "namespace": "Microsoft.Network",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "publicIPAddresses"
+ },
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "networkInterfaces"
+ }
+ ]
+ },
+ {
+ "id": null,
+ "namespace": "Microsoft.Compute",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "virtualMachines"
+ },
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "virtualMachines/extensions"
+ }
+ ]
+ }
+ ],
+ "provisioningState": "Succeeded",
+ "template": null,
+ "templateHash": "16596437850900945013",
+ "templateLink": null,
+ "timestamp": "2020-11-09T06:28:40.936524+00:00"
+ },
+ "resourceGroup": "haiche-cluster-1106",
+ "type": "Microsoft.Resources/deployments"
+}
+```
+
+## Verify
+
+### Verify if new cache nodes are added to the WebLogic Server instance.
+
+* Go to the {{ site.data.var.wlsFullBrandName }} Administration Console.
+* Go to **Environment** -> **Machines**.
+
+ You should see logical machines with name parttern `^{managedServerPrefix}StorageVM[0-9]+$`, machine names with number suffix from `numberOfExistingCacheNodes` to `numberOfExistingCacheNodes + numberOfNewCacheNodes` are added.
+* Go to **Environment** -> **Servers**
+
+ You should see servers with name parttern `^{managedServerPrefix}Storage[0-9]+$`, server names with number suffix from `numberOfExistingCacheNodes` to `numberOfExistingCacheNodes + numberOfNewNodes` are added to `storage1`.
+
+### Verify if Azure resources are added
+
+* Go to [Azure Portal](https://ms.portal.azure.com/).
+* Go to resource group that the {{ site.data.var.wlsFullBrandName }} is deployed.
+
+ You should see corresponding Vitual Machines, Disks, Network Interfaces, Public IPs have been added.
diff --git a/dynamic-cluster/addnode.md b/dynamic-cluster/addnode.md
new file mode 100644
index 000000000..7dea5b0e7
--- /dev/null
+++ b/dynamic-cluster/addnode.md
@@ -0,0 +1,686 @@
+{% include variables.md %}
+
+# Add nodes to {{ site.data.var.wlsFullBrandName }}
+
+This page documents how to configure an existing deployment of {{ site.data.var.wlsFullBrandName }} to add add new managed application nodes using Azure CLI.
+
+## Prerequisites
+
+### Environment for Setup
+
+* [Azure CLI](https://docs.microsoft.com/en-us/cli/azure), use `az --version` to test if `az` works.
+
+### WebLogic Server Instance
+
+The template will be applied to an existing {{ site.data.var.wlsFullBrandName }} instance. If you don't have one, please create a new instance from the Azure portal, by following the link to the offer [in the index](index.md).
+
+### Azure Active Directory LDAP Instance
+
+Refer to [Azure Active Directory(AAD) LDAP Instance](aadNestedTemplate.html#azure-active-directory-ldap-instance).
+
+### Administering Security for Oracle WebLogic Server & Configuring KeyStores
+
+Refer to [Configuring Keystores](https://docs.oracle.com/en/middleware/fusion-middleware/weblogic-server/12.2.1.4/secmg/identity_trust.html).
+
+### Generate Base64 string for a given ssl certificate/keystore file
+
+Use the following command to generate a Base64 string for a given ssl certificate/keystore file, to be used as input in the parameters JSON file
+
+
+
+
+## Prepare the Parameters JSON file
+
+You must construct a parameters JSON file containing the parameters to the add-node ARM template. See [Create Resource Manager parameter file](https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/parameter-files) for background information about parameter files. You must specify the information of the existing {{ site.data.var.wlsFullBrandName }} and nodes that to be added. This section shows how to obtain the values for the following required properties.
+
+
+
+
Parameter Name
+
Explanation
+
+
+
_artifactsLocation
+
See below for details.
+
+
+
aadsSettings
+
Optional. JSON object type. You can specify this parameters for Azure Active Directory integration. If enable is true, must specify other properties. See the page WebLogic to Azure with AAD via LDAP for further information.
+
+
+
+
enable
+
If enable is true, must specify all properties of the aadSettings.
+
+
+
+
publicIP
+
The public IP address of Azure Active Directory LDAP server.
+
+
+
+
serverHost
+
The server host of Azure Active Directory LDAP server.
+
+
+
+
certificateBase64String
+
The based64 string of LADP client certificate that will be imported to trust store of WebLogic Server to enable SSL connection of AD provider.
+
+
+
adminPasswordOrKey
+
Password of administration account for the new Virtual Machine that host new nodes.
+
+
+
adminURL
+
The URL of WebLogic Administration Server, usually made up with Virtual Machine name and port, for example: adminVM:7001.
+
+
+
elkSettings
+
Optional. JSON object type. You can specify this parameters for Elasticsearch and Kibana(ELK) connection. If enable is true, must specify other properties. See the page WebLogic with Elastic on Azure for further information.
+
+
+
+
enable
+
If enable is true, must specify all properties of the elkSettings.
+
+
+
+
elasticsearchEndpoint
+
Endpoint of the Elasticsearch instance.
+
+
+
+
elasticsearchPassword
+
Password for Elasticsearch account.
+
+
+
+
elasticsearchUserName
+
User name for Elasticsearch account.
+
+
+
+
logIndex
+
Must be the same value output at ELK deployment time.
+
+
+
+
logsToIntegrate
+
Array with string value. Specify the expeted logs to integrate, you must input at least one log.
+
+
+
numberOfExistingNodes
+
The number of existing managed application nodes, used to generate new virtual machine name,.
+
+
+
numberOfNewNodes
+
The number of nodes to add.
+
+
+
storageAccountName
+
The name of an existing storage account.
+
+
+
wlsDomainName
+
Must be the same value provided at deployment time.
+
+
+
wlsUserName
+
Must be the same value provided at deployment time.
+
+
+
wlsPassword
+
Must be the same value provided at deployment time.
If enable is true, must specify all properties of the customSSLSettings.
+ Set to false by default.
+
+
+
customIdentityKeyStoreBase64String
+
The based64 string of the custom identity keystore file that will be configured in the WebLogic Administration Server to enable SSL connection.
+
+
+
customIdentityKeyStorePassPhrase
+
The identity keystore pass phrase
+
+
+
customIdentityKeyStoreType
+
Identity Key Store Type. This can be either JKS or PKCS12
+
+
+
customTrustKeyStoreBase64String
+
The based64 string of the custom trust keystore file that will be configured in the WebLogic Administration Server to enable SSL connection.
+
+
+
customTrustKeyStorePassPhrase
+
The trust keystore pass phrase
+
+
+
customTrustKeyStoreType
+
Trust Key Store Type. This can be either JKS or PKCS12
+
+
+
privateKeyAlias
+
The private key alias
+
+
+
privateKeyPassPhrase
+
The private Key Pass phrase.
+
+
+
+### `_artifactsLocation`
+
+This value must be the following.
+
+```bash
+{{ armTemplateAddNodeBasePath }}
+```
+
+### Existing managed application servers
+To differentiate functionality of managed servers, we use **managed application server** to represent managed servers that host Java EE application, and use **managed cache server** to represent managed servers that used for cache.
+
+You can get the existing managed application nodes with the following command:
+
+```shell
+$ resourceGroup=
+$ managedServerPrefix=
+$ numberOfExistingNodes=$(az resource list -g ${resourceGroup} --resource-type Microsoft.Compute/virtualMachines --query [*].name | grep "${managedServerPrefix}VM[0-9]" | sed -e 's/[^0-9]/ /g' -e 's/^ *//g' -e 's/ *$//g' | tr -s ' ' | sed 's/ /\n/g' | sort -nr | head -n1)
+$ echo ${numberOfExistingNodes}
+```
+
+### Log index
+
+If you configured ELK in your cluster to export WebLogic Server logs to ELK, please input the value of Kibana log index, this template will set up ELK connection and export logs to specified index.
+
+You can get the value from Azure portal with the following steps:
+
+* Go to Azure portal.
+* Open you resource group and click **Deployments**.
+* Open the ELK deployment, and click **Output**.
+* Copy the value of `logIndex`.
+
+Alternatively, use Azure CLI command to list log index inside the resource group deployments:
+
+```shell
+$ az deployment group list -g 'yourResourceGroup' --query [*].properties.outputs.logIndex.value
+[
+ "azure-weblogic-cluster-f984df74-ab4d-4c17-a532-7f248659fb28"
+]
+```
+
+### Storage account
+
+Each Storage Account handles up to 20,000 IOPS, and 500TB of data. If you use a storage account for Standard Virtual Machines, you can store until 40 virtual disks.
+
+We have two disks for one Virtual Machine, it's suggested no more than 20 Virtual Machines share the same storage account. Number of virtual machines that hosting managed servers should be less than or equal to 20.
+
+You can get the name of storage account from Azure portal with steps:
+
+ * Go to Azure portal
+ * Go to the your resource group
+ * Find storage account resource and copy its name
+
+Alternatively, use Azure CLI command to list storage account inside a resource group:
+
+```shell
+$ az resource list -g 'yourResourceGroup' --resource-type Microsoft.Storage/storageAccounts --query [*].name
+[
+ "219846olvm"
+]
+```
+
+#### Example Parameters JSON
+
+Here is a fully filled out parameters file, with Azure Active Directory enabled. We will leave values of `adminUsername`, `authenticationType`, `dnsLabelPrefix`, `managedServerPrefix`, `skuUrnVersion`, `usePreviewImage` and `vmSizeSelect` as default value.
+
+{{ site.data.var.passwordInFileNote }}
+
+```json
+{
+ "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "_artifactsLocation": {
+ "value": "{{ armTemplateAddNodeBasePath }}"
+ },
+ "aadsSettings": {
+ "value": {
+ "enable": true,
+ "publicIP":"13.68.244.90",
+ "serverHost": "ladps.wls-security.com",
+ "certificateBase64String":"LS0tLS1C...tLS0tLQ0K"
+ }
+ },
+ "adminPasswordOrKey": {
+ "value": "Secret123!"
+ },
+ "adminURL":{
+ "value": "adminVM:7001"
+ },
+ "elkSettings": {
+ "value": {
+ "enable": true,
+ "elasticsearchEndpoint":"https://example.eastus2.azure.elastic-cloud.com:9243",
+ "elasticsearchPassword": "Secret123!",
+ "elasticsearchUserName":"elastic",
+ "logIndex": "azure-weblogic-dynamic-cluster-11122020",
+ "logsToIntegrate": ["HTTPAccessLog", "ServerLog", "DomainLog", "DataSourceLog", "StandardErrorAndOutput", "NodeManagerLog"]
+ }
+ },
+ "location": {
+ "value": "eastus"
+ },
+ "numberOfExistingNodes": {
+ "value": 4
+ },
+ "numberOfNewNodes": {
+ "value": 3
+ },
+ "storageAccountName": {
+ "value": "496dfdolvm"
+ },
+ "wlsDomainName": {
+ "value": "wlsd"
+ },
+ "wlsUserName": {
+ "value": "weblogic"
+ },
+ "wlsPassword": {
+ "value": "welcome1"
+ },
+ "customSSLSettings": {
+ "value": {
+ "enable": true,
+ "customIdentityKeyStoreBase64String": "/u3+7QAAAAIAAAABAAAAAQAKc2VydmV....QZL24ljJLq",
+ "customIdentityKeyStorePassPhrase": "mypassword",
+ "customIdentityKeyStoreType": "JKS",
+ "customTrustKeyStoreBase64String": "/u3+7QAAAAIAAAABAAAAAgAJdHJ1c3R....Td4bYVnONyS0PC7k=",
+ "customTrustKeyStorePassPhrase": "mypassword",
+ "customTrustKeyStoreType": "JKS",
+ "privateKeyAliasSecret": "servercert",
+ "privateKeyPassPhraseSecret": "mypassword"
+ }
+ }
+ }
+}
+```
+
+## Invoke the ARM template
+
+Assume your parameters file is available in the current directory and is named `parameters.json`. This section shows the commands to configure your {{ site.data.var.wlsFullBrandName }} deployment to add new nodes. Replace `yourResourceGroup` with the Azure resource group in which the {{ site.data.var.wlsFullBrandName }} is deployed.
+
+### First, validate your parameters file
+
+The `az group deployment validate` command is very useful to validate your parameters file is syntactically correct.
+
+```bash
+az group deployment validate --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateAddNodeBasePath }}arm/mainTemplate.json
+```
+
+If the command returns with an exit status other than `0`, inspect the output and resolve the problem before proceeding. You can check the exit status by executing the commad `echo $?` immediately after the `az` command.
+
+### Next, execute the template
+
+After successfully validating the template invocation, change `validate` to `create` to invoke the template.
+
+```bash
+az group deployment create --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateAddNodeBasePath }}arm/mainTemplate.json
+```
+
+As with the validate command, if the command returns with an exit status other than `0`, inspect the output and resolve the problem.
+
+This is an example output of successful deployment. Look for `"provisioningState": "Succeeded"` in your output.
+
+```bash
+{
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Resources/deployments/mainTemplate",
+ "location": null,
+ "name": "mainTemplate",
+ "properties": {
+ "correlationId": "54517529-a1c4-422f-a539-23b9a5129e80",
+ "debugSetting": null,
+ "dependencies": [
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Compute/virtualMachines/mspVM7/extensions/newuserscript",
+ "resourceGroup": "oraclevm-dcluster-0727",
+ "resourceName": "mspVM7/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Resources/deployments/pid-c7671c10-ae59-5ec5-bff3-c60db22d7ea4",
+ "resourceGroup": "oraclevm-dcluster-0727",
+ "resourceName": "pid-c7671c10-ae59-5ec5-bff3-c60db22d7ea4",
+ "resourceType": "Microsoft.Resources/deployments"
+ },
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Network/publicIPAddresses/mspVM7_PublicIP",
+ "resourceGroup": "oraclevm-dcluster-0727",
+ "resourceName": "mspVM7_PublicIP",
+ "resourceType": "Microsoft.Network/publicIPAddresses"
+ }
+ ],
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Network/networkInterfaces/mspVM7_NIC",
+ "resourceGroup": "oraclevm-dcluster-0727",
+ "resourceName": "mspVM7_NIC",
+ "resourceType": "Microsoft.Network/networkInterfaces"
+ },
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Network/networkInterfaces/mspVM7_NIC",
+ "resourceGroup": "oraclevm-dcluster-0727",
+ "resourceName": "mspVM7_NIC",
+ "resourceType": "Microsoft.Network/networkInterfaces"
+ },
+ {
+ "apiVersion": "2019-06-01",
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Storage/storageAccounts/09b943olvm",
+ "resourceGroup": "oraclevm-dcluster-0727",
+ "resourceName": "09b943olvm",
+ "resourceType": "Microsoft.Storage/storageAccounts"
+ }
+ ],
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Compute/virtualMachines/mspVM7",
+ "resourceGroup": "oraclevm-dcluster-0727",
+ "resourceName": "mspVM7",
+ "resourceType": "Microsoft.Compute/virtualMachines"
+ },
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Compute/virtualMachines/mspVM7",
+ "resourceGroup": "oraclevm-dcluster-0727",
+ "resourceName": "mspVM7",
+ "resourceType": "Microsoft.Compute/virtualMachines"
+ },
+ {
+ "actionName": "listKeys",
+ "apiVersion": "2019-04-01",
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Storage/storageAccounts/09b943olvm",
+ "resourceGroup": "oraclevm-dcluster-0727",
+ "resourceName": "09b943olvm",
+ "resourceType": "Microsoft.Storage/storageAccounts"
+ }
+ ],
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Compute/virtualMachines/mspVM7/extensions/newuserscript",
+ "resourceGroup": "oraclevm-dcluster-0727",
+ "resourceName": "mspVM7/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "duration": "PT9M6.8098765S",
+ "mode": "Incremental",
+ "onErrorDeployment": null,
+ "outputResources": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Compute/virtualMachines/mspVM7",
+ "resourceGroup": "oraclevm-dcluster-0727"
+ },
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Compute/virtualMachines/mspVM7/extensions/newuserscript",
+ "resourceGroup": "oraclevm-dcluster-0727"
+ },
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Network/networkInterfaces/mspVM7_NIC",
+ "resourceGroup": "oraclevm-dcluster-0727"
+ },
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Network/publicIPAddresses/mspVM7_PublicIP",
+ "resourceGroup": "oraclevm-dcluster-0727"
+ }
+ ],
+ "outputs": {
+ "wlsDomainLocation": {
+ "type": "String",
+ "value": "/u01/domains/wlsd"
+ }
+ },
+ "parameters": {
+ "_artifactsLocation": {
+ "type": "String",
+ "value": "{{ armTemplateAddNodeBasePath }}"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "SecureString"
+ },
+ "aadsSettings": {
+ "type": "Object",
+ "value": {
+ "certificateBase64String": "LS0tLS1C...S0tLQ0K",
+ "enable": true,
+ "publicIP": "40.76.11.111",
+ "serverHost": "ladps.wls-security.com"
+ }
+ },
+ "adminPasswordOrKey": {
+ "type": "SecureString"
+ },
+ "adminURL": {
+ "type": "String",
+ "value": "adminVM:7001"
+ },
+ "adminUsername": {
+ "type": "String",
+ "value": "weblogic"
+ },
+ "authenticationType": {
+ "type": "String",
+ "value": "password"
+ },
+ "dnsLabelPrefix": {
+ "type": "String",
+ "value": "wls"
+ },
+ "guidValue": {
+ "type": "String",
+ "value": "67657ba3-6248-46e5-bedc-53e16ac82571"
+ },
+ "location": {
+ "type": "String",
+ "value": "eastus"
+ },
+ "managedServerPrefix": {
+ "type": "String",
+ "value": "msp"
+ },
+ "numberOfExistingNodes": {
+ "type": "Int",
+ "value": 7
+ },
+ "numberOfNewNodes": {
+ "type": "Int",
+ "value": 1
+ },
+ "skuUrnVersion": {
+ "type": "String",
+ "value": "owls-122130-8u131-ol74;Oracle:weblogic-122130-jdk8u131-ol74:owls-122130-8u131-ol7;1.1.1"
+ },
+ "storageAccountName": {
+ "type": "String",
+ "value": "09b943olvm"
+ },
+ "usePreviewImage": {
+ "type": "Bool",
+ "value": false
+ },
+ "vmSizeSelect": {
+ "type": "String",
+ "value": "Standard_A3"
+ },
+ "wlsDomainName": {
+ "type": "String",
+ "value": "wlsd"
+ },
+ "wlsPassword": {
+ "type": "SecureString"
+ },
+ "wlsUserName": {
+ "type": "String",
+ "value": "weblogic"
+ },
+ "customSSLSettings": {
+ "type": "Object",
+ "value": {
+ "enable": true,
+ "customIdentityKeyStoreBase64String": "/u3+7QAAAAIAAAABAAAAAQAKc2VydmV....QZL24ljJLq",
+ "customIdentityKeyStorePassPhrase": "mypassword",
+ "customIdentityKeyStoreType": "JKS",
+ "customTrustKeyStoreBase64String": "/u3+7QAAAAIAAAABAAAAAgAJdHJ1c3R....Td4bYVnONyS0PC7k=",
+ "customTrustKeyStorePassPhrase": "mypassword",
+ "customTrustKeyStoreType": "JKS",
+ "privateKeyAliasSecret": "servercert",
+ "privateKeyPassPhraseSecret": "mypassword"
+ }
+ }
+ },
+ "parametersLink": null,
+ "providers": [
+ {
+ "id": null,
+ "namespace": "Microsoft.Resources",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ null
+ ],
+ "properties": null,
+ "resourceType": "deployments"
+ }
+ ]
+ },
+ {
+ "id": null,
+ "namespace": "Microsoft.Network",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "publicIPAddresses"
+ },
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "networkInterfaces"
+ }
+ ]
+ },
+ {
+ "id": null,
+ "namespace": "Microsoft.Compute",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "virtualMachines"
+ },
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "virtualMachines/extensions"
+ }
+ ]
+ }
+ ],
+ "provisioningState": "Succeeded",
+ "template": null,
+ "templateHash": "15879952829017360289",
+ "templateLink": {
+ "contentVersion": "1.0.0.0",
+ "uri": "{{ armTemplateAddNodeBasePath }}arm/mainTemplate.json"
+ },
+ "timestamp": "2020-07-27T12:37:03.733682+00:00"
+ },
+ "resourceGroup": "oraclevm-dcluster-0727",
+ "type": "Microsoft.Resources/deployments"
+}
+```
+
+## Verify
+
+### Verify if new nodes are added to the WebLogic Server instance.
+
+* Go to the {{ site.data.var.wlsFullBrandName }} Administration Console.
+* Go to **Environment -> Machines**.
+ You should see logical machines with suffix from `numberOfExistingNodes` to `numberOfExistingNodes + numberOfNewNodes` are added.
+ Make note of the total number of machines.
+
+* Scale up to check if the machines work
+ * Go to **Environment** -> **Cluster** -> `cluster1` -> **Control** -> **Scaling**.
+
+ Input value to **Desired Number of Running Servers** with the total number of machines, saved in last step.
+ * Save and activate.
+ * Go to **Environment** -> **Servers**.
+
+ Expected result: the running managed server number is the same as machine total number. And there are servers running on the new managed nodes.
+
+### Verify if Azure resources are added
+
+* Go to [Azure Portal](https://ms.portal.azure.com/).
+* Go to resource group that the {{ site.data.var.wlsFullBrandName }} is deployed.
+
+ You should see corresponding Vitual Machines, Disks, Network Interfaces, Public IPs have been added.
+
+### Verify AAD Integration
+
+Verify AAD integration by delpoying a simple Java EE applciation with basic authentication.
+
+* Go to Administration Server Console and deploy [testing application](../resources/basicauth.war).
+ * Select **Deployments**.
+ * Select **Install**.
+ * Select file `basicauth.war`.
+ * Select **Next**. Choose "Install this deployment as an application".
+ * Select **Next**. Select "cluster-1" and "All servers in the cluster".
+ * Keep configuration as default and select **Finish**.
+ * Select **Activate Changes**
+ * In the left navigation pane, select **Deployments**.
+ * Select **Control**
+ * Select `basicauth`
+ * Select **Start**
+ * Select **Servicing all requests**
+
+* Access the sample application
+ * Go to Administration Server Console
+ * Go to **Environment -> Machines**. Click one of the new machines, make sure there are servers running on that machine. Click **Node Manager** and make note of the machine host in **Listen Address**, here named it as `machineName`. Click **Servers** and make note of **Listen Port**, here named it as `port`.
+ * Go to [Azure Portal](https://ms.portal.azure.com/), and get DNS name from Virtual Machine has the same name of `machineName`, named it `machineDNS`
+ * Go to `http://${machineDNS}:${port}/basicauth`, the browser will prompt up to ask for credentials, input one of AAD users from group **AAD DC Administrators**, note that use name should be **sAMAccountName**, for example `wlstest` for user `wlstest@javaeehotmailcom.onmicrosoft.com`.
+ * Expected result, you can access the sample application without error.
diff --git a/dynamic-cluster/coherenceTemplate.md b/dynamic-cluster/coherenceTemplate.md
new file mode 100644
index 000000000..546572006
--- /dev/null
+++ b/dynamic-cluster/coherenceTemplate.md
@@ -0,0 +1,528 @@
+{% include variables.md %}
+
+# Configure Coherence cluster to {{ site.data.var.wlsFullBrandName }}
+
+This page documents how to configure an existing deployment of {{ site.data.var.wlsFullBrandName }} with a Coherence cluster using Azure CLI.
+
+## Prerequisites
+
+### Environment for Setup
+
+* [Azure CLI](https://docs.microsoft.com/en-us/cli/azure), use `az --version` to test if `az` works.
+
+### WebLogic Server Instance
+
+The Coherence ARM template will be applied to an existing {{ site.data.var.wlsFullBrandName }} instance. If you don't have one, please create a new instance from the Azure portal, by following the link to the offer [in the index](index.md).
+
+**Note:** if you have enabled Coherence in the initial offer deployment from Azure portal, the Coherence cluster has been set up, you don't need to run Coherence tempalte.
+
+### Elasticsearch instance
+
+Optional.
+
+Refer to [Create an an Elastic on Azure instance](https://aka.ms/arm-oraclelinux-wls-elk#create-an-an-elastic-on-azure-instance)
+
+## Prepare the Parameters JSON file
+
+You must construct a parameters JSON file containing the parameters to the Coherence ARM template. See [Create Resource Manager parameter file](https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/parameter-files) for background information about parameter files.
+
+The deployment of coherenceTemplate.json will:
+ * Provision Azure resources, including virtual machine, network interface, disk, public IP to host new Coherence cache servers.
+ * Configure WebLogic Coherence cluster, including:
+ * Create Coherence cluster `myCoherence`
+ * Create data tier `storage1` cluster.
+ * Associate `cluster1` and `storage1` to `myCoherence` cluster.
+ * Create cache servers and assign them to `storage1` cluster.
+
+We must specify the information of the existing {{ site.data.var.wlsFullBrandName }}. This section shows how to obtain the values for the following required properties.
+
+| Parameter Name | Explanation |
+|----------------|-------------|
+| `_artifactsLocation`| See below for details. |
+| `adminPasswordOrKey` | SSH Key or password for the Virtual Machine. SSH key is recommended. |
+| `adminVMName`| Virtual machine name of which hosts the {{ site.data.var.wlsFullBrandName }} admin server. |
+| `elasticsearchEndpoint` | The Elasticsearch endpoint. |
+| `elasticsearchPassword` | Password for the Elasticsearch account. |
+| `elasticsearchUserName` | User name for the Elasticsearch account. |
+| `enableCoherenceWebLocalStorage` | Specifies whether Local Storage is enabled for the Coherence*Web cluster tier. |
+| `enableELK` | If true, use the supplied parameters to distribute WebLogic Server logs to the Elasticsearch instance. |
+| `location` | Must be the same region into which the server was initially deployed. |
+| `logIndex` | Elasticsearch index you expect to export the logs to. Must be the same value with output from initial ELK deployment. |
+| `logsToIntegrate` | Specify the WebLogic logs to export to Elasticsearch, you must select at least one log. |
+| `managedServerPrefix` | Must be the same prefix with which the cluster was initially deployed. |
+| `numberOfCoherenceCacheInstances` | Number of Coherence cache servers, used to create Virtual Machines and Managed Server. |
+| `skuUrnVersion` | Must be the same urn with which the cluster was initially deployed. |
+| `storageAccountName` | The name of an existing storage account. |
+| `vmSizeSelectForCoherence` | Select appropriate VM Size for Coherence cache servers. |
+| `wlsDomainName` | Must be the same value provided at initial deployment time. |
+| `wlsPassword` | Must be the same value provided at initial deployment time. |
+| `wlsUserName` | Must be the same value provided at initial deployment time. |
+
+### `_artifactsLocation`
+
+This value must be the following.
+
+```bash
+{{ armTemplateBasePath }}
+```
+
+### Log index
+
+If you configured ELK in your cluster to export WebLogic Server logs to ELK, please input the value of Kibana log index, this template will set up ELK connection and export logs to specified index.
+
+You can get the value from Azure portal with the following steps:
+
+* Go to Azure portal.
+* Open you resource group and click **Deployments**.
+* Open the ELK deployment, and click **Output**.
+* Copy the value of `logIndex`.
+
+Alternatively, use Azure CLI command to list log index inside the resource group deployments:
+
+```shell
+$ az deployment group list -g 'yourResourceGroup' --query [*].properties.outputs.logIndex.value
+[
+ "azure-weblogic-cluster-f984df74-ab4d-4c17-a532-7f248659fb28"
+]
+```
+
+### Storage account
+
+Each Storage Account handles up to 20,000 IOPS, and 500TB of data. If you use a storage account for Standard Virtual Machines, you can store until 40 virtual disks.
+
+We have two disks for one Virtual Machine, it's suggested no more than 20 Virtual Machines share the same storage account. Number of virtual machines that hosting managed servers should be less than or equal to 20.
+
+You can get the name of storage account from Azure portal with steps:
+
+ * Go to Azure portal
+ * Go to the your resource group
+ * Find storage account resource and copy its name
+
+Alternatively, use Azure CLI command to list storage account inside a resource group:
+
+```shell
+$ az resource list -g 'yourResourceGroup' --resource-type Microsoft.Storage/storageAccounts --query [*].name
+[
+ "219846olvm"
+]
+```
+
+#### Example Parameters JSON
+
+Here is a fully filled out parameters file. This is an example to set up Coherence*Web. We will leave values of `adminUsername`, `authenticationType`, `dnsLabelPrefix`, and `usePreviewImage` as default value.
+
+{{ site.data.var.passwordInFileNote }}
+
+```json
+{
+ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "_artifactsLocation": {
+ "value": "{{ armTemplateBasePath }}"
+ },
+ "adminPasswordOrKey": {
+ "value": "jyfRat@nht2019"
+ },
+ "adminVMName": {
+ "value": "adminVM"
+ },
+ "elasticsearchEndpoint": {
+ "value": "https://example.eastus2.azure.elastic-cloud.com:9243"
+ },
+ "elasticsearchPassword": {
+ "value": "Secret123!"
+ },
+ "elasticsearchUserName": {
+ "value": "elastic"
+ },
+ "enableCoherenceWebLocalStorage": {
+ "value": true
+ },
+ "enableELK": {
+ "value": true
+ },
+ "managedServerPrefix": {
+ "value": "msp"
+ },
+ "location": {
+ "value": "eastus"
+ },
+ "logIndex": {
+ "value": "azure-weblogic-cluster-11122020"
+ },
+ "logsToIntegrate": {
+ "value": ["HTTPAccessLog", "ServerLog", "DomainLog", "DataSourceLog", "StandardErrorAndOutput","NodeManagerLog"]
+ },
+ "numberOfCoherenceCacheInstances": {
+ "value": 1
+ },
+ "skuUrnVersion": {
+ "value": "owls-122140-8u251-ol76;Oracle:weblogic-122140-jdk8u251-ol76:owls-122140-8u251-ol7;latest"
+ },
+ "storageAccountName": {
+ "value": "d40140olvm"
+ },
+ "vmSizeSelectForCoherence": {
+ "value": "Standard_A1"
+ },
+ "wlsDomainName": {
+ "value": "wlsd"
+ },
+ "wlsPassword": {
+ "value": "welcome1"
+ },
+ "wlsUserName": {
+ "value": "weblogic"
+ }
+ }
+}
+```
+
+## Invoke the ARM template
+
+Assume your parameters file is available in the current directory and is named `parameters.json`. This section shows the commands to configure your {{ site.data.var.wlsFullBrandName }} deployment with a Coherence cluster. Replace `yourResourceGroup` with the Azure resource group in which the {{ site.data.var.wlsFullBrandName }} is deployed.
+
+### First, validate your parameters file
+
+The `az deployment group validate` command is very useful to validate your parameters file is syntactically correct.
+
+```bash
+az deployment group validate --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateBasePath }}nestedtemplates/coherenceTemplate.json
+```
+
+If the command returns with an exit status other than `0`, inspect the output and resolve the problem before proceeding. You can check the exit status by executing the commad `echo $?` immediately after the `az` command.
+
+### Next, execute the template
+
+After successfully validating the template invocation, change `validate` to `create` to invoke the template.
+
+```bash
+az deployment group create --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateBasePath }}nestedtemplates/coherenceTemplate.json
+```
+
+As with the validate command, if the command returns with an exit status other than `0`, inspect the output and resolve the problem.
+
+This is an example output of successful deployment. Look for `"provisioningState": "Succeeded"` in your output.
+
+```json
+{
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Resources/deployments/coherenceTemplate",
+ "location": null,
+ "name": "coherenceTemplate",
+ "properties": {
+ "correlationId": "07555c54-2384-4ca3-b427-6cf7d8b53052",
+ "debugSetting": null,
+ "dependencies": [
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "adminVM/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ },
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Compute/virtualMachines/mspStorageVM1/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "mspStorageVM1/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Resources/deployments/pid-157eaa6e-12ae-11eb-adc1-0242ac120002",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "pid-157eaa6e-12ae-11eb-adc1-0242ac120002",
+ "resourceType": "Microsoft.Resources/deployments"
+ },
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Network/publicIPAddresses/mspStorageVM1_PublicIP",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "mspStorageVM1_PublicIP",
+ "resourceType": "Microsoft.Network/publicIPAddresses"
+ }
+ ],
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Network/networkInterfaces/mspStorageVM1_NIC",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "mspStorageVM1_NIC",
+ "resourceType": "Microsoft.Network/networkInterfaces"
+ },
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Network/networkInterfaces/mspStorageVM1_NIC",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "mspStorageVM1_NIC",
+ "resourceType": "Microsoft.Network/networkInterfaces"
+ },
+ {
+ "apiVersion": "2019-06-01",
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Storage/storageAccounts/33f2e3olvm",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "33f2e3olvm",
+ "resourceType": "Microsoft.Storage/storageAccounts"
+ }
+ ],
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Compute/virtualMachines/mspStorageVM1",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "mspStorageVM1",
+ "resourceType": "Microsoft.Compute/virtualMachines"
+ },
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Compute/virtualMachines/mspStorageVM1",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "mspStorageVM1",
+ "resourceType": "Microsoft.Compute/virtualMachines"
+ },
+ {
+ "actionName": "listKeys",
+ "apiVersion": "2019-06-01",
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Storage/storageAccounts/33f2e3olvm",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "33f2e3olvm",
+ "resourceType": "Microsoft.Storage/storageAccounts"
+ }
+ ],
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "adminVM/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ },
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Compute/virtualMachines/mspStorageVM1",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "mspStorageVM1",
+ "resourceType": "Microsoft.Compute/virtualMachines"
+ },
+ {
+ "actionName": "listKeys",
+ "apiVersion": "2019-06-01",
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Storage/storageAccounts/33f2e3olvm",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "33f2e3olvm",
+ "resourceType": "Microsoft.Storage/storageAccounts"
+ }
+ ],
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Compute/virtualMachines/mspStorageVM1/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "mspStorageVM1/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "duration": "PT9M26.6278882S",
+ "mode": "Incremental",
+ "onErrorDeployment": null,
+ "outputResources": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-1106"
+ },
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Compute/virtualMachines/mspStorageVM1",
+ "resourceGroup": "haiche-cluster-1106"
+ },
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Compute/virtualMachines/mspStorageVM1/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-1106"
+ },
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Network/networkInterfaces/mspStorageVM1_NIC",
+ "resourceGroup": "haiche-cluster-1106"
+ },
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Network/publicIPAddresses/mspStorageVM1_PublicIP",
+ "resourceGroup": "haiche-cluster-1106"
+ }
+ ],
+ "outputs": {
+ "artifactsLocationPassedIn": {
+ "type": "String",
+ "value": "{{ armTemplateBasePath }}"
+ }
+ },
+ "parameters": {
+ "_artifactsLocation": {
+ "type": "String",
+ "value": "{{ armTemplateBasePath }}"
+ },
+ "_artifactsLocationCoherenceTemplate": {
+ "type": "String",
+ "value": "{{ armTemplateBasePath }}"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "SecureString"
+ },
+ "adminPasswordOrKey": {
+ "type": "SecureString"
+ },
+ "adminUsername": {
+ "type": "String",
+ "value": "weblogic"
+ },
+ "adminVMName": {
+ "type": "String",
+ "value": "adminVM"
+ },
+ "authenticationType": {
+ "type": "String",
+ "value": "password"
+ },
+ "dnsLabelPrefix": {
+ "type": "String",
+ "value": "wls"
+ },
+ "enableCoherenceWebLocalStorage": {
+ "type": "Bool",
+ "value": true
+ },
+ "guidValue": {
+ "type": "String",
+ "value": "b4c17707-b932-43f0-a4cc-6d6990bb850f"
+ },
+ "location": {
+ "type": "String",
+ "value": "eastus"
+ },
+ "managedServerPrefix": {
+ "type": "String",
+ "value": "msp"
+ },
+ "numberOfCoherenceCacheInstances": {
+ "type": "Int",
+ "value": 1
+ },
+ "skuUrnVersion": {
+ "type": "String",
+ "value": "owls-122130-8u131-ol74;Oracle:weblogic-122130-jdk8u131-ol74:owls-122130-8u131-ol7;latest"
+ },
+ "storageAccountName": {
+ "type": "String",
+ "value": "33f2e3olvm"
+ },
+ "usePreviewImage": {
+ "type": "Bool",
+ "value": false
+ },
+ "vmSizeSelectForCoherence": {
+ "type": "String",
+ "value": "Standard_A1"
+ },
+ "wlsDomainName": {
+ "type": "String",
+ "value": "wlsd"
+ },
+ "wlsPassword": {
+ "type": "SecureString"
+ },
+ "wlsUserName": {
+ "type": "String",
+ "value": "weblogic"
+ }
+ },
+ "parametersLink": null,
+ "providers": [
+ {
+ "id": null,
+ "namespace": "Microsoft.Resources",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ null
+ ],
+ "properties": null,
+ "resourceType": "deployments"
+ }
+ ]
+ },
+ {
+ "id": null,
+ "namespace": "Microsoft.Network",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "publicIPAddresses"
+ },
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "networkInterfaces"
+ }
+ ]
+ },
+ {
+ "id": null,
+ "namespace": "Microsoft.Compute",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "virtualMachines"
+ },
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "virtualMachines/extensions"
+ }
+ ]
+ }
+ ],
+ "provisioningState": "Succeeded",
+ "template": null,
+ "templateHash": "7840329080326569798",
+ "templateLink": null,
+ "timestamp": "2020-11-06T08:48:57.229200+00:00"
+ },
+ "resourceGroup": "haiche-cluster-1106",
+ "type": "Microsoft.Resources/deployments"
+}
+```
+
+## Verify Coherence cluster
+
+Follow the steps to check if Coherence*Web is enabled.
+
+* Follow the example parameters to set up Coherence*Web.
+* Go to admin console portal.
+* Deploy [coherence-sample.war](../resources/coherence-sample.war) to `cluster1`.
+ Please select `cluster1` in the Targets page.
+* Start `coherence-sample`.
+* Open the sample with browser, click "add session" to add session infomation. Click "test session" to verify.
+
+If the Coherence cluster does not set up successfully, the application deployment will fail.
+
+If the cache server does not work correctly, session can not be saved, as we disabled local storage in application servers.
diff --git a/dynamic-cluster/customDNSTemplate.md b/dynamic-cluster/customDNSTemplate.md
new file mode 100644
index 000000000..5e6921581
--- /dev/null
+++ b/dynamic-cluster/customDNSTemplate.md
@@ -0,0 +1,177 @@
+{% include variables.md %}
+
+# Configure DNS alias to {{ site.data.var.wlsFullBrandName }}
+
+This page documents how to configure an existing deployment of {{ site.data.var.wlsFullBrandName }} with a custom DNS alias.
+
+## Prerequisites
+
+### Environment for Setup
+
+* [Azure CLI](https://docs.microsoft.com/en-us/cli/azure), use `az --version` to test if `az` works.
+
+### WebLogic Server Instance
+
+The DNS Configuraton ARM template will be applied to an existing {{ site.data.var.wlsFullBrandName }} instance. If you don't have one, please create a new instance from the Azure portal, by following the link to the offer [in the index](index.md).
+
+### Registered Domain Name
+
+You need to buy a domain name to create a custom DNS alias.
+
+### Azure DNS Zone
+
+If you create the DNS alias on an existing [Azure DNS Zone](https://docs.microsoft.com/en-us/azure/dns/dns-overview), make sure you have perfomed the [Azure DNS Delegation](https://docs.microsoft.com/en-us/azure/dns/dns-domain-delegation). Once you have completed the delegation, you can verify it with `nslookup`. For example, assuming your domain name is **contoso.com**, this output shows a correct delegation.
+
+```bash
+$ nslookup -type=SOA contoso.com
+Server: 172.29.80.1
+Address: 172.29.80.1#53
+
+Non-authoritative answer:
+contoso.com
+ origin = ns1-01.azure-dns.com
+ mail addr = azuredns-hostmaster.microsoft.com
+ serial = 1
+ refresh = 3600
+ retry = 300
+ expire = 2419200
+ minimum = 300
+Name: ns1-01.azure-dns.com
+Address: 40.90.4.1
+Name: ns1-01.azure-dns.com
+Address: 2603:1061::1
+```
+
+We strongly recommand you create an Azure DNS Zone for domain management and reuse it for other perpose. Follow the [guide](https://docs.microsoft.com/en-us/azure/dns/dns-getstarted-portal) to create an Azure DNS Zone.
+
+### Azure Managed Indentify
+
+If you are going to configure DNS alias based on an existing DNS Zone, you are required to input the ID of a user-assigned managed identity.
+
+Follow this [guide](https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/how-to-manage-ua-identity-portal) to create a user-assigned managed identity.
+
+To obtain ID of the indentify: go to Azure Portal; open the identity **Overview** page; click **JSON View** and copy the **Resource ID**.
+
+
+## Prepare the Parameters
+
+We provide an automation shell script for DNS configuration. You must specify the information of the existing Oracle WebLogic Server. This section shows how to obtain the values for the following required properties.
+
+| Parameter Name | Explanation |
+|----------------|-------------|
+| `--admin-vm-name`| Required. Name of vitual machine that hosts {{ site.data.var.wlsFullBrandName }} admin server. Must be the same value provided at initial deployment time.|
+| `--admin-console-label` | Required. Label for {{ site.data.var.wlsFullBrandName }} admin console. Used to generate subdomain of admin console. |
+| `--artifact-location`| Required. See below for details. |
+| `--resource-group` | Required. Name of resource group that has WebLogic cluster deployed. |
+| `--location` | Required. Must be the same region into which the server was initially deployed. |
+| `--zone-name` | Required. Azure DNS Zone name. |
+| `--ohs-vm-name` | Optional. Specify name of the VM that hosts the Oracle HTTP Server Load Balancer. |
+| `--loadbalancer-label` | Optional. Label for Load Balancer. Used to generate subdomain of application gateway. The parameter is only required if you want to create DNS alias for application gateway.|
+| `--identity-id` | Optional. ID of Azure user-assigned managed identity. The parameter is only required if you are creating DNS alias on an existing DNS Zone.|
+| `--zone-resource-group` | Optional. Name of resource group that has Azure DNS Zone deployed. The parameter is only required if you are creating DNS alias on an existing DNS Zone. |
+| `--help` | Help. |
+
+### Artifacts location
+
+This value must be the following.
+
+```bash
+{{ armTemplateBasePath }}
+```
+
+## Invoke the Automation Script
+
+We provide an automation script to configure a custom DNS alias. The script lets you do the following:
+
+ * If you have an Azure DNS Zone, it will create a DNS alias for the admin console and application gateway on the existing DNS Zone.
+ * If you don't have an Azure DNS Zone, it will create the DNS Zone in the same resource group as the WebLogic cluster, then create the DNS alias for the admin console and application gateway.
+
+### Configure DNS Alias on an Existing Azure DNS Zone
+
+To configure a DNS alias on an existing Azure DNS Zone, in addition to the required parameters, you must also specify an Azure user-assigned managed identity ID and the resource group name in which your DNS Zone is deployed.
+
+This is an example to create a DNS alias `admin.contoso.com` for the admin console and `applciations.contoso.com` for the application gateway on an existing Azure DNS Zone.
+
+```bash
+$ curl -fsSL {{ site.data.var.artifactsLocationBase }}{{ pageDir }}/{{ site.data.var.artifactsLocationTag }}/cli-scripts/custom-dns-alias-cli.sh \
+ | /bin/bash -s -- \
+ --resource-group `yourResourceGroup` \
+ --admin-vm-name adminVM \
+ --admin-console-label admin \
+ --artifact-location {{ armTemplateBasePath }} \
+ --location eastus \
+ --zone-name contoso.com \
+ --ohs-vm-name ohsVM \
+ --loadbalancer-label applications \
+ --identity-id `yourIndentityID` \
+ --zone-resource-group `yourDNSZoneResourceGroup`
+```
+
+An example output:
+
+```text
+Done!
+
+Custom DNS alias:
+ Resource group: haiche-dns-doc
+ WebLogic Server Administration Console URL: http://admin.contoso.com:7001/console
+ WebLogic Server Administration Console secured URL: https://admin.contoso.com:7002/console
+
+
+ Application Gateway URL: http://applications.contoso.com:7777
+ Application Gateway secured URL: https://applications.contoso.com:4444
+```
+
+
+### Configure DNS Alias on a New Azure DNS Zone
+
+To configure a DNS alias on a new Azure DNS Zone, you must specify the required parameters.
+
+This is an example of creating an Azure DNS Zone, then creating a DNS alias `admin.contoso.com` for the admin console and `applications.contoso.com` for application gateway.
+
+```bash
+$ curl -fsSL {{ site.data.var.artifactsLocationBase }}{{ pageDir }}/{{ site.data.var.artifactsLocationTag }}/cli-scripts/custom-dns-alias-cli.sh \
+ | /bin/bash -s -- \
+ --resource-group `yourResourceGroup` \
+ --admin-vm-name adminVM \
+ --admin-console-label admin \
+ --artifact-location {{ armTemplateBasePath }} \
+ --location eastus \
+ --zone-name contoso.com \
+ --ohs-vm-name ohsVM \
+ --loadbalancer-label applications
+```
+
+An example output:
+
+```text
+DONE!
+
+
+Action required:
+ Complete Azure DNS delegation to make the alias accessible.
+ Reference: https://aka.ms/dns-domain-delegation
+ Name servers:
+ [
+ "ns1-02.azure-dns.com.",
+ "ns2-02.azure-dns.net.",
+ "ns3-02.azure-dns.org.",
+ "ns4-02.azure-dns.info."
+ ]
+
+Custom DNS alias:
+ Resource group: haiche-dns-doc
+ WebLogic Server Administration Console URL: http://admin.contoso.com:7001/console
+ WebLogic Server Administration Console secured URL: https://admin.contoso.com:7002/console
+
+
+ Application Gateway URL: http://applications.contoso.com:7777
+ Application Gateway secured URL: https://applications.contoso.com:4444
+```
+
+**Note:** The DNS aliases are not accessible now, you must perform Azure DNS delegation after the deployment. Follow [Delegation of DNS zones with Azure DNS](https://aka.ms/dns-domain-delegation) to complete the Azure DNS delegation.
+
+
+## Verify the Custom Alias
+
+Access the URL from output to verify if the custom alias works.
diff --git a/dynamic-cluster/dbTemplate.md b/dynamic-cluster/dbTemplate.md
new file mode 100644
index 000000000..b46907b35
--- /dev/null
+++ b/dynamic-cluster/dbTemplate.md
@@ -0,0 +1,334 @@
+{% include variables.md %}
+
+# Apply Database ARM Template to {{ site.data.var.wlsFullBrandName }}
+
+This page documents how to configure an existing deployment of {{ site.data.var.wlsFullBrandName }} with an existing Azure database using Azure CLI.
+
+## Prerequisites
+
+### Environment for Setup
+
+* [Azure CLI](https://docs.microsoft.com/en-us/cli/azure), use `az --version` to test if `az` works.
+
+### WebLogic Server Instance
+
+The database ARM template will be applied to an existing {{ site.data.var.wlsFullBrandName }} instance. If you don't have one, please create a new instance from the Azure portal, by following the link to the offer [in the index](index.md).
+
+### Database Instance
+
+To apply configure a database with {{ site.data.var.wlsFullBrandName }},
+you must have an existing database instance to use. This template
+supports three popular Azure databases: [Oracle](https://ms.portal.azure.com/#blade/Microsoft_Azure_Marketplace/MarketplaceOffersBlade/selectedMenuItemId/home/searchQuery/oracle%20database), [Azure SQL Server](https://docs.microsoft.com/en-us/azure/azure-sql/) and [Azure Database for PostgreSQL](https://docs.microsoft.com/en-us/azure/azure-sql/database/single-database-create-quickstart?WT.mc_id=gallery&tabs=azure-portal). If you do not have an instance, please
+create one from the Azure portal.
+
+### Apply multiple databases
+
+You can deploy different databases using the database ARM template, by changing the ARM parameters file and invoking the template again with Azure CLI.
+
+To apply multiple databases, you have to remove the previous virtual machine extension. Last ARM parameters file is cached, it will block you from configuring the new database.
+
+Use the following command to remove virtual machine extension:
+
+```bash
+# remove existing vm extension
+az vm extension delete -g ${yourResourceGroup} --vm-name ${adminVMName} --name newuserscript
+```
+
+## Prepare the Parameters JSON file
+
+You must construct a parameters JSON file containing the parameters to the database ARM template. See [Create Resource Manager parameter file](https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/parameter-files) for background information about parameter files. We must specify the information of the existing {{ site.data.var.wlsFullBrandName }} and database instance. This section shows how to obtain the values for the following required properties.
+
+| Parameter Name | Explanation |
+|----------------|-------------|
+| `_artifactsLocation`| See below for details. |
+| `adminVMName`| At deployment time, if this value was changed from its default value, the value used at deployment time must be used. Otherwise, this parameter should be omitted. |
+| `databaseType`| Must be one of `postgresql`, `oracle` or `sqlserver` |
+| `dbPassword`| See below for details. |
+| `dbUser` | See below for details. |
+| `dsConnectionURL`| See below for details. |
+| `jdbcDataSourceName`| Must be the JNDI name for the JDBC DataSource. |
+| `location` | Must be the same region into which the server was initially deployed. |
+| `wlsPassword` | Must be the same value provided at deployment time. |
+| `wlsUserName` | Must be the same value provided at deployment time. |
+
+### `_artifactsLocation`
+
+This value must be the following.
+
+```bash
+{{ armTemplateBasePath }}
+```
+
+### Obtain the JDBC Connection String, Database User, and Database Password
+
+The parameter `dsConnectionURL` stands for JDBC connection string. The connection string is database specific.
+
+#### Oracle Database:
+
+The following is the format of the JDBC connection string for Oracle Database:
+
+```bash
+jdbc:oracle:thin:@HOSTNAME:1521/DATABASENAME
+```
+
+For example:
+
+```bash
+jdbc:oracle:thin:@benqoiz.southeastasia.cloudapp.azure.com:1521/pdb1
+```
+
+#### Azure Database for PostgreSQL:
+
+Deploy an Azure Database PostgreSQL as described in [Create an Azure Database for PostgreSQL server in the Azure portal](https://docs.microsoft.com/en-us/azure/postgresql/quickstart-create-server-database-portal).
+
+1. Access the [Azure portal](https://portal.azure.com), and go to the service instance.
+
+2. Click **Connection Strings** under **Settings**.
+
+3. Locate the **JDBC** section and click the copy icon on the right to copy the JDBC connection string to the clipboard. The JDBC connection string will be similar to the following:
+
+```bash
+jdbc:postgresql://20191015cbfgterfdy.postgres.database.azure.com:5432/{your_database}?user=jroybtvp@20191015cbfgterfdy&password={your_password}&sslmode=require
+```
+
+When passing this value to the ARM template, remove the database user and password values from the connection string, and let them be the parameters `dbUser` and `dbPassword`. In the above JDBC connection string sample, the value for `dsConnectionURL` argument after removing the database user and password, will be:
+
+```bash
+jdbc:postgresql://20191015cbfgterfdy.postgres.database.azure.com:5432/{your_database}?sslmode=require
+```
+
+Finally, replace `{your_database}` with the name of your database, typically `postgres`.
+
+#### Azure SQL Server
+
+Deploy Azure SQL Server as described in [Create a single database in Azure SQL Database using the Azure portal, PowerShell, and Azure CLI](https://docs.microsoft.com/en-us/azure/sql-database/sql-database-single-database-get-started?tabs=azure-portal).
+
+1. Access the [Azure portal](https://portal.azure.com) and go to the service instance.
+
+2. Click **Connection Strings** under **Settings**.
+
+3. Locate the **JDBC** section and click the copy icon on the right to copy the JDBC connection string to the clipboard. The JDBC connection string will be similar to the following:
+
+```bash
+jdbc:sqlserver://rwo102804.database.windows.net:1433;database=rwo102804;user=jroybtvp@rwo102804;password={your_password_here};encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;
+```
+
+When passing this value to the ARM template, remove the database user and password values, let them be the parameters `dbUser` and `dbPassword`. In the above JDBC connection string sample, the value for `dsConnectionURL` argument after removing the database user and password, will be:
+
+```bash
+jdbc:sqlserver://rwo102804.database.windows.net:1433;database={your_database};encrypt=true;tr
+```
+
+Finally, replace `{your_database}` with the name of your database.
+
+#### Example Parameters JSON
+
+Here is a fully filled out parameters file. Note that we did not include `adminVMName`.
+
+{{ site.data.var.passwordInFileNote }}
+
+```json
+{
+ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "_artifactsLocation":{
+ "value": "{{ armTemplateBasePath }}"
+ },
+ "location": {
+ "value": "eastus"
+ },
+ "databaseType": {
+ "value": "postgresql"
+ },
+ "dsConnectionURL": {
+ "value": "jdbc:postgresql://ejb060801p.postgres.database.azure.com:5432/postgres?sslmode=require"
+ },
+ "dbPassword": {
+ "value": "Secret123!"
+ },
+ "dbUser": {
+ "value": "postgres@ejb060801p"
+ },
+ "jdbcDataSourceName": {
+ "value": "jdbc/ejb060801p"
+ },
+ "wlsPassword": {
+ "value": "welcome1"
+ },
+ "wlsUserName": {
+ "value": "weblogic"
+ }
+ }
+}
+```
+
+## Invoke the ARM template
+
+Assume your parameters file is available in the current directory and is named `parameters.json`. This section shows the commands to configure your {{ site.data.var.wlsFullBrandName }} deployment with the specified database. Replace `yourResourceGroup` with the Azure resource group in which the {{ site.data.var.wlsFullBrandName }} is deployed.
+
+### First, validate your parameters file
+
+The `az group deployment validate` command is very useful to validate your parameters file is syntactically correct.
+
+```bash
+az group deployment validate --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateBasePath }}nestedtemplates/dbTemplate.json
+```
+
+If the command returns with an exit status other than `0`, inspect the output and resolve the problem before proceeding. You can check the exit status by executing the commad `echo $?` immediately after the `az` command.
+
+### Next, execute the template
+
+After successfully validating the template invocation, change `validate` to `create` to invoke the template.
+
+```bash
+az group deployment create --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateBasePath }}nestedtemplates/dbTemplate.json
+```
+
+As with the validate command, if the command returns with an exit status other than `0`, inspect the output and resolve the problem.
+
+This is an example output of successful deployment. Look for `"provisioningState": "Succeeded"` in your output.
+
+```json
+{
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-admin-0602/providers/Microsoft.Resources/deployments/db",
+ "location": null,
+ "name": "db",
+ "properties": {
+ "correlationId": "6fc805b9-1c47-4b32-b9b0-59745a21e559",
+ "debugSetting": null,
+ "dependencies": [
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-admin-0602/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "oraclevm-admin-0602",
+ "resourceName": "adminVM/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-admin-0602/providers/Microsoft.Resources/deployments/3b35b279-0e94-5264-85f5-0d9d662f8a38",
+ "resourceGroup": "oraclevm-admin-0602",
+ "resourceName": "3b35b279-0e94-5264-85f5-0d9d662f8a38",
+ "resourceType": "Microsoft.Resources/deployments"
+ }
+ ],
+ "duration": "PT17.4377546S",
+ "mode": "Incremental",
+ "onErrorDeployment": null,
+ "outputResources": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-admin-0602/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "oraclevm-admin-0602"
+ }
+ ],
+ "outputs": {
+ "artifactsLocationPassedIn": {
+ "type": "String",
+ "value": "{{ armTemplateBasePath }}"
+ }
+ },
+ "parameters": {
+ "_artifactsLocation": {
+ "type": "String",
+ "value": "{{ armTemplateBasePath }}"
+ },
+ "_artifactsLocationDbTemplate": {
+ "type": "String",
+ "value": "{{ armTemplateBasePath }}"
+ }
+ "adminVMName": {
+ "type": "String",
+ "value": "adminVM"
+ },
+ "databaseType": {
+ "type": "String",
+ "value": "postgresql"
+ },
+ "dbPassword": {
+ "type": "SecureString"
+ },
+ "dbUser": {
+ "type": "String",
+ "value": "weblogic@oraclevm"
+ },
+ "dsConnectionURL": {
+ "type": "String",
+ "value": "jdbc:postgresql://oraclevm.postgres.database.azure.com:5432/postgres"
+ },
+ "jdbcDataSourceName": {
+ "type": "String",
+ "value": "jdbc/WebLogicCafeDB"
+ },
+ "location": {
+ "type": "String",
+ "value": "eastus"
+ },
+ "wlsPassword": {
+ "type": "SecureString"
+ },
+ "wlsUserName": {
+ "type": "String",
+ "value": "weblogic"
+ }
+ },
+ "parametersLink": null,
+ "providers": [
+ {
+ "id": null,
+ "namespace": "Microsoft.Resources",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ null
+ ],
+ "properties": null,
+ "resourceType": "deployments"
+ }
+ ]
+ },
+ {
+ "id": null,
+ "namespace": "Microsoft.Compute",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "virtualMachines/extensions"
+ }
+ ]
+ }
+ ],
+ "provisioningState": "Succeeded",
+ "template": null,
+ "templateHash": "6381424766408193665",
+ "templateLink": null,
+ "timestamp": "2020-06-02T06:05:03.141828+00:00"
+ },
+ "resourceGroup": "oraclevm-admin-0602",
+ "type": "Microsoft.Resources/deployments"
+}
+```
+
+## Verify Database Connection
+
+Follow the steps to check if the database has successfully been connected.
+
+* Visit the {{ site.data.var.wlsFullBrandName }} Admin console.
+* In the left navigation pane, expand the **Services** tree node and the **DataSources** child node.
+* Select the row for the JDBC database name, for example `jdbc/WebLogicDB`.
+* Select the **Monitoring** tab and the **Testing** sub-tab.
+* Select `admin` and select **Test Data Source**
+* If the database is enabled, you will see a message similar to "Test of jdbc/WebLogicDB on server admin was successful."
diff --git a/dynamic-cluster/deletenode.md b/dynamic-cluster/deletenode.md
new file mode 100644
index 000000000..40aa025b5
--- /dev/null
+++ b/dynamic-cluster/deletenode.md
@@ -0,0 +1,484 @@
+{% include variables.md %}
+
+# Delete nodes from {{ site.data.var.wlsFullBrandName }}
+
+This page documents how to configure an existing deployment of {{ site.data.var.wlsFullBrandName }} to delete nodes using Azure CLI.
+
+## Prerequisites
+
+### Environment for Setup
+
+* [Azure CLI](https://docs.microsoft.com/en-us/cli/azure), use `az --version` to test if `az` works.
+
+### WebLogic Server Instance
+
+The template will be applied to an existing {{ site.data.var.wlsFullBrandName }} instance. If you don't have one, please create a new instance from the Azure portal, by following the link to the offer [in the index](index.md).
+
+## Prepare the Parameters JSON file
+
+You must construct a parameters JSON file containing the parameters that to the delete-node ARM template. See [Create Resource Manager parameter file](https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/parameter-files) for background information about parameter files. You must specify the information of the existing {{ site.data.var.wlsFullBrandName }} and nodes that to be deleted. This section shows how to obtain the values for the following required properties.
+
+| Parameter Name | Explanation |
+|----------------|-------------|
+| `_artifactsLocation`| See below for details. |
+| `adminVMName`| At deployment time, if this value was changed from its default value, the value used at deployment time must be used. Otherwise, this parameter should be omitted. |
+| `deletingCacheServerNames`| (Optional) Names of cache servers to be deleted, comma delimited. Please ignore this parameter if you are not deleting cache servers. |
+| `deletingManagedServerMachineNames`| The resource names of Azure Virtual Machine hosting managed nodes that you want to delete. |
+| `wlsPassword` | Must be the same value provided at deployment time. |
+| `wlsUserName` | Must be the same value provided at deployment time. |
+
+### `_artifactsLocation`
+
+This value must be the following.
+
+```bash
+{{ armTemplateDeleteNodeBasePath }}
+```
+
+### Server names
+
+This value must be an array of strings, with pattern `^${managedServerPrefix}Storage[0-9]+$`, for example: `["mspStorage1", "mspStorage2"]`.
+
+You can get the server names from WebLogic Server Administration Console, following the steps:
+
+* Go to WebLogic Server Administration Console, http://admin-host:7001/console.
+
+* Go to **Environment** -> **Servers**.
+
+ Server names are listed in the first column.
+
+ If you want to remove coresponding virtual machine, please go to [Machine names](#machine-names) to obtain machine names.
+
+### Machine names
+
+This value must be an array of strings, for example: `["mspVM1", "mspVM2", "mspStorageVM2"]`.
+
+You can get the machine names from WebLogic Server Administration Console, following the steps:
+
+* Go to WebLogic Server Administration Console, http://admin-host:7001/console.
+
+* Go to **Environment** -> **Machines**.
+
+ Open the machine you want to delete.
+
+ Click **Configuration** -> **Node Manager**, you will get compute name from **Listen Address**.
+
+ The Azure Virtual Machine name was set with the same value of compute name during {{ site.data.var.wlsFullBrandName }} deployment.
+
+#### Example Parameters JSON
+
+Here is a fully filled out parameters file. Note that we do not include `adminVMName`.
+
+{{ site.data.var.passwordInFileNote }}
+
+```json
+{
+ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "_artifactsLocation": {
+ "value": "{{ armTemplateDeleteNodeBasePath }}"
+ },
+ "deletingCacheServerNames": {
+ "value": [
+ "mspStorage2"
+ ]
+ },
+ "deletingManagedServerMachineNames": {
+ "value": [
+ "mspVM4",
+ "mspStorageVM2"
+ ]
+ },
+ "wlsPassword": {
+ "value": "welcome1"
+ },
+ "wlsUserName": {
+ "value": "weblogic"
+ }
+ }
+}
+```
+
+## Invoke the delete-node script
+
+To delete managed nodes completely, you have to delete managed nodes logically from the WebLogic Server instance, and physically release Azure resources that host the managed nodes. We realize the two purposes in different ways:
+ * Delete machines logically from WebLogic Server instance by deploying delete-node ARM template with Azure CLI. You have to specify the parameters file.
+ The cluster will restart after deleting the machines, and manages servers may be reallocated to another existing machine.
+ * Release corresponding Azure resources by running Azure CLI commands. The following resources will be removed:
+ * Virtual Machines that host managed nodes that will be deleted.
+ * Data disks attached to the Virtual Machines
+ * OS disks attached to the Virtual Machines
+ * Network Interfaces added to the Virtual Machines
+ * Public IPs attached to the Virtual Machines
+
+We have provided an automation script for above two purposes, you can delete managed nodes easily with the following instructions.
+
+### Invoke the script
+
+Assume your parameters file is available in the current directory and is named `parameters.json`. Replace `yourResourceGroup` with the Azure resource group in which the {{ site.data.var.wlsFullBrandName }} is deployed.
+
+The following command runs the script in silent mode with option `-s`, this mode will delete managed nodes logically and physically.
+
+If you want to keep Azure resources, refer to [advanced usage](#advanced-usage) for further information.
+
+```bash
+$ curl -fsSL {{ armTemplateDeleteNodeBasePath }}scripts/deletenode-cli.sh | /bin/bash -s -- -s -g `yourResourceGroup` -u {{ armTemplateDeleteNodeBasePath }}arm/mainTemplate.json -p parameters.json
+```
+
+The script will validate the template with your parameters file; deploy the template to delete managed servers from WebLogic Server cluster; run Azure CLI commands to delete corresponding Azure resources.
+
+This is an example output of successful deployment, the {{ site.data.var.wlsFullBrandName }} is deployed with Application Gateway. Look for `Completed!` in your output.
+
+```bash
+{
+ "error": null,
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/oraclevm-dcluster-07222/providers/Microsoft.Resources/deployments/mainTemplate",
+ "name": "mainTemplate",
+ "properties": {
+ "correlationId": "be24f5de-1fdf-4fc6-be97-ac53af3ccd3c",
+ "debugSetting": null,
+ "dependencies": [
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/oraclevm-dcluster-07222/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "oraclevm-dcluster-07222",
+ "resourceName": "adminVM/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/oraclevm-dcluster-07222/providers/Microsoft.Resources/deployments/pid-db9aa5e4-1e77-5f54-af38-9a7515cd27ab",
+ "resourceGroup": "oraclevm-dcluster-07222",
+ "resourceName": "pid-db9aa5e4-1e77-5f54-af38-9a7515cd27ab",
+ "resourceType": "Microsoft.Resources/deployments"
+ }
+ ],
+ "duration": "PT0S",
+ "mode": "Incremental",
+ "onErrorDeployment": null,
+ "outputs": null,
+ "parameters": {
+ "_artifactsLocation": {
+ "type": "String",
+ "value": "{{ armTemplateDeleteNodeBasePath }}"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "SecureString"
+ },
+ "adminVMName": {
+ "type": "String",
+ "value": "adminVM"
+ },
+ "deletingManagedServerMachineNames": {
+ "type": "Array",
+ "value": [
+ "mspVM1"
+ ]
+ },
+ "location": {
+ "type": "String",
+ "value": "eastus"
+ },
+ "wlsForceShutDown": {
+ "type": "String",
+ "value": "true"
+ },
+ "wlsPassword": {
+ "type": "SecureString"
+ },
+ "wlsUserName": {
+ "type": "String",
+ "value": "weblogic"
+ }
+ },
+ "parametersLink": null,
+ "providers": [
+ {
+ "id": null,
+ "namespace": "Microsoft.Resources",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ null
+ ],
+ "properties": null,
+ "resourceType": "deployments"
+ }
+ ]
+ },
+ {
+ "id": null,
+ "namespace": "Microsoft.Compute",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "virtualMachines/extensions"
+ }
+ ]
+ }
+ ],
+ "provisioningState": "Succeeded",
+ "template": null,
+ "templateHash": "17905048512558945100",
+ "templateLink": {
+ "contentVersion": "1.0.0.0",
+ "uri": "{{ armTemplateDeleteNodeBasePath }}arm/mainTemplate.json"
+ },
+ "timestamp": "2020-07-23T08:36:10.953240+00:00",
+ "validatedResources": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/oraclevm-dcluster-07222/providers/Microsoft.Resources/deployments/pid-a816a607-eb8a-5aa1-9475-c3fba6994679",
+ "resourceGroup": "oraclevm-dcluster-07222"
+ },
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/oraclevm-dcluster-07222/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "oraclevm-dcluster-07222"
+ },
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/oraclevm-dcluster-07222/providers/Microsoft.Resources/deployments/pid-db9aa5e4-1e77-5f54-af38-9a7515cd27ab",
+ "resourceGroup": "oraclevm-dcluster-07222"
+ }
+ ]
+ },
+ "resourceGroup": "oraclevm-dcluster-07222",
+ "type": "Microsoft.Resources/deployments"
+}
+Command ran in 46.180 seconds (init: 0.064, invoke: 46.116)
+Extension 'resource-graph' is already installed.
+List resource Ids to be deleted:
+/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/oraclevm-dcluster-07222/providers/Microsoft.Compute/virtualMachines/mspVM1
+/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/oraclevm-dcluster-07222/providers/Microsoft.Network/networkInterfaces/mspVM1NIC
+/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/oraclevm-dcluster-07222/providers/Microsoft.Network/publicIPAddresses/mspVM1PublicIP
+/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/ORACLEVM-DCLUSTER-07222/providers/Microsoft.Compute/disks/mspVM1_OsDisk_1_e490d8e72ef14081aea596eab709efef
+/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/ORACLEVM-DCLUSTER-07222/providers/Microsoft.Compute/disks/mspVM1_lun_0_2_bb9f86a391c34e2d8dbe3b1b408d4952
+Are you sure to delete these resources (y/n)?Deleting managed resources...Please do not stop.
+Deleting managed resources...Please do not stop.
+[
+ null,
+ null,
+ null,
+ null,
+ null
+]
+Command ran in 99.764 seconds (init: 0.068, invoke: 99.696)
+
+Complete!
+```
+
+### Advanced usage
+
+If you want to learn more about the script and run it manually, follow the advanced instructions to interact with the ternimal.
+
+ * Download the script
+
+ ```bash
+ $ curl -fsSL {{ armTemplateDeleteNodeBasePath }}scripts/deletenode-cli.sh
+ ```
+
+ You will get a shell script named `deletenode-cli.sh` in your current directory. Usage of the script:
+
+ ```bash
+ ./deletenode-cli.sh -h
+ usage: deletenode-cli.sh -g resource-group [-f template-file] [-u template-url] -p paramter-file [-h]
+ -g Azure Resource Group of the Vitural Machines that host deleting manages servers, must be specified.
+ -f Path of ARM template to delete nodes, must be specified -f option or -u option.
+ -u URL of ARM template, must be specified -f option or -u option.
+ -p Path of ARM parameter, must be specified.
+ -s Execute the script in silent mode. The script will input y automatically for the prompt.
+ -h Help
+ ```
+
+ You can not only run the script with a local template file by specifying `-f` option, but also with a templatle URL using `-u` option.
+
+ * Run the script
+
+ Run the script with your parameters file in your current directory. The following command runs with a template URL:
+
+ ```bash
+ ./deletenode-cli.sh -g yourResourceGroup -u {{ armTemplateDeleteNodeBasePath }}arm/mainTemplate.json -p parameters.json
+ ```
+
+ Before deleting any Azure resource, the script will prompt up message **Are you sure to delete these resources (y/n)?** to comfirm if you want to delete Azure resources. If you input `Y/y`, the Azure resources will be deleted. Otherwise, keep the resource and exit.
+
+ This is an example output of deployment that will not delete Azure resources from your resource group, the {{ site.data.var.wlsFullBrandName }} is deployed with Application Gateway. Look for `Completed!` in your output.
+
+ ```bash
+ {
+ "error": null,
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/oraclevm-dcluster-07222/providers/Microsoft.Resources/deployments/mainTemplate",
+ "name": "mainTemplate",
+ "properties": {
+ "correlationId": "be24f5de-1fdf-4fc6-be97-ac53af3ccd3c",
+ "debugSetting": null,
+ "dependencies": [
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/oraclevm-dcluster-07222/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "oraclevm-dcluster-07222",
+ "resourceName": "adminVM/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/oraclevm-dcluster-07222/providers/Microsoft.Resources/deployments/pid-db9aa5e4-1e77-5f54-af38-9a7515cd27ab",
+ "resourceGroup": "oraclevm-dcluster-07222",
+ "resourceName": "pid-db9aa5e4-1e77-5f54-af38-9a7515cd27ab",
+ "resourceType": "Microsoft.Resources/deployments"
+ }
+ ],
+ "duration": "PT0S",
+ "mode": "Incremental",
+ "onErrorDeployment": null,
+ "outputs": null,
+ "parameters": {
+ "_artifactsLocation": {
+ "type": "String",
+ "value": "{{ armTemplateDeleteNodeBasePath }}"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "SecureString"
+ },
+ "adminVMName": {
+ "type": "String",
+ "value": "adminVM"
+ },
+ "deletingManagedServerMachineNames": {
+ "type": "Array",
+ "value": [
+ "mspVM1"
+ ]
+ },
+ "location": {
+ "type": "String",
+ "value": "eastus"
+ },
+ "wlsForceShutDown": {
+ "type": "String",
+ "value": "true"
+ },
+ "wlsPassword": {
+ "type": "SecureString"
+ },
+ "wlsUserName": {
+ "type": "String",
+ "value": "weblogic"
+ }
+ },
+ "parametersLink": null,
+ "providers": [
+ {
+ "id": null,
+ "namespace": "Microsoft.Resources",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ null
+ ],
+ "properties": null,
+ "resourceType": "deployments"
+ }
+ ]
+ },
+ {
+ "id": null,
+ "namespace": "Microsoft.Compute",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "virtualMachines/extensions"
+ }
+ ]
+ }
+ ],
+ "provisioningState": "Succeeded",
+ "template": null,
+ "templateHash": "17905048512558945100",
+ "templateLink": {
+ "contentVersion": "1.0.0.0",
+ "uri": "{{ armTemplateDeleteNodeBasePath }}arm/mainTemplate.json"
+ },
+ "timestamp": "2020-07-23T08:36:10.953240+00:00",
+ "validatedResources": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/oraclevm-dcluster-07222/providers/Microsoft.Resources/deployments/pid-a816a607-eb8a-5aa1-9475-c3fba6994679",
+ "resourceGroup": "oraclevm-dcluster-07222"
+ },
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/oraclevm-dcluster-07222/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "oraclevm-dcluster-07222"
+ },
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/oraclevm-dcluster-07222/providers/Microsoft.Resources/deployments/pid-db9aa5e4-1e77-5f54-af38-9a7515cd27ab",
+ "resourceGroup": "oraclevm-dcluster-07222"
+ }
+ ]
+ },
+ "resourceGroup": "oraclevm-dcluster-07222",
+ "type": "Microsoft.Resources/deployments"
+}
+Command ran in 46.180 seconds (init: 0.064, invoke: 46.116)
+Extension 'resource-graph' is already installed.
+List resource Ids to be deleted:
+/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/oraclevm-dcluster-07222/providers/Microsoft.Compute/virtualMachines/mspVM1
+/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/oraclevm-dcluster-07222/providers/Microsoft.Network/networkInterfaces/mspVM1NIC
+/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/oraclevm-dcluster-07222/providers/Microsoft.Network/publicIPAddresses/mspVM1PublicIP
+/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/ORACLEVM-DCLUSTER-07222/providers/Microsoft.Compute/disks/mspVM1_OsDisk_1_e490d8e72ef14081aea596eab709efef
+/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/ORACLEVM-DCLUSTER-07222/providers/Microsoft.Compute/disks/mspVM1_lun_0_2_bb9f86a391c34e2d8dbe3b1b408d4952
+Are you sure to delete these resources (y/n)?n
+
+Complete!
+ ```
+
+## Verify
+
+### Verify if the managed servers are deleted from WebLogic Server instance.
+
+* Go to the {{ site.data.var.wlsFullBrandName }} Administration Console.
+* Go to **Environment** -> **Machines**.
+
+ You should see the logical machine names (e.g. `machine-mspVM1`) that have been deleted is not listed in **Name** column.
+
+### Verify if the Azure resources are deleted
+
+* Go to Azure Portal, https://ms.portal.azure.com/.
+* Go to resource group that the {{ site.data.var.wlsFullBrandName }} is deployed.
+
+ You should see corresponding Vitual Machines, Disks, Network Interfaces, Public IPs have been removed.
+
+ For example, I want to delete managed server `msp1`, corresponding Virtual Machine name is `mspVM1`, Azure resource names are:
+ * Virtual Machine: `mspVM1`
+ * Data Disk: `mspVM1_lun_0_2_9d41e2c965744665adb6965625c20d9a`
+ * OS Disk: `mspVM1_OsDisk_1_05a8d81f5d01419a97ee17a45f974dca`
+ * Network Interface: `mspVM1_NIC`
+ * Public IP: `mspVM1_PublicIP`
+
+ All of these resource should be deleted after the script finishes, unless you don't expect to delete them without specifying "Y/y" to the prompt.
+
+
diff --git a/dynamic-cluster/elkNestedTemplate.md b/dynamic-cluster/elkNestedTemplate.md
new file mode 100644
index 000000000..1eaa960f3
--- /dev/null
+++ b/dynamic-cluster/elkNestedTemplate.md
@@ -0,0 +1,408 @@
+{% include variables.md %}
+
+# Land {{ site.data.var.wlsFullBrandName }} logs to Elasticsearch and Kibana
+
+This page documents how to configure an existing deployment of {{ site.data.var.wlsFullBrandName }} to land logs to Elasticsearch and Kibana using Azure CLI.
+
+## Prerequisites
+
+### Environment for Setup
+
+* [Azure CLI](https://docs.microsoft.com/en-us/cli/azure), use `az --version` to test if `az` works.
+
+### WebLogic Server Instance
+
+The ELK ARM template will be applied to an existing {{ site.data.var.wlsFullBrandName }} instance. If you don't have one, please create a new instance from the Azure portal, by following the link to the offer [in the index](index.md).
+
+### Virtual machine size requirement
+Ensure the virtual machines that have been deployed have at least **2.5GB** of memory. The default virtual machine size for WLS does not have enough memory. Use at least `Standard_A2_v2`.
+
+### Elasticsearch instance
+
+Refer to [Create an an Elastic on Azure instance](https://aka.ms/arm-oraclelinux-wls-elk#create-an-an-elastic-on-azure-instance)
+
+## Prepare the Parameters JSON file
+
+You must construct a parameters JSON file containing the parameters to the ELK ARM template. See [Create Resource Manager parameter file](https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/parameter-files) for background information about parameter files.
+
+We must specify the information of the existing {{ site.data.var.wlsFullBrandName }} and Elasticsearch instance. This section shows how to obtain the values for the following required properties.
+
+| Parameter Name | Explanation |
+|----------------|-------------|
+| `_artifactsLocation`| See below for details. |
+| `adminVMName`| Virtual machine name of which hosts the {{ site.data.var.wlsFullBrandName }} admin server. |
+| `elasticsearchEndpoint` | The Elasticsearch endpoint. |
+| `elasticsearchPassword` | Password for the Elasticsearch account. |
+| `elasticsearchUserName` | User name for the Elasticsearch account. |
+| `location` | Must be the same region into which the server was initially deployed. |
+| `logsToIntegrate` | Specify the WebLogic logs to export to Elasticsearch, you must select at least one log. |
+| `managedServerPrefix` | Must be the same prefix with which the cluster was initially deployed. |
+| `maxDynamicClusterSize` | Must be the same value with which the cluster was initially deployed. |
+| `numberOfManagedApplicationInstances` | Number of VMs that have been deployed to host managed application server. |
+| `numberOfManagedCacheInstances` | Number of VMs that have been deployed to host managed cache server, please set the value if your cluster is Coherence cluster. |
+| `wlsDomainName` | Must be the same value provided at initial deployment time. |
+| `wlsPassword` | Must be the same value provided at initial deployment time. |
+| `wlsUserName` | Must be the same value provided at initial deployment time. |
+
+### `_artifactsLocation`
+
+This value must be the following.
+
+```bash
+{{ armTemplateBasePath }}
+```
+
+### Number of Managed application instances
+
+You can get the existing Managed application instances number with the following command using Azure CLI.
+
+```shell
+$ resourceGroup=
+$ managedServerPrefix=
+$ numberOfManagedApplicationInstances=$(az resource list -g ${resourceGroup} --resource-type Microsoft.Compute/virtualMachines --query [*].name | grep "${managedServerPrefix}VM[0-9]" | sed -e 's/[^0-9]/ /g' -e 's/^ *//g' -e 's/ *$//g' | tr -s ' ' | sed 's/ /\n/g' | sort -nr | head -n1)
+$ echo ${numberOfManagedApplicationInstances}
+```
+
+### Number of Managed cache instances
+
+This parameter works for Coherence cluster. If your cluster is not Coherence cluter, keep it with default value `0`.
+
+You can get the existing Managed cache instances number with the following command using Azure CLI. It should be `0` if no value returned.
+
+```shell
+$ resourceGroup=
+$ managedServerPrefix=
+$ numberOfManagedCacheInstances=$(az resource list -g ${resourceGroup} --resource-type Microsoft.Compute/virtualMachines --query [*].name | grep "${managedServerPrefix}StorageVM[0-9]" | sed -e 's/[^0-9]/ /g' -e 's/^ *//g' -e 's/ *$//g' | tr -s ' ' | sed 's/ /\n/g' | sort -nr | head -n1)
+$ echo ${numberOfManagedCacheInstances}
+```
+
+#### Example Parameters JSON
+
+Here is a fully filled out parameters file. We will leave values of `adminUsername`, `authenticationType`, `dnsLabelPrefix`, and `usePreviewImage` as default value.
+
+{{ site.data.var.passwordInFileNote }}
+
+```json
+{
+ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "_artifactsLocation": {
+ "value": "{{ armTemplateBasePath }}"
+ },
+ "adminVMName": {
+ "value": "adminVM"
+ },
+ "elasticsearchEndpoint": {
+ "value": "https://example.eastus2.azure.elastic-cloud.com:9243"
+ },
+ "elasticsearchPassword": {
+ "value": "wlkpsw"
+ },
+ "elasticsearchUserName": {
+ "value": "elastic"
+ },
+ "location": {
+ "value": "eastus"
+ },
+ "managedServerPrefix": {
+ "value": "msp"
+ },
+ "maxDynamicClusterSize": {
+ "value": 8
+ },
+ "numberOfManagedApplicationInstances": {
+ "value": 3
+ },
+ "numberOfManagedCacheInstances": {
+ "value": 0
+ },
+ "wlsDomainName": {
+ "value": "wlsd"
+ },
+ "wlsPassword": {
+ "value": "welcome1"
+ },
+ "wlsUserName": {
+ "value": "weblogic"
+ }
+ }
+}
+```
+
+## Invoke the ARM template
+
+Assume your parameters file is available in the current directory and is named `parameters.json`. This section shows the commands to configure your {{ site.data.var.wlsFullBrandName }} deployment to connect to Elasticsearch and Kinaba intance. Replace `yourResourceGroup` with the Azure resource group in which the {{ site.data.var.wlsFullBrandName }} is deployed.
+
+### First, validate your parameters file
+
+The `az group deployment validate` command is very useful to validate your parameters file is syntactically correct.
+
+```bash
+az deployment group validate --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateBasePath }}nestedtemplates/elkNestedTemplate.json
+```
+
+If the command returns with an exit status other than `0`, inspect the output and resolve the problem before proceeding. You can check the exit status by executing the commad `echo $?` immediately after the `az` command.
+
+### Next, execute the template
+
+After successfully validating the template invocation, change `validate` to `create` to invoke the template.
+
+```bash
+az deployment group create --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateBasePath }}nestedtemplates/elkNestedTemplate.json
+```
+
+As with the validate command, if the command returns with an exit status other than `0`, inspect the output and resolve the problem.
+
+This is an example output of successful deployment. Look for `"provisioningState": "Succeeded"` in your output.
+
+```json
+{
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Resources/deployments/elkNestedTemplate",
+ "location": null,
+ "name": "elkNestedTemplate",
+ "properties": {
+ "correlationId": "61a46b43-27d0-4478-baba-c288059892d5",
+ "debugSetting": null,
+ "dependencies": [
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Compute/virtualMachines/mspVM1/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-elk",
+ "resourceName": "mspVM1/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ },
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Compute/virtualMachines/mspVM2/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-elk",
+ "resourceName": "mspVM2/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ },
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Compute/virtualMachines/mspStorageVM1/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-elk",
+ "resourceName": "mspStorageVM1/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Resources/deployments/pid-e4165284-b017-5df9-9b91-3f11dd8a72e5",
+ "resourceGroup": "haiche-cluster-elk",
+ "resourceName": "pid-e4165284-b017-5df9-9b91-3f11dd8a72e5",
+ "resourceType": "Microsoft.Resources/deployments"
+ },
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-elk",
+ "resourceName": "adminVM/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Compute/virtualMachines/mspVM1/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-elk",
+ "resourceName": "mspVM1/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ },
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-elk",
+ "resourceName": "adminVM/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Compute/virtualMachines/mspVM2/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-elk",
+ "resourceName": "mspVM2/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ },
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-elk",
+ "resourceName": "adminVM/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Compute/virtualMachines/mspStorageVM1/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-elk",
+ "resourceName": "mspStorageVM1/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "duration": "PT8M54.4785762S",
+ "mode": "Incremental",
+ "onErrorDeployment": null,
+ "outputResources": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-elk"
+ },
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Compute/virtualMachines/mspStorageVM1/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-elk"
+ },
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Compute/virtualMachines/mspVM1/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-elk"
+ },
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Compute/virtualMachines/mspVM2/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-elk"
+ }
+ ],
+ "outputs": {
+ "artifactsLocationPassedIn": {
+ "type": "String",
+ "value": "{{ armTemplateBasePath }}"
+ },
+ "logIndex": {
+ "type": "String",
+ "value": "azure-weblogic-cluster-b4e465d5-6ffc-49cf-b1d9-b4dbf6455d0a"
+ }
+ },
+ "parameters": {
+ "_artifactsLocation": {
+ "type": "String",
+ "value": "{{ armTemplateBasePath }}"
+ },
+ "_artifactsLocationELKTemplate": {
+ "type": "String",
+ "value": "{{ armTemplateBasePath }}"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "SecureString"
+ },
+ "adminVMName": {
+ "type": "String",
+ "value": "adminVM"
+ },
+ "elasticsearchEndpoint": {
+ "type": "String",
+ "value": "https://example.eastus2.azure.elastic-cloud.com:9243"
+ },
+ "elasticsearchPassword": {
+ "type": "SecureString"
+ },
+ "elasticsearchUserName": {
+ "type": "String",
+ "value": "elastic"
+ },
+ "guidValue": {
+ "type": "String",
+ "value": "b4e465d5-6ffc-49cf-b1d9-b4dbf6455d0a"
+ },
+ "location": {
+ "type": "String",
+ "value": "eastus"
+ },
+ "logsToIntegrate": {
+ "type": "Array",
+ "value": [
+ "HTTPAccessLog",
+ "ServerLog",
+ "DomainLog",
+ "DataSourceLog",
+ "StandardErrorAndOutput",
+ "NodeManagerLog"
+ ]
+ },
+ "managedServerPrefix": {
+ "type": "String",
+ "value": "msp"
+ },
+ "maxDynamicClusterSize": {
+ "value": 8
+ },
+ "numberOfManagedApplicationInstances": {
+ "type": "Int",
+ "value": 2
+ },
+ "numberOfManagedCacheInstances": {
+ "type": "Int",
+ "value": 1
+ },
+ "wlsDomainName": {
+ "type": "String",
+ "value": "wlsd"
+ },
+ "wlsPassword": {
+ "type": "SecureString"
+ },
+ "wlsUserName": {
+ "type": "String",
+ "value": "weblogic"
+ }
+ },
+ "parametersLink": null,
+ "providers": [
+ {
+ "id": null,
+ "namespace": "Microsoft.Resources",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ null
+ ],
+ "properties": null,
+ "resourceType": "deployments"
+ }
+ ]
+ },
+ {
+ "id": null,
+ "namespace": "Microsoft.Compute",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "virtualMachines/extensions"
+ }
+ ]
+ }
+ ],
+ "provisioningState": "Succeeded",
+ "template": null,
+ "templateHash": "10060935779116645392",
+ "templateLink": null,
+ "timestamp": "2020-11-11T07:29:42.336797+00:00"
+ },
+ "resourceGroup": "haiche-cluster-elk",
+ "type": "Microsoft.Resources/deployments"
+}
+```
+
+## Verify ELK connection
+
+Follow the steps to check if WebLogic Server logs are exported to Elasticsearch.
+
+* Go to Azure portal
+* Copy log index from your resource group -> deployments -> elkNestedTemplate -> output -> logIndex .
+* Go to Elasticsearch cloud and launch Kibana.
+* Create index
+ * Go to Kibana -> Management -> Kibana -> Index Patterns
+ * Click `Create index Patterns`
+ * Input the log index you copy from output in Index pattern
+ * There should be an index you can select, otherwise, the ELK deployment failed
+ * Next step
+ * Select `@timestamp` in Time Filter and hit `Create index pattern`
+* View logs
+ * Go to Kibana -> Discover
+ * Select the index you just created
+ * You will find the WebLogic Server logs listed
diff --git a/dynamic-cluster/index.md b/dynamic-cluster/index.md
new file mode 100644
index 000000000..4835215f2
--- /dev/null
+++ b/dynamic-cluster/index.md
@@ -0,0 +1,26 @@
+# {{ site.data.var.wlsFullBrandName }} Dynamic Cluster
+
+{% include sub-template-01.md %}
+
+Templates available for working with [{{ site.data.var.wlsFullBrandName }} Dynamic Cluster](https://portal.azure.com/#create/oracle.20191021-arm-oraclelinux-wls-dynamic-cluster20191021-arm-oraclelinux-wls-dynamic-cluster):
+
+* [Add Managed application nodes](addnode.md)
+
+* [Add Managed Coherence cache nodes](addnode-coherence.md)
+
+* [Configure a database connection](dbTemplate.md)
+
+* [Configure Azure Active Directory](aadNestedTemplate.md)
+
+* [Configure Coherence cluster](coherenceTemplate.md)
+
+* [Configure custom DNS alias](customDNSTemplate.md)
+
+* [Configure Elasticsearch and Kibana](elkNestedTemplate.md)
+
+* [Configure Azure Network Security Group rules](nsgRulesTemplate.md)
+
+* [Configure Oracle HTTP Server load balancer](ohsNestedTemplate.md)
+
+* [Delete nodes](deletenode.md)
+
diff --git a/dynamic-cluster/nsgRulesTemplate.md b/dynamic-cluster/nsgRulesTemplate.md
new file mode 100644
index 000000000..c7d63674d
--- /dev/null
+++ b/dynamic-cluster/nsgRulesTemplate.md
@@ -0,0 +1,81 @@
+{% include variables.md %}
+
+# Apply Azure Network Security Rule ARM Template to {{ site.data.var.wlsFullBrandName }}
+
+This page documents how to append addtional security rules to an existing Azure Network Security Group deployed with {{ site.data.var.wlsFullBrandName }} using the Azure CLI.
+
+## Prerequisies
+
+### Environment for Setup
+
+* [Azure CLI](https://docs.microsoft.com/en-us/cli/azure), use `az --version` to test if `az` works.
+
+### Azure Network Security Group
+
+The Azure Network Security Rule ARM template will be applied to an existing Azure Network Security Group (NSG) instance. If you don't have one, please create a new instance from the Azure portal, by following the link to the offer [in the index](index.md).
+
+### Prepare the Parameters JSON file
+
+You must construct a parameter JSON file containing the parameters to the NSG template. See [Create Resource Manager parameter file](https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/parameter-files) for background information about parameter files. The options to this template declare the desired configuration of the NSG.
+
+| Parameter Name | Description |
+| `denyPublicTrafficForAdminServer` | Deny public tranffic for the admin server on port 7001, 7002. |
+| `denyPublicTrafficForManagedServer` | Deny public tranffic for the managed servers on port 8001. |
+| `enableOHS` | We deal with the configuration for managed servers when the OHS load balancer is enabled. |
+| `networkSecurityGroupName` | The name of the NSG. |
+
+#### Example Parameters JSON file
+
+Here is a fully filled out parameters file, assuming the {{ site.data.var.wlsFullBrandName }} was deployed accepting the default values.
+
+```json
+{
+ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "denyPublicTrafficForManagedServer": {
+ "value": true
+ },
+ "denyPublicTrafficForAdminServer": {
+ "value": false
+ },
+ "enableOHS": {
+ "value": true
+ },
+ "networkSecurityGroupName": {
+ "value": "wls-nsg"
+ }
+ }
+}
+```
+
+## Invoke the ARM template
+
+This section shows how to kick off the deployment step-by-step. After the deployment, your existing NSG will append two additional Inbound Rules for admin and managed servers. Here we assume you have the parameter file in the current directory, the file is named `parameters.json`, and your NSG is named `wls-nsg`. Don't forget to replace `yourResourceGroup` with the Azure resource group in which the NSG is created.
+
+### First, validate your parameters file
+
+The `az group deployment validate` command is very useful to validate your parameters file is syntactically correct.
+
+```bash
+az group deployment validate --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateBasePath }}nestedtemplates/nsgNestedTemplate.json
+```
+
+If the command returns with an exit status other than `0`, inspect the output and resolve the problem before proceeding. You can check the exit status by executing the commad `echo $?` immediately after the `az` command.
+
+### Next, execute the template with it
+
+After successfully validating the template invocation, change `validate` to `create` to invoke the template.
+
+```bash
+az group deployment create --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateBasePath }}nestedtemplates/nsgNestedTemplate.json
+```
+
+## Verify the rules have been appended to the Azure Network Security Group successfully
+
+When the deployment is completed, you can verify the appended rules via Azure Portal
+* Visit the Azure Network Security Group under your resource group used above.
+* Go to `Settings -> Inbound security rules`.
+* Verify there is a rule named `WebLogicAdminPortsAllowed` with **Priority = '210'; Port = '7001, 7002'; Protocol = 'TCP'; Source = '10.0.0.0/24'; Aciton = 'Allow'**.
+* Verify there is a rule named `WebLogicManagedPortsDenied` with **Priority = '221'; Port = '8001'; Protocol = '*'; Aciton = 'Deny'**.
+
diff --git a/dynamic-cluster/ohsNestedTemplate.md b/dynamic-cluster/ohsNestedTemplate.md
new file mode 100644
index 000000000..f9a774d53
--- /dev/null
+++ b/dynamic-cluster/ohsNestedTemplate.md
@@ -0,0 +1,211 @@
+
+{% include variables.md %}
+
+# Apply OHS ARM Template to {{ site.data.var.wlsFullBrandName }}
+
+This page documents how to configure an existing deployment of {{ site.data.var.wlsFullBrandName }} with a Oracle HTTP Server using Azure CLI.
+
+## Prerequisites
+
+### Environment for Setup
+
+* [Azure CLI](https://docs.microsoft.com/en-us/cli/azure), use `az --version` to test if `az` works.
+
+### WebLogic Server Instance
+
+The template will be applied to an existing {{ site.data.var.wlsFullBrandName }} instance. If you don't have one, please create a new instance from the Azure portal, by following the link to the offer [in the index](index.md).
+
+### Certificate for SSL Termination
+
+Oracle HTTP Server serves as the front end load balancer for the {{ site.data.var.wlsFullBrandName }} dynamic cluster, hence it must be provided with a certificate to allow browsers to connect via SSL.
+
+#### Creating Self-signed certificate
+
+This section describes how to create a self-signed certificate in the format expected by Oracle HTTP server. The example provided below is one of the ways to create self-signed certificates. Note that such self-signed certificates created should only be used for testing purpose and it is not recommended for production purpose.
+
+* JKS format certificate
+
+ ```bash
+ keytool -genkey -keyalg RSA -alias selfsigned -keystore keyStore.jks -storepass password -validity 360 -keysize 2048
+ ```
+
+ Provide all information prompted and store in a file.
+
+* PKCS12 format certificate
+
+ ```bash
+ openssl req -newkey rsa:2048 -x509 -keyout key.pem -out out.pem -days 3650
+ ```
+
+ Provide all information prompted and store in a file.
+
+## Prepare the Parameters JSON file
+
+You must construct a parameters JSON file containing the parameters to the OHS ARM template. See [Create Resource Manager parameter file](https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/parameter-files) for background information about parameter files. We must specify the information of the existing SSL certificate. This section shows how to obtain the values for the following required properties.
+
+| Parameter Name | Explanation |
+|----------------|-------------|
+| `_artifactsLocation`| See below for details. |
+|`adminPasswordOrKey`|Password of administration account for the new Virtual Machine that hosts Oracle HTTP Server.|
+|`adminUsername`| Username of administration account for the new Virtual Machine that hosts Oracle HTTP Server.|
+|`adminRestMgmtURL`| WebLogic Server admin REST management URL. It should be in the format `http://admincomputername:adminport/management/weblogic/latest`.Example `http://adminVM:7001/management/weblogic/latest` or `http://adminVM:7005/management/weblogic/latest` |
+|`dnsLabelPrefix`| Must be the same `dnsLabelPrefix` value with which WebLogic Dynamic cluster deployment is made. This value is used for fetching existing deployment `dnsLabelPrefix-nsg` NSG value. |
+|`location`| Must be the same region into which the WebLogic dynamic cluster deployment is made.|
+|`ohsComponentName` | Oracle HTTP Server component name to be configured as part of domain. At deployment, if this value is changed from its default value, the value used at deployment time must be used.|
+|`ohsDomainName`| Oracle HTTP Server standalone domain name. At deployment, if this value is changed from its default value, the value used at deployment time must be used. |
+|`ohsNMPassword`| Oracle HTTP Server NodeManager password configured as part of the domain. |
+|`ohsNMUser`| Oracle HTTP Server NodeManager user name configured as part of the domain.|
+|`keyType` | Certificate format supported for configuring Oracle HTTP Server SSL configuration. Supported format is `JKS` and `PKCS12`. Default value is `PKCS12`|
+|`ohsSSLKeystoreData`| base64 bit encoded value of JKS/PKCS12 certificate contents. See below for details|
+|`ohsSSLKeystorePassword`|The keystore stored password |
+|`ohsSkuUrnVersion`| Oracle HTTP Server base images provided by publisher Oracle. Refer [Azure Marketplace OHS Base Images](https://azuremarketplace.microsoft.com/en-us/marketplace/apps?search=oracle%20ohs%20base%20image) |
+|`ohsVMName`|At deployment time, if this value is changed from its default value, the value used at deployment time must be used. Otherwise, this parameter should be omitted.|
+|`ohshttpPort` | Http server port configured using which application can be accessed via Oracle HTTP Server.At deployment, if this value is changed from its default value, the value used at deployment time must be used.|
+|`ohshttpsPort`| Https server port configured using which application can be accessed via Oracle HTTP Server.At deployment, if this value is changed from its default value, the value used at deployment time must be used.|
+|`oracleVaultPswd` | Password for Oracle wallet/vault, to add certificates supplied for OHS.|
+|`storageAccountName`| The name of an existing storage account. Must be the same storage account name avilable in existing deployed WebLogic dynamic cluster|
+|`virtualNetworkName`| The name of an existing virtual network name. Must be the same virtual network name available in existing deployed WebLogic dynamic cluster|
+|`wlsUserName` |Must be the same value provided at deployment time for WebLogic dynamic cluster deployment time.|
+|`wlsPassword` |Must be the same value provided at deployment time WebLogic dynamic cluster deployment time.|
+
+
+### `_artifactsLocation`
+
+This value must be the following.
+
+```bash
+{{ armTemplateBasePath }}
+```
+
+### `ohsSSLKeystoreData`
+Use base64 to encode your existing SSL certificate.
+
+ base64 your-JKS/PKCS12-certificate-contents -w 0 > temp.txt
+
+Use temp.txt contents to set the value for ohsSSLKeystoreData
+
+#### Example Parameters JSON
+
+Here is a fully filled out parameters file. Note that we did not include any optional parameters, assuming the {{ site.data.var.wlsFullBrandName }} was deployed accepting the default values.
+
+{{ site.data.var.passwordInFileNote }}
+
+```json
+{
+ "_artifactsLocation": {
+ "value": "{{ armTemplateBasePath }}"
+ },
+ "adminPasswordOrKey": {
+ "value": "Azure123456!"
+ },
+ "adminRestMgmtURL": {
+ "value": "http://adminVM:7001/management/weblogic/latest"
+ },
+ "adminUsername": {
+ "value": "azureuser"
+ },
+ "dnsLabelPrefix": {
+ "value": "wls"
+ },
+ "keyType": {
+ "value": "JKS"
+ },
+ "location": {
+ "value": "eastus"
+ },
+ "ohsComponentName": {
+ "value": "ohs_component"
+ },
+ "ohsDomainName": {
+ "value": "ohsStandaloneDomain"
+ },
+ "ohsNMPassword": {
+ "value": "Nmpswd1234567"
+ },
+ "ohsNMUser": {
+ "value": "weblogic"
+ },
+ "ohsSSLKeystoreData": {
+ "value": "/u3+7QAAAAIAAAABAAAAAQAKc2VsZnNpZ25lZAAAAX ...."
+ },
+ "ohsSSLKeystorePassword": {
+ "value": "azure123!"
+ },
+ "ohsSkuUrnVersion": {
+ "value": "ohs-122140-jdk8-ol76;ohs-122140-jdk8-ol76;latest"
+ },
+ "ohsVMName": {
+ "value": "ohsVM"
+ },
+ "ohshttpPort": {
+ "value": "7777"
+ },
+ "ohshttpsPort": {
+ "value": "4444"
+ },
+ "oracleVaultPswd": {
+ "value": "Welcome1234567"
+ },
+ "storageAccountName": {
+ "value": "6be282olvm"
+ },
+ "virtualNetworkName": {
+ "value": "wlsd_VNET"
+ },
+ "wlsPassword": {
+ "value": "Welcome1234567"
+ },
+ "wlsUserName": {
+ "value": "weblogic"
+ }
+}
+```
+
+### Invoke the ARM template
+Assume your parameters file is available in the current directory and is named parameters.json. This section shows the commands to configure your {{ site.data.var.wlsFullBrandName }} deployment with a Oracle HTTP Server. Replace yourResourceGroup with the Azure resource group in which the {{ site.data.var.wlsFullBrandName }} is deployed.
+
+### First, validate your parameters file
+The `az deployment group validate` command is very useful to validate your parameters file is syntactically correct.
+
+```bash
+az deployment group validate --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateBasePath }}nestedtemplates/ohsNestedTemplate.json
+```
+If the command returns with an exit status other than `0`, inspect the output and resolve the problem before proceeding. You can check the exit status by executing the commad `echo $?` immediately after the `az` command.
+
+### Next, execute the template
+After successfully validating the template invocation, change `validate` to `create` to invoke the template.
+
+```bash
+az deployment group create --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateBasePath }}nestedtemplates/ohsNestedTemplate.json
+```
+As with the validate command, if the command returns with an exit status other than 0, inspect the output and resolve the problem.
+
+This is an example output of successful deployment. Look for `"provisioningState": "Succeeded"` in your output.
+
+```bash
+ "provisioningState": "Succeeded",
+ "template": null,
+ "templateHash": "13760326614657528322",
+```
+
+## Verify Oracle HTTP Server setup
+
+Successful deployment provides Oracle HTTP Server access url in your output, similar to below.
+
+```json
+ "ohsAccessURL": {
+ "type": "String",
+ "value": "http://wls-5ff4cab395-loadbalancer.eastus.cloudapp.azure.com:7777"
+ },
+ "ohsSecureAccessURL": {
+ "type": "String",
+ "value": "https://wls-5ff4cab395-loadbalancer.eastus.cloudapp.azure.com:4444"
+ }
+```
+
+Follow the steps to verify Oracle HTTP Server.
+* Visit the {{ site.data.var.wlsFullBrandName }} Admin console.
+* In the left navigator, expand the tree to select **Deployments**, install some sample application targeted to WebLogic Cluster and start the service.
+* Access your application using ohsAccessURL/application
+* Access your application using ohsSecureAccessURL/application
+
diff --git a/index.html b/index.html
new file mode 100644
index 000000000..a21e7ef4f
--- /dev/null
+++ b/index.html
@@ -0,0 +1,5 @@
+
+
+Redirecting to https://docs.oracle.com/en/middleware/standalone/weblogic-server/wlazu/
+
+
diff --git a/release-notes/index.md b/release-notes/index.md
new file mode 100644
index 000000000..a539f30c9
--- /dev/null
+++ b/release-notes/index.md
@@ -0,0 +1,100 @@
+# Release Notes
+
+## 2020-Q2
+
+### Features that apply to all offers
+
+* Choice of five different base images.
+
+ | WebLogic Server Version | Oracle JDK Version | Oracle Linux Version |
+ |-------------------------|--------------------|----------------------|
+ | 12.2.1.3.0 | 8 | 7.4 |
+ | 12.2.1.3.0 | 8 | 7.3 |
+ | 12.2.1.4.0 | 8 | 7.6 |
+ | 14.1.1.0.0 | 8 | 7.6 |
+ | 14.1.1.0.0 | 11 | 7.6 |
+
+### arm-oraclelinux-wls
+
+* No additional new features.
+
+### arm-oraclelinux-wls-admin
+
+* Database integration from portal.
+
+* Azure Active Directory Domain Services LDAP integration from portal.
+
+### arm-oraclelinux-wls-cluster
+
+* Database integration from portal.
+
+* Azure Active Directory Domain Services LDAP integration from portal.
+
+* Azure App Gateway integration from portal.
+
+### arm-oraclelinux-wls-dynamic-cluster
+
+* Database integration from portal.
+
+* Azure Active Directory Domain Services (Azure AD DS) LDAP integration from portal.
+
+### Known Issues
+
+* Azure AD DS integration does not work for WebLogic Server 14.
+
+* For cluster offers, the maximum recommended number of VMs per deployment is 20. This is due to the default limits for storage accounts. For more information see [Azure subscription and service limits, quotas, and constraints](https://docs.microsoft.com/en-us/azure/azure-resource-manager/management/azure-subscription-service-limits#storage-limits).
+ * Customers may experience Azure IaaS VM performance issues if too many OS and/or data disk VHD files are stored in each Storage Account
+ * Storage Accounts are limited to **20,000 IOPS**
+ * We expect each disk to experience up to **500 IOPS**
+ * We can determine approximately how many OS and data disk VHD files, as a maximum number, should reside in each storage account
+ * 20,000 IOPS / 500 per-disk IOPS = 40 VHDs max per Storage Account
+ * Each VM uses two VHDs, therefore 20 VMs.
+
+### Source Tags and Marketplace Bundle Versions
+
+| Repository Name | GitHub Tag Link | Corresponding Marketplace Bundle Version |
+|-----------------|-----------------|------------------------------------------|
+| arm-oracle-linux-wls | [v1.0.0](https://github.com/wls-eng/arm-oraclelinux-wls/releases/tag/v1.0.0) | 1.0.17 |
+| arm-oraclelinux-wls-admin | [v1.0.0](https://github.com/wls-eng/arm-oraclelinux-wls-admin/releases/tag/v1.0.0) | 1.0.21 |
+| arm-oraclelinux-wls-cluster | [v1.0.0](https://github.com/wls-eng/arm-oraclelinux-wls-cluster/releases/tag/v1.0.0) | 1.0.290000 |
+| arm-oraclelinux-wls-dynamic-cluster | [v1.0.0](https://github.com/wls-eng/arm-oraclelinux-wls-dynamic-cluster/releases/tag/v1.0.0) | 1.0.19 |
+
+-----------------------------------------------------------------
+
+## 2019-Q4
+
+### Features that apply to all offers
+
+* Network Security Group pre-created with correct ports for WebLogic Server.
+
+### arm-oraclelinux-wls
+
+* Single node with no domain pre-created.
+
+### arm-oraclelinux-wls-admin
+
+* Single node with domain pre-created with admin server running.
+
+* Database integration via script execution on admin server.
+
+### arm-oraclelinux-wls-cluster
+
+* Configured cluster with arbitrary number of nodes.
+
+* Database integration via script execution on admin server.
+
+### arm-oraclelinux-wls-dynamic-cluster
+
+* Dynamic cluster with arbitrary number of nodes.
+
+* Database integration via script execution on admin server.
+
+### Source Tags and Marketplace Bundle Versions
+
+| Repository Name | GitHub Tag Link | Corresponding Marketplace Bundle Version |
+|-----------------|-----------------|------------------------------------------|
+| arm-oracle-linux-wls | [v0.6.0](https://github.com/wls-eng/arm-oraclelinux-wls/releases/tag/v0.6.0) | 1.0.16 |
+| arm-oraclelinux-wls-admin | [v0.6.0](https://github.com/wls-eng/arm-oraclelinux-wls-admin/releases/tag/v0.6.0) | 1.0.14 |
+| arm-oraclelinux-wls-cluster | [v0.6.0](https://github.com/wls-eng/arm-oraclelinux-wls-cluster/releases/tag/v0.6.0) | 1.0.17 |
+| arm-oraclelinux-wls-dynamic-cluster | [v0.6.0](https://github.com/wls-eng/arm-oraclelinux-wls-dynamic-cluster/releases/tag/v0.6.0) | 1.0.11 |
+
diff --git a/resources/basicauth.war b/resources/basicauth.war
new file mode 100644
index 000000000..8583b11ac
Binary files /dev/null and b/resources/basicauth.war differ
diff --git a/resources/coherence-sample.war b/resources/coherence-sample.war
new file mode 100644
index 000000000..324c3b334
Binary files /dev/null and b/resources/coherence-sample.war differ
diff --git a/resources/webtestapp.war b/resources/webtestapp.war
new file mode 100644
index 000000000..7eb9c92d5
Binary files /dev/null and b/resources/webtestapp.war differ
diff --git a/subtemplate-src/addnode-coherence.md b/subtemplate-src/addnode-coherence.md
new file mode 100644
index 000000000..2c601d597
--- /dev/null
+++ b/subtemplate-src/addnode-coherence.md
@@ -0,0 +1,572 @@
+{% include variables.md %}
+
+# Add cache managed server to {{ site.data.var.wlsFullBrandName }} Coherence cluster
+
+This page documents how to configure an existing deployment of {{ site.data.var.wlsFullBrandName }} to add new managed cache server using Azure CLI.
+
+## Prerequisites
+
+### Environment for Setup
+
+* [Azure CLI](https://docs.microsoft.com/en-us/cli/azure), use `az --version` to test if `az` works.
+
+### WebLogic Server Instance
+
+The `addnode-coherence.json` template will be applied to an existing {{ site.data.var.wlsFullBrandName }} **Coherence** cluster. If you don't have one, please create a new instance from the Azure portal, by following the link to the offer [in the index](index.md).
+
+### Coherence cluster
+
+You can configure Coherence cluster from Azure portal or running Coherence sub template.
+
+* Configure Coherence cluster from Azure portal
+
+ Select `yes` in Coherence section and input required settings, the Azure WebLogic IaaS offer will configure a Coherence cluster automatically.
+
+* Configure Coherence cluster via Coherence sub template
+
+ Refer to [Configure Coherence cluster](coherenceTemplate.html).
+
+## Prepare the Parameters JSON file
+
+You must construct a parameters JSON file containing the parameters to `addnode-coherence.json` template. See [Create Resource Manager parameter file](https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/parameter-files) for background information about parameter files. You must specify the information of the existing {{ site.data.var.wlsFullBrandName }} and nodes that to be added. This section shows how to obtain the values for the following required properties.
+
+
+
+
Parameter Name
+
Explanation
+
+
+
_artifactsLocation
+
See below for details.
+
+
+
elkSettings
+
Optional. JSON object type. You can specify this parameters for Elasticsearch and Kibana(ELK) connection. If enable is true, must specify other properties. See the page WebLogic with Elastic on Azure for further information.
+
+
+
+
enable
+
If enable is true, must specify all properties of the elkSettings.
+
+
+
+
elasticsearchEndpoint
+
Endpoint of the Elasticsearch instance.
+
+
+
+
elasticsearchPassword
+
Password for Elasticsearch account.
+
+
+
+
elasticsearchUserName
+
User name for Elasticsearch account.
+
+
+
+
logIndex
+
Must be the same value output at ELK deployment time.
+
+
+
+
logsToIntegrate
+
Array with string value. Specify the expeted logs to integrate, you must input at least one log.
+
+
+
adminPasswordOrKey
+
Password of administration account for the new Virtual Machine that host new nodes.
+
+
+
adminVMName
+
Virtual machine name of which hosts the {{ site.data.var.wlsFullBrandName }} admin server, for example: adminVM.
+
+
enableCoherenceWebLocalStorage
+
Specifies whether Local Storage is enabled for the Coherence*Web cluster tier.
+
+
+
location
+
Must be the same region into which the server was initially deployed.
+
+
+
managedServerPrefix
+
Must be the same prefix with which the cluster was initially deployed.
+
+
+
numberOfExistingCacheNodes
+
Number of existing Coherence cache servers, used to name new virtual machines and new managed server.
+
+
+
numberOfNewCacheNodes
+
Number of new Coherence cahce servers, used to create Virtual Machines and Managed Server.
+
+
+
skuUrnVersion
+
Must be the same urn with which the cluster was initially deployed.
+
+
+
storageAccountName
+
The name of an existing storage account.
+
+
+
vmSizeSelectForCoherence
+
Select appropriate VM Size for Coherence cache servers.
+
+
+
wlsDomainName
+
Must be the same value provided at deployment time.
+
+
+
wlsPassword
+
Must be the same value provided at deployment time.
+
+
+
wlsUserName
+
Must be the same value provided at deployment time.
+
+
+
+### `_artifactsLocation`
+
+This value must be the following.
+
+```bash
+{{ armTemplateAddCacheNodeBasePath }}
+```
+
+### Existing cache nodes
+To differentiate functionality of managed cache servers, we use **managed application server** to represent managed servers that host Java EE application, and use **managed cache server** to represent managed servers that used for cache.
+
+You can get the existing managed cache servers with the following command:
+
+```shell
+$ resourceGroup=
+$ managedServerPrefix=
+$ numberOfExistingCacheNodes=$(az resource list -g ${resourceGroup} --resource-type Microsoft.Compute/virtualMachines --query [*].name | grep "${managedServerPrefix}StorageVM[0-9]" | sed -e 's/[^0-9]/ /g' -e 's/^ *//g' -e 's/ *$//g' | tr -s ' ' | sed 's/ /\n/g' | sort -nr | head -n1)
+$ echo ${numberOfExistingCacheNodes}
+```
+
+### Log index
+
+If you configured ELK in your cluster to export WebLogic Server logs to ELK, please input the value of Kibana log index, this template will set up ELK connection and export logs to specified index.
+
+You can get the value from Azure portal with the following steps:
+
+* Go to Azure portal.
+* Open you resource group and click **Deployments**.
+* Open the ELK deployment, and click **Output**.
+* Copy the value of `logIndex`.
+
+Alternatively, use Azure CLI command to list log index inside the resource group deployments:
+
+```shell
+$ az deployment group list -g 'yourResourceGroup' --query [*].properties.outputs.logIndex.value
+[
+ "azure-weblogic-cluster-f984df74-ab4d-4c17-a532-7f248659fb28"
+]
+```
+
+### Storage account
+
+Each Storage Account handles up to 20,000 IOPS, and 500TB of data. If you use a storage account for Standard Virtual Machines, you can store until 40 virtual disks.
+
+We have two disks for one Virtual Machine, it's suggested no more than 20 Virtual Machines share the same storage account. Number of virtual machines that hosting managed servers should be less than or equal to 20.
+
+You can get the name of storage account from Azure portal with steps:
+
+ * Go to Azure portal
+ * Go to the your resource group
+ * Find storage account resource and copy its name
+
+Alternatively, use Azure CLI command to list storage account inside a resource group:
+
+```shell
+$ az resource list -g 'yourResourceGroup' --resource-type Microsoft.Storage/storageAccounts --query [*].name
+[
+ "219846olvm"
+]
+```
+
+#### Example Parameters JSON
+
+Here is a fully filled out parameters file. We will leave values of `adminUsername`, `authenticationType`, `dnsLabelPrefix`, `usePreviewImage` and `vmSizeSelectForCoherence` as default value.
+
+{{ site.data.var.passwordInFileNote }}
+
+```json
+{
+ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "_artifactsLocation": {
+ "value": "{{ armTemplateAddCacheNodeBasePath }}"
+ },
+ "adminPasswordOrKey": {
+ "value": "jyfRat@nht2019"
+ },
+ "adminVMName": {
+ "value": "adminVM"
+ },
+ "elkSettings": {
+ "value": {
+ "enable": true,
+ "elasticsearchEndpoint":"https://example.eastus2.azure.elastic-cloud.com:9243",
+ "elasticsearchPassword": "Secret123!",
+ "elasticsearchUserName":"elastic",
+ "logIndex": "azure-weblogic-dynamic-cluster-11122020",
+ "logsToIntegrate": ["HTTPAccessLog", "ServerLog", "DomainLog", "DataSourceLog", "StandardErrorAndOutput", "NodeManagerLog"]
+ }
+ },
+ "enableCoherenceWebLocalStorage": {
+ "value": true
+ },
+ "location": {
+ "value": "eastus"
+ },
+ "managedServerPrefix": {
+ "value": "msp"
+ },
+ "numberOfExistingCacheNodes": {
+ "value": 1
+ },
+ "numberOfNewCacheNodes": {
+ "value": 1
+ },
+ "skuUrnVersion": {
+ "value": "owls-122140-8u251-ol76;Oracle:weblogic-122140-jdk8u251-ol76:owls-122140-8u251-ol7;latest"
+ },
+ "storageAccountName": {
+ "value": "d40140olvm"
+ },
+ "wlsDomainName": {
+ "value": "wlsd"
+ },
+ "wlsPassword": {
+ "value": "welcome1"
+ },
+ "wlsUserName": {
+ "value": "weblogic"
+ }
+ }
+}
+```
+
+## Invoke the ARM template
+
+Assume your parameters file is available in the current directory and is named `parameters.json`. This section shows the commands to configure your {{ site.data.var.wlsFullBrandName }} deployment to add new nodes. Replace `yourResourceGroup` with the Azure resource group in which the {{ site.data.var.wlsFullBrandName }} is deployed.
+
+### First, validate your parameters file
+
+The `az deployment group validate` command is very useful to validate your parameters file is syntactically correct.
+
+```bash
+az deployment group validate --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateAddCacheNodeBasePath }}arm/mainTemplate.json
+```
+
+If the command returns with an exit status other than `0`, inspect the output and resolve the problem before proceeding. You can check the exit status by executing the commad `echo $?` immediately after the `az` command.
+
+### Next, execute the template
+
+After successfully validating the template invocation, change `validate` to `create` to invoke the template.
+
+```bash
+az deployment group create --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateAddCacheNodeBasePath }}arm/mainTemplate.json
+```
+
+As with the validate command, if the command returns with an exit status other than `0`, inspect the output and resolve the problem.
+
+This is an example output of successful deployment. Look for `"provisioningState": "Succeeded"` in your output.
+
+```bash
+{
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Resources/deployments/mainTemplate",
+ "location": null,
+ "name": "mainTemplate",
+ "properties": {
+ "correlationId": "19040fc8-2b74-4e64-9dd9-59a5a3ce401a",
+ "debugSetting": null,
+ "dependencies": [
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Compute/virtualMachines/mspStorageVM2/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "mspStorageVM2/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Resources/deployments/pid-157ea8ac-12ae-11eb-adc1-0242ac120002",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "pid-157ea8ac-12ae-11eb-adc1-0242ac120002",
+ "resourceType": "Microsoft.Resources/deployments"
+ },
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Network/publicIPAddresses/mspStorageVM2_PublicIP",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "mspStorageVM2_PublicIP",
+ "resourceType": "Microsoft.Network/publicIPAddresses"
+ }
+ ],
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Network/networkInterfaces/mspStorageVM2_NIC",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "mspStorageVM2_NIC",
+ "resourceType": "Microsoft.Network/networkInterfaces"
+ },
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Network/networkInterfaces/mspStorageVM2_NIC",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "mspStorageVM2_NIC",
+ "resourceType": "Microsoft.Network/networkInterfaces"
+ },
+ {
+ "apiVersion": "2019-06-01",
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Storage/storageAccounts/33f2e3olvm",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "33f2e3olvm",
+ "resourceType": "Microsoft.Storage/storageAccounts"
+ }
+ ],
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Compute/virtualMachines/mspStorageVM2",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "mspStorageVM2",
+ "resourceType": "Microsoft.Compute/virtualMachines"
+ },
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Compute/virtualMachines/mspStorageVM2",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "mspStorageVM2",
+ "resourceType": "Microsoft.Compute/virtualMachines"
+ },
+ {
+ "actionName": "listKeys",
+ "apiVersion": "2019-04-01",
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Storage/storageAccounts/33f2e3olvm",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "33f2e3olvm",
+ "resourceType": "Microsoft.Storage/storageAccounts"
+ }
+ ],
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Compute/virtualMachines/mspStorageVM2/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "mspStorageVM2/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "duration": "PT10M24.4018847S",
+ "mode": "Incremental",
+ "onErrorDeployment": null,
+ "outputResources": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Compute/virtualMachines/mspStorageVM2",
+ "resourceGroup": "haiche-cluster-1106"
+ },
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Compute/virtualMachines/mspStorageVM2/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-1106"
+ },
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Network/networkInterfaces/mspStorageVM2_NIC",
+ "resourceGroup": "haiche-cluster-1106"
+ },
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Network/publicIPAddresses/mspStorageVM2_PublicIP",
+ "resourceGroup": "haiche-cluster-1106"
+ }
+ ],
+ "outputs": {
+ "artifactsLocationPassedIn": {
+ "type": "String",
+ "value": "{{ armTemplateAddCacheNodeBasePath }}"
+ }
+ },
+ "parameters": {
+ "_artifactsLocation": {
+ "type": "String",
+ "value": "{{ armTemplateAddCacheNodeBasePath }}"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "SecureString"
+ },
+ "adminPasswordOrKey": {
+ "type": "SecureString"
+ },
+ "adminUsername": {
+ "type": "String",
+ "value": "weblogic"
+ },
+ "adminVMName": {
+ "type": "String",
+ "value": "adminVM"
+ },
+ "authenticationType": {
+ "type": "String",
+ "value": "password"
+ },
+ "dnsLabelPrefix": {
+ "type": "String",
+ "value": "wls"
+ },
+ "enableCoherenceWebLocalStorage": {
+ "type": "Bool",
+ "value": true
+ },
+ "guidValue": {
+ "type": "String",
+ "value": "d5dde421-44b0-48df-9d12-db02374654d3"
+ },
+ "location": {
+ "type": "String",
+ "value": "eastus"
+ },
+ "managedServerPrefix": {
+ "type": "String",
+ "value": "msp"
+ },
+ "numberOfExistingCacheNodes": {
+ "type": "Int",
+ "value": 1
+ },
+ "numberOfNewCacheNodes": {
+ "type": "Int",
+ "value": 1
+ },
+ "skuUrnVersion": {
+ "type": "String",
+ "value": "owls-122130-8u131-ol74;Oracle:weblogic-122130-jdk8u131-ol74:owls-122130-8u131-ol7;latest"
+ },
+ "storageAccountName": {
+ "type": "String",
+ "value": "33f2e3olvm"
+ },
+ "usePreviewImage": {
+ "type": "Bool",
+ "value": false
+ },
+ "vmSizeSelectForCoherence": {
+ "type": "String",
+ "value": "Standard_A1"
+ },
+ "wlsDomainName": {
+ "type": "String",
+ "value": "wlsd"
+ },
+ "wlsPassword": {
+ "type": "SecureString"
+ },
+ "wlsUserName": {
+ "type": "String",
+ "value": "weblogic"
+ }
+ },
+ "parametersLink": null,
+ "providers": [
+ {
+ "id": null,
+ "namespace": "Microsoft.Resources",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ null
+ ],
+ "properties": null,
+ "resourceType": "deployments"
+ }
+ ]
+ },
+ {
+ "id": null,
+ "namespace": "Microsoft.Network",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "publicIPAddresses"
+ },
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "networkInterfaces"
+ }
+ ]
+ },
+ {
+ "id": null,
+ "namespace": "Microsoft.Compute",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "virtualMachines"
+ },
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "virtualMachines/extensions"
+ }
+ ]
+ }
+ ],
+ "provisioningState": "Succeeded",
+ "template": null,
+ "templateHash": "16596437850900945013",
+ "templateLink": null,
+ "timestamp": "2020-11-09T06:28:40.936524+00:00"
+ },
+ "resourceGroup": "haiche-cluster-1106",
+ "type": "Microsoft.Resources/deployments"
+}
+```
+
+## Verify
+
+### Verify if new cache nodes are added to the WebLogic Server instance.
+
+* Go to the {{ site.data.var.wlsFullBrandName }} Administration Console.
+* Go to **Environment** -> **Machines**.
+
+ You should see logical machines with name parttern `^{managedServerPrefix}StorageVM[0-9]+$`, machine names with number suffix from `numberOfExistingCacheNodes` to `numberOfExistingCacheNodes + numberOfNewCacheNodes` are added.
+* Go to **Environment** -> **Servers**
+
+ You should see servers with name parttern `^{managedServerPrefix}Storage[0-9]+$`, server names with number suffix from `numberOfExistingCacheNodes` to `numberOfExistingCacheNodes + numberOfNewNodes` are added to `storage1`.
+
+### Verify if Azure resources are added
+
+* Go to [Azure Portal](https://ms.portal.azure.com/).
+* Go to resource group that the {{ site.data.var.wlsFullBrandName }} is deployed.
+
+ You should see corresponding Vitual Machines, Disks, Network Interfaces, Public IPs have been added.
diff --git a/subtemplate-src/admin-aadNestedTemplate.md b/subtemplate-src/admin-aadNestedTemplate.md
new file mode 100644
index 000000000..a87a6c908
--- /dev/null
+++ b/subtemplate-src/admin-aadNestedTemplate.md
@@ -0,0 +1,304 @@
+{% include variables.md %}
+
+# Apply Azure Active Directory ARM Template to {{ site.data.var.wlsFullBrandName }}
+
+This page documents how to configure an existing deployment of {{ site.data.var.wlsFullBrandName }} with an existing Azure Active Directory Domain Service (AAD DS) using Azure CLI.
+
+## Prerequisites
+
+### Environment for Setup
+
+* [Azure CLI](https://docs.microsoft.com/en-us/cli/azure), use `az --version` to test if `az` works.
+
+### WebLogic Server Instance
+
+The AAD ARM template will be applied to an existing {{ site.data.var.wlsFullBrandName }} instance. If you don't have one, please create a new instance from the Azure portal, by following the link to the offer [in the index](index.md).
+
+### Azure Active Directory LDAP Instance
+
+To apply AAD to {{ site.data.var.wlsFullBrandName }}, you must have an existing Azure Active Directory LDAP instance to use. If you don't have AAD LADP instance, please follow the steps in the tutorial [Configure secure LDAP for an Azure Active Directory Domain Services managed domain](https://docs.microsoft.com/en-us/azure/active-directory-domain-services/tutorial-configure-ldaps).
+
+## Prepare the Parameters JSON file
+
+You must construct a parameters JSON file containing the parameters to the AAD ARM template. See [Create Resource Manager parameter file](https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/parameter-files) for background information about parameter files. We must specify the information of the existing {{ site.data.var.wlsFullBrandName }} and AAD instance. This section shows how to obtain the values for the following required properties.
+
+| Parameter Name | Explanation |
+|----------------|-------------|
+| `_artifactsLocation`| See below for details. |
+| `aadsPortNumber` | (optional) The LDAP port number, defaults to 636. |
+| `aadsPublicIP` | The IP address of the LDAP server |
+| `aadsServerHost` | The hostname of the Active Directory Domain Services server. |
+| `adminVMName`| At deployment time, if this value was changed from its default value, the value used at deployment time must be used. Otherwise, this parameter should be omitted. |
+| `location` | Must be the same region into which the server was initially deployed. |
+| `wlsDomainName` | The name of the {{ site.data.var.wlsFullBrandName }} domain. |
+| `wlsLDAPGroupBaseDN` | The base distinguished name (DN) of the tree in the LDAP directory that contains groups. |
+| `wlsLDAPPrincipalPassword` | The credential (usually a password) used to connect to the LDAP server. |
+| `wlsLDAPPrincipal` | The Distinguished Name (DN) of the LDAP user that {{ site.data.var.wlsFullBrandName }} should use to connect to the LDAP server. |
+| `wlsLDAPProviderName` | (optional) The value used for creating authentication provider name of WebLogic Server. |
+| `wlsLDAPSSLCertificate` | Client certificate that will be imported to trust store of SSL. |
+| `wlsLDAPSSLCertificate` | See below for details. |
+| `wlsLDAPUserBaseDN` | The base distinguished name (DN) of the tree in the LDAP directory that contains users. |
+| `wlsPassword` | Must be the same value provided at deployment time. |
+| `wlsUserName` | Must be the same value provided at deployment time. |
+
+### `_artifactsLocation`
+
+This value must be the following.
+
+```bash
+{{ armTemplateBasePath }}
+```
+
+### `wlsLDAPSSLCertificate`
+
+Use base64 to encode your existing SSL certificate.
+
+```bash
+base64 your-certificate.cer -w 0 >temp.txt
+```
+
+Use the content as this file as the value of the `wlsLDAPSSLCertificate` parameter.
+
+#### Example Parameters JSON
+
+Here is a fully filled out parameters file. Note that we did not include values for parameters that have a default value.
+
+{{ site.data.var.passwordInFileNote }}
+
+```json
+{
+ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "_artifactsLocation": {
+ "value": "{{ armTemplateBasePath }}"
+ },
+ "aadsPublicIP": {
+ "value": "1.2.3.4"
+ },
+ "aadsServerHost": {
+ "value": "ladps.fabrikam.com"
+ },
+ "location": {
+ "value": "eastus"
+ },
+ "wlsDomainName": {
+ "value": "adminDomain"
+ },
+ "wlsLDAPGroupBaseDN": {
+ "value": "OU=AADDC Users,DC=fabrikam,DC=com"
+ },
+ "wlsLDAPPrincipal": {
+ "value": "CN=WLSTest,OU=AADDC Users,DC=fabrikam,DC=com"
+ },
+ "wlsLDAPPrincipalPassword": {
+ "value": "Secret123!"
+ },
+ "wlsLDAPSSLCertificate": {
+ "value": "MIIKQQIBAz....EkAgIIAA=="
+ },
+ "wlsLDAPUserBaseDN": {
+ "value": "OU=AADDC Users,DC=fabrikam,DC=com"
+ },
+ "wlsPassword": {
+ "value": "welcome1"
+ },
+ "wlsUserName": {
+ "value": "weblogic"
+ }
+ }
+}
+```
+
+## Invoke the ARM template
+
+Assume your parameters file is available in the current directory and is named `parameters.json`. This section shows the commands to configure your {{ site.data.var.wlsFullBrandName }} deployment with the specified AAD. Replace `yourResourceGroup` with the Azure resource group in which the {{ site.data.var.wlsFullBrandName }} is deployed.
+
+### First, validate your parameters file
+
+The `az group deployment validate` command is very useful to validate your parameters file is syntactically correct.
+
+```bash
+az group deployment validate --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateBasePath }}nestedtemplates/aadNestedTemplate.json
+```
+
+If the command returns with an exit status other than `0`, inspect the output and resolve the problem before proceeding. You can check the exit status by executing the commad `echo $?` immediately after the `az` command.
+
+### Next, execute the template
+
+After successfully validating the template invocation, change `validate` to `create` to invoke the template.
+
+```bash
+az group deployment create --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateBasePath }}nestedtemplates/aadNestedTemplate.json
+```
+
+As with the validate command, if the command returns with an exit status other than `0`, inspect the output and resolve the problem.
+
+This is an example output of successful deployment. Look for `"provisioningState": "Succeeded"` in your output.
+
+```json
+{
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-admin-06082/providers/Microsoft.Resources/deployments/cli",
+ "location": null,
+ "name": "cli",
+ "properties": {
+ "correlationId": "6d98e1c8-0778-4fa5-a30a-8f10bbbb6818",
+ "debugSetting": null,
+ "dependencies": [
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-admin-06082/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "oraclevm-admin-06082",
+ "resourceName": "adminVM/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-admin-06082/providers/Microsoft.Resources/deployments/pid-8295df19-fe6b-5745-ad24-51ef66522b24",
+ "resourceGroup": "oraclevm-admin-06082",
+ "resourceName": "pid-8295df19-fe6b-5745-ad24-51ef66522b24",
+ "resourceType": "Microsoft.Resources/deployments"
+ }
+ ],
+ "duration": "PT2M59.6052694S",
+ "mode": "Incremental",
+ "onErrorDeployment": null,
+ "outputResources": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-admin-06082/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "oraclevm-admin-06082"
+ }
+ ],
+ "outputs": {
+ "artifactsLocationPassedIn": {
+ "type": "String",
+ "value": "https://raw.githubusercontent.com/galiacheng/arm-oraclelinux-wls-admin/deploy/src/main/arm/"
+ }
+ },
+ "parameters": {
+ "_artifactsLocation": {
+ "type": "String",
+ "value": "https://raw.githubusercontent.com/galiacheng/arm-oraclelinux-wls-admin/deploy/src/main/arm/"
+ },
+ "_artifactsLocationAADTemplate": {
+ "type": "String",
+ "value": "https://raw.githubusercontent.com/galiacheng/arm-oraclelinux-wls-admin/deploy/src/main/arm/"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "SecureString"
+ },
+ "aadsPortNumber": {
+ "type": "String",
+ "value": "636"
+ },
+ "aadsPublicIP": {
+ "type": "String",
+ "value": "40.76.11.111"
+ },
+ "aadsServerHost": {
+ "type": "String",
+ "value": "ladps.wls-security.com"
+ },
+ "adminVMName": {
+ "type": "String",
+ "value": "adminVM"
+ },
+ "location": {
+ "type": "String",
+ "value": "eastus"
+ },
+ "wlsDomainName": {
+ "type": "String",
+ "value": "adminDomain"
+ },
+ "wlsLDAPGroupBaseDN": {
+ "type": "String",
+ "value": "OU=AADDC Users,DC=wls-security,DC=com"
+ },
+ "wlsLDAPPrincipal": {
+ "type": "String",
+ "value": "CN=WLSTest,OU=AADDC Users,DC=wls-security,DC=com"
+ },
+ "wlsLDAPPrincipalPassword": {
+ "type": "SecureString"
+ },
+ "wlsLDAPProviderName": {
+ "type": "String",
+ "value": "AzureActiveDirectoryProvider"
+ },
+ "wlsLDAPSSLCertificate": {
+ "type": "String",
+ "value": "LS0tLS1...LQ0K"
+ },
+ "wlsLDAPUserBaseDN": {
+ "type": "String",
+ "value": "OU=AADDC Users,DC=wls-security,DC=com"
+ },
+ "wlsPassword": {
+ "type": "SecureString"
+ },
+ "wlsUserName": {
+ "type": "String",
+ "value": "weblogic"
+ }
+ },
+ "parametersLink": null,
+ "providers": [
+ {
+ "id": null,
+ "namespace": "Microsoft.Resources",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ null
+ ],
+ "properties": null,
+ "resourceType": "deployments"
+ }
+ ]
+ },
+ {
+ "id": null,
+ "namespace": "Microsoft.Compute",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "virtualMachines/extensions"
+ }
+ ]
+ }
+ ],
+ "provisioningState": "Succeeded",
+ "template": null,
+ "templateHash": "2818584196763146470",
+ "templateLink": null,
+ "timestamp": "2020-06-09T07:07:03.444046+00:00"
+ },
+ "resourceGroup": "oraclevm-admin-06082",
+ "type": "Microsoft.Resources/deployments"
+}
+
+```
+
+## Verify AAD Integration
+
+Follow the steps to check if AAD is enabled.
+
+* Visit the {{ site.data.var.wlsFullBrandName }} Admin console.
+* In the left navigator, expand the tree to select **Security Realms** -> **myrealm** -> **Providers**.
+* If the integration was successful, you will find the AAD provider for example `AzureActiveDirectoryProvider`.
+* In the left navigator, expand the tree to select **Security Realms** -> **myrealm** -> **Users and Groups**.
+* If the integration was successful, you will find users from the AAD provider.
diff --git a/subtemplate-src/admin-customDNSTemplate.md b/subtemplate-src/admin-customDNSTemplate.md
new file mode 100644
index 000000000..746b9e506
--- /dev/null
+++ b/subtemplate-src/admin-customDNSTemplate.md
@@ -0,0 +1,164 @@
+{% include variables.md %}
+
+# Configure DNS alias to {{ site.data.var.wlsFullBrandName }}
+
+This page documents how to configure an existing deployment of {{ site.data.var.wlsFullBrandName }} with a custom DNS alias.
+
+## Prerequisites
+
+### Environment for Setup
+
+* [Azure CLI](https://docs.microsoft.com/en-us/cli/azure), use `az --version` to test if `az` works.
+
+### WebLogic Server Instance
+
+The DNS Configuraton ARM template will be applied to an existing {{ site.data.var.wlsFullBrandName }} instance. If you don't have one, please create a new instance from the Azure portal, by following the link to the offer [in the index](index.md).
+
+### Registered Domain Name
+
+You need to buy a domain name to create a custom DNS alias.
+
+### Azure DNS Zone
+
+If you create the DNS alias on an existing [Azure DNS Zone](https://docs.microsoft.com/en-us/azure/dns/dns-overview), make sure you have perfomed the [Azure DNS Delegation](https://docs.microsoft.com/en-us/azure/dns/dns-domain-delegation). Once you have completed the delegation, you can verify it with `nslookup`. For example, assuming your domain name is **contoso.com**, this output shows a correct delegation.
+
+```bash
+$ nslookup -type=SOA contoso.com
+Server: 172.29.80.1
+Address: 172.29.80.1#53
+
+Non-authoritative answer:
+contoso.com
+ origin = ns1-01.azure-dns.com
+ mail addr = azuredns-hostmaster.microsoft.com
+ serial = 1
+ refresh = 3600
+ retry = 300
+ expire = 2419200
+ minimum = 300
+Name: ns1-01.azure-dns.com
+Address: 40.90.4.1
+Name: ns1-01.azure-dns.com
+Address: 2603:1061::1
+```
+
+We strongly recommand you create an Azure DNS Zone for domain management and reuse it for other perpose. Follow the [guide](https://docs.microsoft.com/en-us/azure/dns/dns-getstarted-portal) to create an Azure DNS Zone.
+
+### Azure Managed Indentify
+
+If you are going to configure DNS alias based on an existing DNS Zone, you are required to input the ID of a user-assigned managed identity.
+
+Follow this [guide](https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/how-to-manage-ua-identity-portal) to create a user-assigned managed identity.
+
+To obtain ID of the indentify: go to Azure Portal; open the identity **Overview** page; click **JSON View** and copy the **Resource ID**.
+
+
+## Prepare the Parameters
+
+We provide an automation shell script for DNS configuration. You must specify the information of the existing Oracle WebLogic Server. This section shows how to obtain the values for the following required properties.
+
+| Parameter Name | Explanation |
+|----------------|-------------|
+| `--admin-vm-name`| Required. Name of vitual machine that hosts {{ site.data.var.wlsFullBrandName }} admin server. Must be the same value provided at initial deployment time.|
+| `--admin-console-label` | Required. Label for {{ site.data.var.wlsFullBrandName }} admin console. Used to generate subdomain of admin console. |
+| `--artifact-location`| Required. See below for details. |
+| `--resource-group` | Required. Name of resource group that has WebLogic cluster deployed. |
+| `--location ` | Required. Must be the same region into which the server was initially deployed. |
+| `--zone-name ` | Required. Azure DNS Zone name. |
+| `--identity-id` | Optional. ID of Azure user-assigned managed identity. The parameter is only required if you are creating DNS alias on an existing DNS Zone.|
+| `--zone-resource-group` | Optional. Name of resource group that has Azure DNS Zone deployed. The parameter is only required if you are creating DNS alias on an existing DNS Zone. |
+| `--help` | Help. |
+
+### Artifacts location
+
+This value must be the following.
+
+```bash
+{{ armTemplateBasePath }}
+```
+
+## Invoke the Automation Script
+
+We provide an automation script to configure a custom DNS alias. The script lets you do the following:
+
+ * If you have an Azure DNS Zone, it will create a DNS alias for the admin console on the existing DNS Zone.
+ * If you don't have an Azure DNS Zone, it will create the DNS Zone in the same resource group as the WebLogic cluster, then create the DNS alias for the admin console.
+
+### Configure DNS Alias on an Existing Azure DNS Zone
+
+To configure a DNS alias on an existing Azure DNS Zone, in addition to the required parameters, you must also specify an Azure user-assigned managed identity ID and the resource group name in which your DNS Zone is deployed.
+
+This is an example to create a DNS alias `admin.contoso.com` for the admin console in an existing Azure DNS Zone.
+
+```bash
+$ curl -fsSL {{ site.data.var.artifactsLocationBase }}{{ pageDir }}/{{ site.data.var.artifactsLocationTag }}/cli-scripts/custom-dns-alias-cli.sh \
+ | /bin/bash -s -- \
+ --resource-group `yourResourceGroup` \
+ --admin-vm-name adminVM \
+ --admin-console-label admin \
+ --artifact-location {{ armTemplateBasePath }} \
+ --location eastus \
+ --zone-name contoso.com \
+ --identity-id `yourIndentityID` \
+ --zone-resource-group `yourDNSZoneResourceGroup`
+```
+
+An example output:
+
+```text
+Done!
+
+Custom DNS alias:
+ Resource group: haiche-dns-doc
+ WebLogic Server Administration Console URL: http://admin.contoso.com:7001/console
+ WebLogic Server Administration Console secured URL: https://admin.contoso.com:7002/console
+
+```
+
+
+### Configure DNS Alias on a New Azure DNS Zone
+
+To configure a DNS alias on a new Azure DNS Zone, you must specify the required parameters.
+
+This is an example of creating an Azure DNS Zone, then creating a DNS alias `admin.contoso.com` for the admin console.
+
+```bash
+$ curl -fsSL {{ site.data.var.artifactsLocationBase }}{{ pageDir }}/{{ site.data.var.artifactsLocationTag }}/cli-scripts/custom-dns-alias-cli.sh \
+ | /bin/bash -s -- \
+ --resource-group `yourResourceGroup` \
+ --admin-vm-name adminVM \
+ --admin-console-label admin \
+ --artifact-location {{ armTemplateBasePath }} \
+ --location eastus \
+ --zone-name contoso.com
+```
+
+An example output:
+
+```text
+DONE!
+
+
+Action required:
+ Complete Azure DNS delegation to make the alias accessible.
+ Reference: https://aka.ms/dns-domain-delegation
+ Name servers:
+ [
+ "ns1-02.azure-dns.com.",
+ "ns2-02.azure-dns.net.",
+ "ns3-02.azure-dns.org.",
+ "ns4-02.azure-dns.info."
+ ]
+
+Custom DNS alias:
+ Resource group: haiche-dns-doc
+ WebLogic Server Administration Console URL: http://admin.contoso.com:7001/console
+ WebLogic Server Administration Console secured URL: https://admin.contoso.com:7002/console
+```
+
+**Note:** The DNS aliases are not accessible now, you must perform Azure DNS delegation after the deployment. Follow [Delegation of DNS zones with Azure DNS](https://aka.ms/dns-domain-delegation) to complete the Azure DNS delegation.
+
+
+## Verify the Custom Alias
+
+Access the URL from output to verify if the custom alias works.
diff --git a/subtemplate-src/admin-elkNestedTemplate.md b/subtemplate-src/admin-elkNestedTemplate.md
new file mode 100644
index 000000000..93759dc21
--- /dev/null
+++ b/subtemplate-src/admin-elkNestedTemplate.md
@@ -0,0 +1,287 @@
+{% include variables.md %}
+
+# Land {{ site.data.var.wlsFullBrandName }} logs to Elasticsearch and Kibana
+
+This page documents how to configure an existing deployment of {{ site.data.var.wlsFullBrandName }} to land logs to Elasticsearch and Kibana using Azure CLI.
+
+## Prerequisites
+
+### Environment for Setup
+
+* [Azure CLI](https://docs.microsoft.com/en-us/cli/azure), use `az --version` to test if `az` works.
+
+### WebLogic Server Instance
+
+The ELK ARM template will be applied to an existing {{ site.data.var.wlsFullBrandName }} instance. If you don't have one, please create a new instance from the Azure portal, by following the link to the offer [in the index](index.md).
+
+### Virtual machine size requirement
+Ensure the virtual machines that have been deployed have at least **2.5GB** of memory. The default virtual machine size for WLS does not have enough memory. Use at least `Standard_A2_v2`.
+
+### Elasticsearch instance
+
+Refer to [Create an an Elastic on Azure instance](https://aka.ms/arm-oraclelinux-wls-elk#create-an-an-elastic-on-azure-instance)
+
+## Prepare the Parameters JSON file
+
+You must construct a parameters JSON file containing the parameters to the ELK ARM template. See [Create Resource Manager parameter file](https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/parameter-files) for background information about parameter files.
+
+We must specify the information of the existing {{ site.data.var.wlsFullBrandName }} and Elasticsearch instance. This section shows how to obtain the values for the following required properties.
+
+| Parameter Name | Explanation |
+|----------------|-------------|
+| `_artifactsLocation`| See below for details. |
+| `adminVMName`| Virtual machine name of which hosts the {{ site.data.var.wlsFullBrandName }} admin server. |
+| `elasticsearchEndpoint` | The Elasticsearch endpoint. |
+| `elasticsearchPassword` | Password of the Elasticsearch account. Used to distibute message with REST API to Elasticsearch instance. |
+| `elasticsearchUserName` | User name of the Elasticsearch account. |
+| `location` | Must be the same region into which the server was initially deployed. |
+| `logsToIntegrate` | Specify the WebLogic logs to export to Elasticsearch, you must select at least one log. |
+| `wlsDomainName` | Must be the same value provided at initial deployment time. |
+| `wlsPassword` | Must be the same value provided at initial deployment time. |
+| `wlsUserName` | Must be the same value provided at initial deployment time. |
+
+### `_artifactsLocation`
+
+This value must be the following.
+
+```bash
+{{ armTemplateBasePath }}
+```
+
+#### Example Parameters JSON
+
+Here is a fully filled out parameters file. We will leave values of `adminUsername`, `authenticationType`, `dnsLabelPrefix`, and `usePreviewImage` as default value.
+
+{{ site.data.var.passwordInFileNote }}
+
+```json
+{
+ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "_artifactsLocation": {
+ "value": "{{ armTemplateBasePath }}"
+ },
+ "adminVMName": {
+ "value": "adminVM"
+ },
+ "elasticsearchEndpoint": {
+ "value": "https://example.eastus2.azure.elastic-cloud.com:9243"
+ },
+ "elasticsearchPassword": {
+ "value": "wlkpsw"
+ },
+ "elasticsearchUserName": {
+ "value": "elastic"
+ },
+ "location": {
+ "value": "eastus"
+ },
+ "wlsDomainName": {
+ "value": "adminDomain"
+ },
+ "wlsPassword": {
+ "value": "welcome1"
+ },
+ "wlsUserName": {
+ "value": "weblogic"
+ }
+ }
+}
+```
+
+## Invoke the ARM template
+
+Assume your parameters file is available in the current directory and is named `parameters.json`. This section shows the commands to configure your {{ site.data.var.wlsFullBrandName }} deployment to connect to Elasticsearch and Kinaba intance. Replace `yourResourceGroup` with the Azure resource group in which the {{ site.data.var.wlsFullBrandName }} is deployed.
+
+### First, validate your parameters file
+
+The `az group deployment validate` command is very useful to validate your parameters file is syntactically correct.
+
+```bash
+az deployment group validate --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateBasePath }}nestedtemplates/elkNestedTemplate.json
+```
+
+If the command returns with an exit status other than `0`, inspect the output and resolve the problem before proceeding. You can check the exit status by executing the commad `echo $?` immediately after the `az` command.
+
+### Next, execute the template
+
+After successfully validating the template invocation, change `validate` to `create` to invoke the template.
+
+```bash
+az deployment group create --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateBasePath }}nestedtemplates/elkNestedTemplate.json
+```
+
+As with the validate command, if the command returns with an exit status other than `0`, inspect the output and resolve the problem.
+
+This is an example output of successful deployment. Look for `"provisioningState": "Succeeded"` in your output.
+
+```json
+{
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-admin-elk/providers/Microsoft.Resources/deployments/elkNestedTemplate",
+ "location": null,
+ "name": "elkNestedTemplate",
+ "properties": {
+ "correlationId": "61a46b43-27d0-4478-baba-c288059892d5",
+ "debugSetting": null,
+ "dependencies": [
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-admin-elk/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "haiche-admin-elk",
+ "resourceName": "adminVM/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-admin-elk/providers/Microsoft.Resources/deployments/pid-e4165284-b017-5df9-9b91-3f11dd8a72e5",
+ "resourceGroup": "haiche-admin-elk",
+ "resourceName": "pid-e4165284-b017-5df9-9b91-3f11dd8a72e5",
+ "resourceType": "Microsoft.Resources/deployments"
+ },
+ ],
+ "duration": "PT8M54.4785762S",
+ "mode": "Incremental",
+ "onErrorDeployment": null,
+ "outputResources": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-admin-elk/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "haiche-admin-elk"
+ }
+ ],
+ "outputs": {
+ "artifactsLocationPassedIn": {
+ "type": "String",
+ "value": "{{ armTemplateBasePath }}"
+ },
+ "logIndex": {
+ "type": "String",
+ "value": "azure-weblogic-admin-b4e465d5-6ffc-49cf-b1d9-b4dbf6455d0a"
+ }
+ },
+ "parameters": {
+ "_artifactsLocation": {
+ "type": "String",
+ "value": "{{ armTemplateBasePath }}"
+ },
+ "_artifactsLocationELKTemplate": {
+ "type": "String",
+ "value": "{{ armTemplateBasePath }}"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "SecureString"
+ },
+ "adminVMName": {
+ "type": "String",
+ "value": "adminVM"
+ },
+ "elasticsearchEndpoint": {
+ "type": "String",
+ "value": "https://example.eastus2.azure.elastic-cloud.com:9243"
+ },
+ "elasticsearchPassword": {
+ "type": "SecureString"
+ },
+ "elasticsearchUserName": {
+ "type": "String",
+ "value": "elastic"
+ },
+ "guidValue": {
+ "type": "String",
+ "value": "b4e465d5-6ffc-49cf-b1d9-b4dbf6455d0a"
+ },
+ "location": {
+ "type": "String",
+ "value": "eastus"
+ },
+ "logsToIntegrate": {
+ "type": "Array",
+ "value": [
+ "HTTPAccessLog",
+ "ServerLog",
+ "DomainLog",
+ "DataSourceLog",
+ "StandardErrorAndOutput",
+ "NodeManagerLog"
+ ]
+ },
+ "wlsDomainName": {
+ "type": "String",
+ "value": "wlsd"
+ },
+ "wlsPassword": {
+ "type": "SecureString"
+ },
+ "wlsUserName": {
+ "type": "String",
+ "value": "weblogic"
+ }
+ },
+ "parametersLink": null,
+ "providers": [
+ {
+ "id": null,
+ "namespace": "Microsoft.Resources",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ null
+ ],
+ "properties": null,
+ "resourceType": "deployments"
+ }
+ ]
+ },
+ {
+ "id": null,
+ "namespace": "Microsoft.Compute",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "virtualMachines/extensions"
+ }
+ ]
+ }
+ ],
+ "provisioningState": "Succeeded",
+ "template": null,
+ "templateHash": "10060935779116645392",
+ "templateLink": null,
+ "timestamp": "2020-11-11T07:29:42.336797+00:00"
+ },
+ "resourceGroup": "haiche-admin-elk",
+ "type": "Microsoft.Resources/deployments"
+}
+```
+
+## Verify ELK connection
+
+Follow the steps to check if WebLogic Server logs are exported to Elasticsearch.
+
+* Go to Azure portal
+* Copy log index from your resource group -> deployments -> elkNestedTemplate -> output -> logIndex .
+* Go to Elasticsearch cloud and launch Kibana.
+* Create index
+ * Go to Kibana -> Management -> Kibana -> Index Patterns
+ * Click `Create index Patterns`
+ * Input the log index you copy from output in Index pattern
+ * There should be an index you can select, otherwise, the ELK deployment failed
+ * Next step
+ * Select `@timestamp` in Time Filter and hit `Create index pattern`
+* View logs
+ * Go to Kibana -> Discover
+ * Select the index you just created
+ * You will find the WebLogic Server logs listed
diff --git a/subtemplate-src/appGatewayNestedTemplate.md b/subtemplate-src/appGatewayNestedTemplate.md
new file mode 100644
index 000000000..0559bdaa8
--- /dev/null
+++ b/subtemplate-src/appGatewayNestedTemplate.md
@@ -0,0 +1,366 @@
+{% include variables.md %}
+
+# Apply Azure App Gateway ARM Template to {{ site.data.var.wlsFullBrandName }}
+
+This page documents how to configure an existing deployment of {{ site.data.var.wlsFullBrandName }} with Azure Application Gateway using the Azure CLI.
+
+## Prerequisites
+
+### Environment for Setup
+
+* [Azure CLI](https://docs.microsoft.com/en-us/cli/azure), use `az --version` to test if `az` works.
+
+### WebLogic Server Instance
+
+The Application Gateway ARM tempate will be applied to an existing {{ site.data.var.wlsFullBrandName }} instance. If you don't have one, please create a new instance from the Azure portal, by following the link to the offer [in the index](index.md).
+
+### Certificate for SSL Termination
+
+Because the Application Gateway serves as the front end load balancer for the {{ site.data.var.wlsFullBrandName }} cluster, it must be provided with a certificate to allow browsers to connect via SSL.
+
+When deploying the {{ site.data.var.wlsFullBrandName }} offer from the Azure Portal, you can configure the deployment to fetch the SSL certificate and its password from a pre-existing Azure Key Vault. For a high-level introduction to SSL Certificates with Azure Key Vault see [Get started with Key Vault certificates](https://docs.microsoft.com/en-us/azure/key-vault/certificates/certificate-scenarios). For an overview of TLS termination with Application Gateway see [Overview of TLS termination and end to end TLS with Application Gateway](https://docs.microsoft.com/en-us/azure/application-gateway/ssl-overview). When configuring the Application Gateway after deployment, you must base64 encode the certificate and also know the password for the certificate.
+
+## Prepare the Parameters JSON file
+
+You must construct a parameters JSON file containing the parameters to the database ARM template. See [Create Resource Manager parameter file](https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/parameter-files) for background information about parameter files. We must specify the information of the existing SSL certificate. This section shows how to obtain the values for the following required properties.
+
+| Parameter Name | Explanation |
+|----------------|-------------|
+| `_artifactsLocation`| See below for details. |
+| `adminVMName`| At deployment time, if this value was changed from its default value, the value used at deployment time must be used. Otherwise, this parameter should be omitted. |
+| `customDomainName`| Specify a custome domain name if want to override application gateway hostname. You are required to input the value if you use a pre-assigned SSL for application gateway. |
+| `appGatewaySSLCertificateData`| See below for details. |
+| `appGatewaySSLCertificatePassword`| See below for details. |
+| `dnsNameforApplicationGateway`| (optional) A prefix value for the dns name of the Application Gateway. |
+| `gatewayPublicIPAddressName` | (optional) A prefix value for the public IP address of the Application Gateway. |
+| `location` | Must be the same region into which the server was initially deployed. |
+| `managedServerPrefix` | At deployment time, if this value was changed from its default value, the value used at deployment time must be used. Otherwise, this parameter should be omitted. |
+| `numberOfInstances` | The number of instances in the cluster. Must be the same as the value used at deployment time. |
+| `overrideHostName` | If `true` the template will override the application gateway hostname with value of `customDomainName`. The vaule should be `true` if you use a pre-assigned SSL for application gateway. |
+| `wlsDomainName` | At deployment time, if this value was changed from its default value, the value used at deployment time must be used. Otherwise, this parameter should be omitted. |
+| `wlsPassword` | Must be the same value provided at deployment time. |
+| `wlsUserName` | Must be the same value provided at deployment time. |
+
+### `_artifactsLocation`
+
+This value must be the following.
+
+```bash
+{{ armTemplateBasePath }}
+```
+
+### SSL Certificate Data and Password
+
+Use base64 to encode your existing PFX format certificate.
+
+```bash
+base64 your-certificate.pfx -w 0 >temp.txt
+```
+
+Use the content as this file as the value of the `appGatewaySSLCertificateData` parameter.
+
+It is assumed that you have the password for the certificate. Use this as the value of the `appGatewaySSLCertificatePassword` parameter.
+
+#### Example Parameters JSON
+
+Here is a fully filled out parameters file. Note that we did not include any optional parameters, assuming the {{ site.data.var.wlsFullBrandName }} was deployed accepting the default values.
+
+{{ site.data.var.passwordInFileNote }}
+
+```json
+{
+ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "_artifactsLocation":{
+ "value": "{{ armTemplateBasePath }}"
+ },
+ "appGatewaySSLCertificateData": {
+ "value": "MIIKCQIB...sOr3QICCAA="
+ },
+ "appGatewaySSLCertificatePassword": {
+ "value": "myPasswordInClearText"
+ },
+ "numberOfInstances": {
+ "value": 3
+ },
+ "location": {
+ "value": "eastus"
+ },
+ "wlsPassword": {
+ "value": "welcome1"
+ },
+ "wlsUserName": {
+ "value": "weblogic"
+ }
+ }
+}
+```
+
+## Invoke the ARM template
+
+Assume your parameters file is available in the current directory and is named `parameters.json`. This section shows the commands to configure your {{ site.data.var.wlsFullBrandName }} deployment with the specified database. Replace `yourResourceGroup` with the Azure resource group in which the {{ site.data.var.wlsFullBrandName }} is deployed.
+
+### First, validate your parameters file
+
+The `az group deployment validate` command is very useful to validate your parameters file is syntactically correct.
+
+```bash
+az group deployment validate --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateBasePath }}nestedtemplates/appGatewayNestedTemplate.json
+```
+
+If the command returns with an exit status other than `0`, inspect the output and resolve the problem before proceeding. You can check the exit status by executing the commad `echo $?` immediately after the `az` command.
+
+### Next, execute the template
+
+After successfully validating the template invocation, change `validate` to `create` to invoke the template.
+
+```bash
+az group deployment create --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateBasePath }}nestedtemplates/appGatewayNestedTemplate.json
+```
+
+As with the validate command, if the command returns with an exit status other than `0`, inspect the output and resolve the problem.
+
+This is an example output of successful deployment. Look for `"provisioningState": "Succeeded"` in your output.
+
+```json
+{
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-0604/providers/Microsoft.Resources/deployments/cli",
+ "location": null,
+ "name": "cli",
+ "properties": {
+ "correlationId": "4cc63f27-0f43-4244-9d89-a09bf417e943",
+ "debugSetting": null,
+ "dependencies": [
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-0604/providers/Microsoft.Network/publicIPAddresses/gwip",
+ "resourceGroup": "oraclevm-cluster-0604",
+ "resourceName": "gwip",
+ "resourceType": "Microsoft.Network/publicIPAddresses"
+ }
+ ],
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-0604/providers/Microsoft.Network/applicationGateways/myAppGateway",
+ "resourceGroup": "oraclevm-cluster-0604",
+ "resourceName": "myAppGateway",
+ "resourceType": "Microsoft.Network/applicationGateways"
+ },
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-0604/providers/Microsoft.Network/applicationGateways/myAppGateway",
+ "resourceGroup": "oraclevm-cluster-0604",
+ "resourceName": "myAppGateway",
+ "resourceType": "Microsoft.Network/applicationGateways"
+ },
+ {
+ "apiVersion": "2019-11-01",
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-0604/providers/Microsoft.Network/publicIPAddresses/gwip",
+ "resourceGroup": "oraclevm-cluster-0604",
+ "resourceName": "gwip",
+ "resourceType": "Microsoft.Network/publicIPAddresses"
+ }
+ ],
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-0604/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "oraclevm-cluster-0604",
+ "resourceName": "adminVM/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ },
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-0604/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "oraclevm-cluster-0604",
+ "resourceName": "adminVM/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-0604/providers/Microsoft.Resources/deployments/pid-36deb858-08fe-5c07-bc77-ba957a59a080",
+ "resourceGroup": "oraclevm-cluster-0604",
+ "resourceName": "pid-36deb858-08fe-5c07-bc77-ba957a59a080",
+ "resourceType": "Microsoft.Resources/deployments"
+ }
+ ],
+ "duration": "PT8M41.2104793S",
+ "mode": "Incremental",
+ "onErrorDeployment": null,
+ "outputResources": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-0604/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "oraclevm-cluster-0604"
+ },
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-0604/providers/Microsoft.Network/applicationGateways/myAppGateway",
+ "resourceGroup": "oraclevm-cluster-0604"
+ },
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-0604/providers/Microsoft.Network/publicIPAddresses/gwip",
+ "resourceGroup": "oraclevm-cluster-0604"
+ }
+ ],
+ "outputs": {
+ "appGatewayURL": {
+ "type": "String",
+ "value": "http://wlsgw9e6ed1-oraclevm-cluster-0604-wlsd.eastus.cloudapp.azure.com"
+ }
+ },
+ "parameters": {
+ "_artifactsLocation": {
+ "type": "String",
+ "value": "{{ armTemplateBasePath }}"
+ },
+ "_artifactsLocationAGWTemplate": {
+ "type": "String",
+ "value": "{{ armTemplateBasePath }}"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "SecureString"
+ },
+ "adminVMName": {
+ "type": "String",
+ "value": "adminVM"
+ },
+ "appGatewaySSLCertificateData": {
+ "type": "String",
+ "value": "MIIKQQIBAz....EkAgIIAA=="
+ },
+ "appGatewaySSLCertificatePassword": {
+ "type": "String",
+ "value": "myRedactedPassword"
+ },
+ "dnsNameforApplicationGateway": {
+ "type": "String",
+ "value": "wlsgw"
+ },
+ "gatewayPublicIPAddressName": {
+ "type": "String",
+ "value": "gwip"
+ },
+ "guidValue": {
+ "type": "String",
+ "value": "9e6ed15b-d386-4cb9-a617-3cb6f785f6a0"
+ },
+ "location": {
+ "type": "String",
+ "value": "eastus"
+ },
+ "managedServerPrefix": {
+ "type": "String",
+ "value": "msp"
+ },
+ "numberOfInstances": {
+ "type": "Int",
+ "value": 4
+ },
+ "wlsDomainName": {
+ "type": "String",
+ "value": "wlsd"
+ },
+ "wlsPassword": {
+ "type": "SecureString"
+ },
+ "wlsUserName": {
+ "type": "String",
+ "value": "weblogic"
+ }
+ },
+ "parametersLink": null,
+ "providers": [
+ {
+ "id": null,
+ "namespace": "Microsoft.Resources",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ null
+ ],
+ "properties": null,
+ "resourceType": "deployments"
+ }
+ ]
+ },
+ {
+ "id": null,
+ "namespace": "Microsoft.Network",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "publicIPAddresses"
+ },
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "applicationGateways"
+ }
+ ]
+ },
+ {
+ "id": null,
+ "namespace": "Microsoft.Compute",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "virtualMachines/extensions"
+ }
+ ]
+ }
+ ],
+ "provisioningState": "Succeeded",
+ "template": null,
+ "templateHash": "12239709219097081949",
+ "templateLink": null,
+ "timestamp": "2020-06-04T03:17:01.168329+00:00"
+ },
+ "resourceGroup": "oraclevm-cluster-0604",
+ "type": "Microsoft.Resources/deployments"
+}
+```
+
+## Verify Application Gateway
+
+We will deploy a testing application to verify if the appliaction gateway is enabled.
+
+Go to Admin Server Console and deploy [webtestapp.war](../resources/webtestapp.war).
+
+* Visit the {{ site.data.var.wlsFullBrandName }} Admin console.
+* Select **Deployments**.
+* Select **Install**.
+* Select file `webtestapp.war`.
+* Select **Next**. Choose "Install this deployment as an application".
+* Select **Next**. Select "cluster-1" and "All servers in the cluster".
+* Keep configuration as default and select **Finish**.
+* Select **Activate Changes**
+* In the left navigation pane, select **Deployments**.
+* Select **Control**
+* Select `webtestapp`
+* Select **Start**
+* Select **Servicing all requests**
+
+Then access the application with `/webtestapp`, you will get a page with server host information if application gateway was successfully enabled.
diff --git a/subtemplate-src/cluster-aadNestedTemplate.md b/subtemplate-src/cluster-aadNestedTemplate.md
new file mode 100644
index 000000000..0e72fe78c
--- /dev/null
+++ b/subtemplate-src/cluster-aadNestedTemplate.md
@@ -0,0 +1,310 @@
+{% include variables.md %}
+
+# Apply Azure Active Directory ARM Template to {{ site.data.var.wlsFullBrandName }}
+
+This page documents how to configure an existing deployment of {{ site.data.var.wlsFullBrandName }} with an existing Azure Active Directory Domain Service (AAD DS) using Azure CLI.
+
+## Prerequisites
+
+### Environment for Setup
+
+* [Azure CLI](https://docs.microsoft.com/en-us/cli/azure), use `az --version` to test if `az` works.
+
+### WebLogic Server Instance
+
+The AAD ARM template will be applied to an existing {{ site.data.var.wlsFullBrandName }} instance. If you don't have one, please create a new instance from the Azure portal, by following the link to the offer [in the index](index.md).
+
+### Azure Active Directory LDAP Instance
+
+To apply AAD to {{ site.data.var.wlsFullBrandName }}, you must have an existing Azure Active Directory LDAP instance to use. If you don't have AAD LADP instance, please follow the steps in the tutorial [Configure secure LDAP for an Azure Active Directory Domain Services managed domain](https://docs.microsoft.com/en-us/azure/active-directory-domain-services/tutorial-configure-ldaps).
+
+## Prepare the Parameters JSON file
+
+You must construct a parameters JSON file containing the parameters to the AAD ARM template. See [Create Resource Manager parameter file](https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/parameter-files) for background information about parameter files. We must specify the information of the existing {{ site.data.var.wlsFullBrandName }} and AAD instance. This section shows how to obtain the values for the following required properties.
+
+| Parameter Name | Explanation |
+|----------------|-------------|
+| `_artifactsLocation`| See below for details. |
+| `aadsPortNumber` | (optional) The LDAP port number, defaults to 636. |
+| `aadsPublicIP` | The IP address of the LDAP server |
+| `aadsServerHost` | The hostname of the Active Directory Domain Services server. |
+| `adminVMName`| At deployment time, if this value was changed from its default value, the value used at deployment time must be used. Otherwise, this parameter should be omitted. |
+| `location` | Must be the same region into which the server was initially deployed. |
+| `managedServerPrefix` | Must be the same managed server prefix with that in initial deployed. |
+| `numberOfInstances` | Numbers of Virtual Machines that have been deployed, including Virtual Machine that hosts Administration Server. |
+| `wlsDomainName` | The name of the {{ site.data.var.wlsFullBrandName }} domain. |
+| `wlsLDAPGroupBaseDN` | The base distinguished name (DN) of the tree in the LDAP directory that contains groups. |
+| `wlsLDAPPrincipalPassword` | The credential (usually a password) used to connect to the LDAP server. |
+| `wlsLDAPPrincipal` | The Distinguished Name (DN) of the LDAP user that {{ site.data.var.wlsFullBrandName }} should use to connect to the LDAP server. |
+| `wlsLDAPProviderName` | (optional) The value used for creating authentication provider name of WebLogic Server. |
+| `wlsLDAPSSLCertificate` | Client certificate that will be imported to trust store of SSL. |
+| `wlsLDAPSSLCertificate` | See below for details. |
+| `wlsLDAPUserBaseDN` | The base distinguished name (DN) of the tree in the LDAP directory that contains users. |
+| `wlsPassword` | Must be the same value provided at deployment time. |
+| `wlsUserName` | Must be the same value provided at deployment time. |
+
+### `_artifactsLocation`
+
+This value must be the following.
+
+```bash
+{{ armTemplateBasePath }}
+```
+
+### `wlsLDAPSSLCertificate`
+
+Use base64 to encode your existing SSL certificate.
+
+```bash
+base64 your-certificate.cer -w 0 >temp.txt
+```
+
+Use the content as this file as the value of the `wlsLDAPSSLCertificate` parameter.
+
+### `numberOfInstances`
+
+The number of existing nodes, includeing Administration Server node. It should equal to existing Virtual Machine number.
+
+#### Example Parameters JSON
+
+Here is a fully filled out parameters file. Note that we did not include values for parameters that have a default value. Pay attention to the value of `numberOfInstances`.
+
+{{ site.data.var.passwordInFileNote }}
+
+```json
+{
+ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "_artifactsLocation": {
+ "value": "{{ armTemplateBasePath }}"
+ },
+ "aadsPublicIP": {
+ "value": "1.2.3.4"
+ },
+ "aadsServerHost": {
+ "value": "ladps.fabrikam.com"
+ },
+ "location": {
+ "value": "eastus"
+ },
+ "wlsDomainName": {
+ "value": "wlsd"
+ },
+ "wlsLDAPGroupBaseDN": {
+ "value": "OU=AADDC Users,DC=fabrikam,DC=com"
+ },
+ "wlsLDAPPrincipal": {
+ "value": "CN=WLSTest,OU=AADDC Users,DC=fabrikam,DC=com"
+ },
+ "wlsLDAPPrincipalPassword": {
+ "value": "Secret123!"
+ },
+ "wlsLDAPSSLCertificate": {
+ "value": "MIIKQQIBAz....EkAgIIAA=="
+ },
+ "wlsLDAPUserBaseDN": {
+ "value": "OU=AADDC Users,DC=fabrikam,DC=com"
+ },
+ "wlsPassword": {
+ "value": "welcome1"
+ },
+ "wlsUserName": {
+ "value": "weblogic"
+ }
+ }
+}
+```
+
+## Invoke the ARM template
+
+Assume your parameters file is available in the current directory and is named `parameters.json`. This section shows the commands to configure your {{ site.data.var.wlsFullBrandName }} deployment with the specified AAD. Replace `yourResourceGroup` with the Azure resource group in which the {{ site.data.var.wlsFullBrandName }} is deployed.
+
+### First, validate your parameters file
+
+The `az group deployment validate` command is very useful to validate your parameters file is syntactically correct.
+
+```bash
+az group deployment validate --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateBasePath }}nestedtemplates/aadNestedTemplate.json
+```
+
+If the command returns with an exit status other than `0`, inspect the output and resolve the problem before proceeding. You can check the exit status by executing the commad `echo $?` immediately after the `az` command.
+
+### Next, execute the template
+
+After successfully validating the template invocation, change `validate` to `create` to invoke the template.
+
+```bash
+az group deployment create --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateBasePath }}nestedtemplates/aadNestedTemplate.json
+```
+
+As with the validate command, if the command returns with an exit status other than `0`, inspect the output and resolve the problem.
+
+This is an example output of successful deployment. Look for `"provisioningState": "Succeeded"` in your output.
+
+```json
+{
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-admin-06082/providers/Microsoft.Resources/deployments/cli",
+ "location": null,
+ "name": "cli",
+ "properties": {
+ "correlationId": "6d98e1c8-0778-4fa5-a30a-8f10bbbb6818",
+ "debugSetting": null,
+ "dependencies": [
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-admin-06082/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "oraclevm-admin-06082",
+ "resourceName": "adminVM/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-admin-06082/providers/Microsoft.Resources/deployments/pid-8295df19-fe6b-5745-ad24-51ef66522b24",
+ "resourceGroup": "oraclevm-admin-06082",
+ "resourceName": "pid-8295df19-fe6b-5745-ad24-51ef66522b24",
+ "resourceType": "Microsoft.Resources/deployments"
+ }
+ ],
+ "duration": "PT2M59.6052694S",
+ "mode": "Incremental",
+ "onErrorDeployment": null,
+ "outputResources": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-admin-06082/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "oraclevm-admin-06082"
+ }
+ ],
+ "outputs": {
+ "artifactsLocationPassedIn": {
+ "type": "String",
+ "value": "https://raw.githubusercontent.com/galiacheng/arm-oraclelinux-wls-admin/deploy/src/main/arm/"
+ }
+ },
+ "parameters": {
+ "_artifactsLocation": {
+ "type": "String",
+ "value": "https://raw.githubusercontent.com/galiacheng/arm-oraclelinux-wls-admin/deploy/src/main/arm/"
+ },
+ "_artifactsLocationAADTemplate": {
+ "type": "String",
+ "value": "https://raw.githubusercontent.com/galiacheng/arm-oraclelinux-wls-admin/deploy/src/main/arm/"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "SecureString"
+ },
+ "aadsPortNumber": {
+ "type": "String",
+ "value": "636"
+ },
+ "aadsPublicIP": {
+ "type": "String",
+ "value": "40.76.11.111"
+ },
+ "aadsServerHost": {
+ "type": "String",
+ "value": "ladps.wls-security.com"
+ },
+ "adminVMName": {
+ "type": "String",
+ "value": "adminVM"
+ },
+ "location": {
+ "type": "String",
+ "value": "eastus"
+ },
+ "wlsDomainName": {
+ "type": "String",
+ "value": "adminDomain"
+ },
+ "wlsLDAPGroupBaseDN": {
+ "type": "String",
+ "value": "OU=AADDC Users,DC=wls-security,DC=com"
+ },
+ "wlsLDAPPrincipal": {
+ "type": "String",
+ "value": "CN=WLSTest,OU=AADDC Users,DC=wls-security,DC=com"
+ },
+ "wlsLDAPPrincipalPassword": {
+ "type": "SecureString"
+ },
+ "wlsLDAPProviderName": {
+ "type": "String",
+ "value": "AzureActiveDirectoryProvider"
+ },
+ "wlsLDAPSSLCertificate": {
+ "type": "String",
+ "value": "LS0tLS1...LQ0K"
+ },
+ "wlsLDAPUserBaseDN": {
+ "type": "String",
+ "value": "OU=AADDC Users,DC=wls-security,DC=com"
+ },
+ "wlsPassword": {
+ "type": "SecureString"
+ },
+ "wlsUserName": {
+ "type": "String",
+ "value": "weblogic"
+ }
+ },
+ "parametersLink": null,
+ "providers": [
+ {
+ "id": null,
+ "namespace": "Microsoft.Resources",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ null
+ ],
+ "properties": null,
+ "resourceType": "deployments"
+ }
+ ]
+ },
+ {
+ "id": null,
+ "namespace": "Microsoft.Compute",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "virtualMachines/extensions"
+ }
+ ]
+ }
+ ],
+ "provisioningState": "Succeeded",
+ "template": null,
+ "templateHash": "2818584196763146470",
+ "templateLink": null,
+ "timestamp": "2020-06-09T07:07:03.444046+00:00"
+ },
+ "resourceGroup": "oraclevm-admin-06082",
+ "type": "Microsoft.Resources/deployments"
+}
+
+```
+
+## Verify AAD Integration
+
+Follow the steps to check if AAD is enabled.
+
+* Visit the {{ site.data.var.wlsFullBrandName }} Admin console.
+* In the left navigator, expand the tree to select **Security Realms** -> **myrealm** -> **Providers**.
+* If the integration was successful, you will find the AAD provider for example `AzureActiveDirectoryProvider`.
+* In the left navigator, expand the tree to select **Security Realms** -> **myrealm** -> **Users and Groups**.
+* If the integration was successful, you will find users from the AAD provider.
diff --git a/subtemplate-src/cluster-addnode.md b/subtemplate-src/cluster-addnode.md
new file mode 100644
index 000000000..98b78da9e
--- /dev/null
+++ b/subtemplate-src/cluster-addnode.md
@@ -0,0 +1,736 @@
+{% include variables.md %}
+
+# Add nodes to {{ site.data.var.wlsFullBrandName }}
+
+This page documents how to configure an existing deployment of {{ site.data.var.wlsFullBrandName }} to add new managed application server using Azure CLI.
+
+## Prerequisites
+
+### Environment for Setup
+
+* [Azure CLI](https://docs.microsoft.com/en-us/cli/azure), use `az --version` to test if `az` works.
+
+### WebLogic Server Instance
+
+The template will be applied to an existing {{ site.data.var.wlsFullBrandName }} instance. If you don't have one, please create a new instance from the Azure portal, by following the link to the offer [in the index](index.md).
+
+### Azure Active Directory LDAP Instance
+
+Refer to [Azure Active Directory(AAD) LDAP Instance](aadNestedTemplate.html#azure-active-directory-ldap-instance).
+
+### Certificate for SSL Termination
+Refer to [Configure Azure Application Gateway#Certificate for SSL Termination](appGatewayNestedTemplate.html#certificate-for-ssl-termination).
+
+### Administering Security for Oracle WebLogic Server & Configuring KeyStores
+Refer to [Configuring Keystores](https://docs.oracle.com/en/middleware/fusion-middleware/weblogic-server/12.2.1.4/secmg/identity_trust.html).
+
+### Generate Base64 string for a given ssl certificate/keystore file
+
+Use the following command to generate a Base64 string for a given ssl certificate/keystore file, to be used as input in the parameters JSON file
+
+
+
+
+## Prepare the Parameters JSON file
+
+You must construct a parameters JSON file containing the parameters to the add-node ARM template. See [Create Resource Manager parameter file](https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/parameter-files) for background information about parameter files. You must specify the information of the existing {{ site.data.var.wlsFullBrandName }} and nodes that to be added. This section shows how to obtain the values for the following required properties.
+
+
+
+
Parameter Name
+
Explanation
+
+
+
_artifactsLocation
+
See below for details.
+
+
+
aadsSettings
+
Optional. JSON object type. You can specify this parameters for Azure Active Directory integration. If enable is true, must specify other properties. See the page WebLogic to Azure with AAD via LDAP for further information.
+
+
+
+
enable
+
If enable is true, must specify all properties of the aadSettings.
+
+
+
+
publicIP
+
The public IP address of Azure Active Directory LDAP server.
+
+
+
+
serverHost
+
The server host of Azure Active Directory LDAP server.
+
+
+
+
certificateBase64String
+
The based64 string of LADP client certificate that will be imported to trust store of WebLogic Server to enable SSL connection of AD provider.
+
+
+
adminPasswordOrKey
+
Password of administration account for the new Virtual Machine that host new nodes.
+
+
+
adminURL
+
The URL of WebLogic Administration Server, usually made up with Virtual Machine name and port, for example: adminVM:7001.
If enable is true, must specify all properties of the appGatewaySettings.
+
+
+
+
publicIPName
+
Azure resource name of application gateway public IP, default value is gwip
+
+
+
+
certificateBase64String
+
Base64 string of server certificate for application gateway.
+
+
+
+
certificatePassword
+
Password of server certificate.
+
+
+
elkSettings
+
Optional. JSON object type. You can specify this parameters for Elasticsearch and Kibana(ELK) connection. If enable is true, must specify other properties. See the page WebLogic with Elastic on Azure for further information.
+
+
+
+
enable
+
If enable is true, must specify all properties of the elkSettings.
+
+
+
+
elasticsearchEndpoint
+
Endpoint of the Elasticsearch instance.
+
+
+
+
elasticsearchPassword
+
Password for Elasticsearch account.
+
+
+
+
elasticsearchUserName
+
User name for Elasticsearch account.
+
+
+
+
logIndex
+
Must be the same value output at ELK deployment time.
+
+
+
+
logsToIntegrate
+
Array with string value. Specify the expeted logs to integrate, you must input at least one log.
+
+
+
enableCoherence
+
If true, create application managed server and add to the Coherence cluster application tier.
+
+
+
numberOfExistingNodes
+
The number of existing managed application servers, used to generate new virtual machine name.
+
+
+
numberOfNewNodes
+
The number of application managed server to add.
+
+
+
storageAccountName
+
The name of an existing storage account.
+
+
+
wlsDomainName
+
Must be the same value provided at deployment time.
+
+
+
wlsUserName
+
Must be the same value provided at deployment time.
+
+
+
wlsPassword
+
Must be the same value provided at deployment time.
If enable is true, must specify all properties of the customSSLSettings.
+ Set to false by default.
+
+
+
customIdentityKeyStoreBase64String
+
The based64 string of the custom identity keystore file that will be configured in the WebLogic Administration Server to enable SSL connection.
+
+
+
customIdentityKeyStorePassPhrase
+
The identity keystore pass phrase
+
+
+
customIdentityKeyStoreType
+
Identity Key Store Type. This can be either JKS or PKCS12
+
+
+
customTrustKeyStoreBase64String
+
The based64 string of the custom trust keystore file that will be configured in the WebLogic Administration Server to enable SSL connection.
+
+
+
customTrustKeyStorePassPhrase
+
The trust keystore pass phrase
+
+
+
customTrustKeyStoreType
+
Trust Key Store Type. This can be either JKS or PKCS12
+
+
+
privateKeyAlias
+
The private key alias
+
+
+
privateKeyPassPhrase
+
The private Key Pass phrase.
+
+
+
+### `_artifactsLocation`
+
+This value must be the following.
+
+```bash
+{{ armTemplateAddNodeBasePath }}
+```
+
+### Enable SSH Authentication to VMs
+If the cluster was deployed with SSH Authentication to VMs enabled, add this variable to your parameter file and fill in the base64 decoded public SSH key string to the `adminPasswordOrKey` field:
+```
+ "authenticationType": {
+ "value": "sshPublicKey"
+ },
+ "adminPasswordOrKey": {
+ "value": "ssh-rsa ...."
+ },
+```
+
+### Enable coherence
+If `enableCoherence` is `true`, the template will create Azure resources to host new managed servers, and configure new application nodes to Coherence cluster. If your cluster is not Coherence cluster, please do not set this parameter `true`.
+
+### Existing managed application servers
+To differentiate functionality of managed servers, we use **managed application server** to represent managed servers that host Java EE application, and use **managed cache server** to represent managed servers that used for cache.
+
+You can get the existing managed application servers with the following command:
+
+```shell
+$ resourceGroup=
+$ managedServerPrefix=
+$ numberOfExistingNodes=$(az resource list -g ${resourceGroup} --resource-type Microsoft.Compute/virtualMachines --query [*].name | grep "${managedServerPrefix}VM[0-9]" | sed -e 's/[^0-9]/ /g' -e 's/^ *//g' -e 's/ *$//g' | tr -s ' ' | sed 's/ /\n/g' | sort -nr | head -n1)
+$ echo ${numberOfExistingNodes}
+```
+
+### Log index
+
+If you configured ELK in your cluster to export WebLogic Server logs to ELK, please input the value of Kibana log index, this template will set up ELK connection and export logs to specified index.
+
+You can get the value from Azure portal with the following steps:
+
+* Go to Azure portal.
+* Open you resource group and click **Deployments**.
+* Open the ELK deployment, and click **Output**.
+* Copy the value of `logIndex`.
+
+Alternatively, use Azure CLI command to list log index inside the resource group deployments:
+
+```shell
+$ az deployment group list -g 'yourResourceGroup' --query [*].properties.outputs.logIndex.value
+[
+ "azure-weblogic-cluster-f984df74-ab4d-4c17-a532-7f248659fb28"
+]
+```
+
+### Storage account
+
+Each Storage Account handles up to 20,000 IOPS, and 500TB of data. If you use a storage account for Standard Virtual Machines, you can store until 40 virtual disks.
+
+We have two disks for one Virtual Machine, it's suggested no more than 20 Virtual Machines share the same storage account. Number of virtual machines that hosting managed servers should be less than or equal to 20.
+
+You can get the name of storage account from Azure portal with steps:
+
+ * Go to Azure portal
+ * Go to the your resource group
+ * Find storage account resource and copy its name
+
+Alternatively, use Azure CLI command to list storage account inside a resource group:
+
+```shell
+$ az resource list -g 'yourResourceGroup' --resource-type Microsoft.Storage/storageAccounts --query [*].name
+[
+ "219846olvm"
+]
+```
+
+#### Example Parameters JSON
+
+Here is a fully filled out parameters file, with Azure Active Directory enabled. We will leave values of `adminUsername`, `authenticationType`, `dnsLabelPrefix`, `managedServerPrefix`, `skuUrnVersion`, `usePreviewImage` and `vmSizeSelect` as default value.
+
+{{ site.data.var.passwordInFileNote }}
+
+```json
+{
+ "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "_artifactsLocation": {
+ "value": "{{ armTemplateAddNodeBasePath }}"
+ },
+ "aadsSettings": {
+ "value": {
+ "enable": true,
+ "publicIP":"13.68.244.90",
+ "serverHost": "ladps.wls-security.com",
+ "certificateBase64String":"LS0tLS1C...tLS0tLQ0K"
+ }
+ },
+ "adminPasswordOrKey": {
+ "value": "Secret123!"
+ },
+ "adminURL":{
+ "value": "adminVM:7001"
+ },
+ "appGatewaySettings": {
+ "value": {
+ "enable": true,
+ "publicIPName": "gwip",
+ "certificateBase64String": "MIIKQQI...gIIAA==",
+ "certificatePassword": "Secret123!"
+ }
+ },
+ "elkSettings": {
+ "value": {
+ "enable": true,
+ "elasticsearchEndpoint":"https://example.eastus2.azure.elastic-cloud.com:9243",
+ "elasticsearchPassword": "Secret123!",
+ "elasticsearchUserName":"elastic",
+ "logIndex": "azure-weblogic-dynamic-cluster-11122020",
+ "logsToIntegrate": ["HTTPAccessLog", "ServerLog", "DomainLog", "DataSourceLog", "StandardErrorAndOutput", "NodeManagerLog"]
+ }
+ },
+ "location": {
+ "value": "eastus"
+ },
+ "numberOfExistingNodes": {
+ "value": 4
+ },
+ "numberOfNewNodes": {
+ "value": 3
+ },
+ "storageAccountName": {
+ "value": "496dfdolvm"
+ },
+ "wlsDomainName": {
+ "value": "wlsd"
+ },
+ "wlsUserName": {
+ "value": "weblogic"
+ },
+ "wlsPassword": {
+ "value": "welcome1"
+ },
+ "customSSLSettings": {
+ "value": {
+ "enable": true,
+ "customIdentityKeyStoreBase64String": "/u3+7QAAAAIAAAABAAAAAQAKc2VydmV....QZL24ljJLq",
+ "customIdentityKeyStorePassPhrase": "mypassword",
+ "customIdentityKeyStoreType": "JKS",
+ "customTrustKeyStoreBase64String": "/u3+7QAAAAIAAAABAAAAAgAJdHJ1c3R....Td4bYVnONyS0PC7k=",
+ "customTrustKeyStorePassPhrase": "mypassword",
+ "customTrustKeyStoreType": "JKS",
+ "privateKeyAlias": "servercert",
+ "privateKeyPassPhrase": "mypassword"
+ }
+ }
+ }
+}
+```
+
+## Invoke the ARM template
+
+Assume your parameters file is available in the current directory and is named `parameters.json`. This section shows the commands to configure your {{ site.data.var.wlsFullBrandName }} deployment to add new nodes. Replace `yourResourceGroup` with the Azure resource group in which the {{ site.data.var.wlsFullBrandName }} is deployed.
+
+### First, validate your parameters file
+
+The `az group deployment validate` command is very useful to validate your parameters file is syntactically correct.
+
+```bash
+az group deployment validate --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateAddNodeBasePath }}arm/mainTemplate.json
+```
+
+If the command returns with an exit status other than `0`, inspect the output and resolve the problem before proceeding. You can check the exit status by executing the commad `echo $?` immediately after the `az` command.
+
+### Next, execute the template
+
+After successfully validating the template invocation, change `validate` to `create` to invoke the template.
+
+```bash
+az group deployment create --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateAddNodeBasePath }}arm/mainTemplate.json
+```
+
+As with the validate command, if the command returns with an exit status other than `0`, inspect the output and resolve the problem.
+
+This is an example output of successful deployment. Look for `"provisioningState": "Succeeded"` in your output.
+
+```bash
+{
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Resources/deployments/mainTemplate",
+ "location": null,
+ "name": "mainTemplate",
+ "properties": {
+ "correlationId": "54517529-a1c4-422f-a539-23b9a5129e80",
+ "debugSetting": null,
+ "dependencies": [
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Compute/virtualMachines/mspVM7/extensions/newuserscript",
+ "resourceGroup": "oraclevm-dcluster-0727",
+ "resourceName": "mspVM7/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Resources/deployments/pid-c7671c10-ae59-5ec5-bff3-c60db22d7ea4",
+ "resourceGroup": "oraclevm-dcluster-0727",
+ "resourceName": "pid-c7671c10-ae59-5ec5-bff3-c60db22d7ea4",
+ "resourceType": "Microsoft.Resources/deployments"
+ },
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Network/publicIPAddresses/mspVM7_PublicIP",
+ "resourceGroup": "oraclevm-dcluster-0727",
+ "resourceName": "mspVM7_PublicIP",
+ "resourceType": "Microsoft.Network/publicIPAddresses"
+ }
+ ],
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Network/networkInterfaces/mspVM7_NIC",
+ "resourceGroup": "oraclevm-dcluster-0727",
+ "resourceName": "mspVM7_NIC",
+ "resourceType": "Microsoft.Network/networkInterfaces"
+ },
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Network/networkInterfaces/mspVM7_NIC",
+ "resourceGroup": "oraclevm-dcluster-0727",
+ "resourceName": "mspVM7_NIC",
+ "resourceType": "Microsoft.Network/networkInterfaces"
+ },
+ {
+ "apiVersion": "2019-06-01",
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Storage/storageAccounts/09b943olvm",
+ "resourceGroup": "oraclevm-dcluster-0727",
+ "resourceName": "09b943olvm",
+ "resourceType": "Microsoft.Storage/storageAccounts"
+ }
+ ],
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Compute/virtualMachines/mspVM7",
+ "resourceGroup": "oraclevm-dcluster-0727",
+ "resourceName": "mspVM7",
+ "resourceType": "Microsoft.Compute/virtualMachines"
+ },
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Compute/virtualMachines/mspVM7",
+ "resourceGroup": "oraclevm-dcluster-0727",
+ "resourceName": "mspVM7",
+ "resourceType": "Microsoft.Compute/virtualMachines"
+ },
+ {
+ "actionName": "listKeys",
+ "apiVersion": "2019-04-01",
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Storage/storageAccounts/09b943olvm",
+ "resourceGroup": "oraclevm-dcluster-0727",
+ "resourceName": "09b943olvm",
+ "resourceType": "Microsoft.Storage/storageAccounts"
+ }
+ ],
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Compute/virtualMachines/mspVM7/extensions/newuserscript",
+ "resourceGroup": "oraclevm-dcluster-0727",
+ "resourceName": "mspVM7/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "duration": "PT9M6.8098765S",
+ "mode": "Incremental",
+ "onErrorDeployment": null,
+ "outputResources": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Compute/virtualMachines/mspVM7",
+ "resourceGroup": "oraclevm-dcluster-0727"
+ },
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Compute/virtualMachines/mspVM7/extensions/newuserscript",
+ "resourceGroup": "oraclevm-dcluster-0727"
+ },
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Network/networkInterfaces/mspVM7_NIC",
+ "resourceGroup": "oraclevm-dcluster-0727"
+ },
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Network/publicIPAddresses/mspVM7_PublicIP",
+ "resourceGroup": "oraclevm-dcluster-0727"
+ }
+ ],
+ "outputs": {
+ "wlsDomainLocation": {
+ "type": "String",
+ "value": "/u01/domains/wlsd"
+ }
+ },
+ "parameters": {
+ "_artifactsLocation": {
+ "type": "String",
+ "value": "{{ armTemplateAddNodeBasePath }}"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "SecureString"
+ },
+ "aadsSettings": {
+ "type": "Object",
+ "value": {
+ "certificateBase64String": "LS0tLS1C...S0tLQ0K",
+ "enable": true,
+ "publicIP": "40.76.11.111",
+ "serverHost": "ladps.wls-security.com"
+ }
+ },
+ "adminPasswordOrKey": {
+ "type": "SecureString"
+ },
+ "adminURL": {
+ "type": "String",
+ "value": "adminVM:7001"
+ },
+ "adminUsername": {
+ "type": "String",
+ "value": "weblogic"
+ },
+ "authenticationType": {
+ "type": "String",
+ "value": "password"
+ },
+ "dnsLabelPrefix": {
+ "type": "String",
+ "value": "wls"
+ },
+ "guidValue": {
+ "type": "String",
+ "value": "67657ba3-6248-46e5-bedc-53e16ac82571"
+ },
+ "location": {
+ "type": "String",
+ "value": "eastus"
+ },
+ "managedServerPrefix": {
+ "type": "String",
+ "value": "msp"
+ },
+ "numberOfExistingNodes": {
+ "type": "Int",
+ "value": 7
+ },
+ "numberOfNewNodes": {
+ "type": "Int",
+ "value": 1
+ },
+ "skuUrnVersion": {
+ "type": "String",
+ "value": "owls-122130-8u131-ol74;Oracle:weblogic-122130-jdk8u131-ol74:owls-122130-8u131-ol7;1.1.1"
+ },
+ "storageAccountName": {
+ "type": "String",
+ "value": "09b943olvm"
+ },
+ "usePreviewImage": {
+ "type": "Bool",
+ "value": false
+ },
+ "vmSizeSelect": {
+ "type": "String",
+ "value": "Standard_A3"
+ },
+ "wlsDomainName": {
+ "type": "String",
+ "value": "wlsd"
+ },
+ "wlsPassword": {
+ "type": "SecureString"
+ },
+ "wlsUserName": {
+ "type": "String",
+ "value": "weblogic"
+ },
+ "customSSLSettings": {
+ "type": "Object",
+ "value": {
+ "enable": true,
+ "customIdentityKeyStoreBase64String": "/u3+7QAAAAIAAAABAAAAAQAKc2VydmV....QZL24ljJLq",
+ "customIdentityKeyStorePassPhrase": "mypassword",
+ "customIdentityKeyStoreType": "JKS",
+ "customTrustKeyStoreBase64String": "/u3+7QAAAAIAAAABAAAAAgAJdHJ1c3R....Td4bYVnONyS0PC7k=",
+ "customTrustKeyStorePassPhrase": "mypassword",
+ "customTrustKeyStoreType": "JKS",
+ "privateKeyAliasSecret": "servercert",
+ "privateKeyPassPhraseSecret": "mypassword"
+ }
+ }
+ },
+ "parametersLink": null,
+ "providers": [
+ {
+ "id": null,
+ "namespace": "Microsoft.Resources",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ null
+ ],
+ "properties": null,
+ "resourceType": "deployments"
+ }
+ ]
+ },
+ {
+ "id": null,
+ "namespace": "Microsoft.Network",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "publicIPAddresses"
+ },
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "networkInterfaces"
+ }
+ ]
+ },
+ {
+ "id": null,
+ "namespace": "Microsoft.Compute",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "virtualMachines"
+ },
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "virtualMachines/extensions"
+ }
+ ]
+ }
+ ],
+ "provisioningState": "Succeeded",
+ "template": null,
+ "templateHash": "15879952829017360289",
+ "templateLink": {
+ "contentVersion": "1.0.0.0",
+ "uri": "{{ armTemplateAddNodeBasePath }}arm/mainTemplate.json"
+ },
+ "timestamp": "2020-07-27T12:37:03.733682+00:00"
+ },
+ "resourceGroup": "oraclevm-dcluster-0727",
+ "type": "Microsoft.Resources/deployments"
+}
+```
+
+## Verify
+
+### Verify if new nodes are added to the WebLogic Server instance.
+
+* Go to the {{ site.data.var.wlsFullBrandName }} Administration Console.
+* Go to **Environment** -> **Machines**.
+
+ You should see logical machines with name parttern `^{managedServerPrefix}VM[0-9]+`, machine names with number suffix from `numberOfExistingNodes` to `numberOfExistingNodes + numberOfNewNodes` are added.
+* Go to **Environment** -> **Servers**
+
+ You should see servers with name parttern `^{managedServerPrefix}[0-9]+$`, server names with number suffix from `numberOfExistingNodes` to `numberOfExistingNodes + numberOfNewNodes` are added to `cluster1`.
+
+
+### Verify if the newly added server has SSL configured successfully
+* If the input parameter customSSLSettings.enable is set to true and the required custom SSL configuration values have been provided, then you should see the SSL configuration for the newly added server under **Environment** -> **Servers** -> **New Server** -> **Keystores**
+
+### Verify if Azure resources are added
+
+* Go to [Azure Portal](https://ms.portal.azure.com/).
+* Go to resource group that the {{ site.data.var.wlsFullBrandName }} is deployed.
+
+ You should see corresponding Vitual Machines, Disks, Network Interfaces, Public IPs have been added.
+
+### Verify AAD Integration
+
+Verify AAD integration by delpoying a simple Java EE applciation with basic authentication.
+
+* Go to Administration Server Console and deploy [testing application](../resources/basicauth.war).
+ * Select **Deployments**.
+ * Select **Install**.
+ * Select file `basicauth.war`.
+ * Select **Next**. Choose "Install this deployment as an application".
+ * Select **Next**. Select "cluster-1" and "All servers in the cluster".
+ * Keep configuration as default and select **Finish**.
+ * Select **Activate Changes**
+ * In the left navigation pane, select **Deployments**.
+ * Select **Control**
+ * Select `basicauth`
+ * Select **Start**
+ * Select **Servicing all requests**
+
+* Access the sample application
+ * Go to Administration Server Console
+ * Go to **Environment -> Machines**. Click one of the new machines, make sure there are servers running on that machine. Click **Node Manager** and make note of the machine host in **Listen Address**, here named it as `machineName`. Click **Servers** and make note of **Listen Port**, here named it as `port`.
+ * Go to [Azure Portal](https://ms.portal.azure.com/), and get DNS name from Virtual Machine has the same name of `machineName`, named it `machineDNS`
+ * Go to `http://${machineDNS}:${port}/basicauth`, the browser will prompt up to ask for credentials, input one of AAD users from group **AAD DC Administrators**, note that use name should be **sAMAccountName**, for example `wlstest` for user `wlstest@javaeehotmailcom.onmicrosoft.com`.
+ * Expected result, you can access the sample application without error.
diff --git a/subtemplate-src/cluster-customDNSTemplate.md b/subtemplate-src/cluster-customDNSTemplate.md
new file mode 100644
index 000000000..944709c37
--- /dev/null
+++ b/subtemplate-src/cluster-customDNSTemplate.md
@@ -0,0 +1,174 @@
+{% include variables.md %}
+
+# Configure DNS alias to {{ site.data.var.wlsFullBrandName }}
+
+This page documents how to configure an existing deployment of {{ site.data.var.wlsFullBrandName }} with a custom DNS alias.
+
+## Prerequisites
+
+### Environment for Setup
+
+* [Azure CLI](https://docs.microsoft.com/en-us/cli/azure), use `az --version` to test if `az` works.
+
+### WebLogic Server Instance
+
+The DNS Configuraton ARM template will be applied to an existing {{ site.data.var.wlsFullBrandName }} instance. If you don't have one, please create a new instance from the Azure portal, by following the link to the offer [in the index](index.md).
+
+### Registered Domain Name
+
+You need to buy a domain name to create a custom DNS alias.
+
+### Azure DNS Zone
+
+If you create the DNS alias on an existing [Azure DNS Zone](https://docs.microsoft.com/en-us/azure/dns/dns-overview), make sure you have perfomed the [Azure DNS Delegation](https://docs.microsoft.com/en-us/azure/dns/dns-domain-delegation). Once you have completed the delegation, you can verify it with `nslookup`. For example, assuming your domain name is **contoso.com**, this output shows a correct delegation.
+
+```bash
+$ nslookup -type=SOA contoso.com
+Server: 172.29.80.1
+Address: 172.29.80.1#53
+
+Non-authoritative answer:
+contoso.com
+ origin = ns1-01.azure-dns.com
+ mail addr = azuredns-hostmaster.microsoft.com
+ serial = 1
+ refresh = 3600
+ retry = 300
+ expire = 2419200
+ minimum = 300
+Name: ns1-01.azure-dns.com
+Address: 40.90.4.1
+Name: ns1-01.azure-dns.com
+Address: 2603:1061::1
+```
+
+We strongly recommand you create an Azure DNS Zone for domain management and reuse it for other perpose. Follow the [guide](https://docs.microsoft.com/en-us/azure/dns/dns-getstarted-portal) to create an Azure DNS Zone.
+
+### Azure Managed Indentify
+
+If you are going to configure DNS alias based on an existing DNS Zone, you are required to input the ID of a user-assigned managed identity.
+
+Follow this [guide](https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/how-to-manage-ua-identity-portal) to create a user-assigned managed identity.
+
+To obtain ID of the indentify: go to Azure Portal; open the identity **Overview** page; click **JSON View** and copy the **Resource ID**.
+
+
+## Prepare the Parameters
+
+We provide an automation shell script for DNS configuration. You must specify the information of the existing Oracle WebLogic Server. This section shows how to obtain the values for the following required properties.
+
+| Parameter Name | Explanation |
+|----------------|-------------|
+| `--admin-vm-name`| Required. Name of vitual machine that hosts {{ site.data.var.wlsFullBrandName }} admin server. Must be the same value provided at initial deployment time.|
+| `--admin-console-label` | Required. Label for {{ site.data.var.wlsFullBrandName }} admin console. Used to generate subdomain of admin console. |
+| `--artifact-location`| Required. See below for details. |
+| `--resource-group` | Required. Name of resource group that has WebLogic cluster deployed. |
+| `--location ` | Required. Must be the same region into which the server was initially deployed. |
+| `--zone-name ` | Required. Azure DNS Zone name. |
+| `--gateway-label` | Optional. Label for applciation gateway. Used to generate subdomain of application gateway. The parameter is only required if you want to create DNS alias for application gateway.|
+| `--identity-id` | Optional. ID of Azure user-assigned managed identity. The parameter is only required if you are creating DNS alias on an existing DNS Zone.|
+| `--zone-resource-group` | Optional. Name of resource group that has Azure DNS Zone deployed. The parameter is only required if you are creating DNS alias on an existing DNS Zone. |
+| `--help` | Help. |
+
+### Artifacts location
+
+This value must be the following.
+
+```bash
+{{ armTemplateBasePath }}
+```
+
+## Invoke the Automation Script
+
+We provide an automation script to configure a custom DNS alias. The script lets you do the following:
+
+ * If you have an Azure DNS Zone, it will create a DNS alias for the admin console and application gateway on the existing DNS Zone.
+ * If you don't have an Azure DNS Zone, it will create the DNS Zone in the same resource group as the WebLogic cluster, then create the DNS alias for the admin console and application gateway.
+
+### Configure DNS Alias on an Existing Azure DNS Zone
+
+To configure a DNS alias on an existing Azure DNS Zone, in addition to the required parameters, you must also specify an Azure user-assigned managed identity ID and the resource group name in which your DNS Zone is deployed.
+
+This is an example to create a DNS alias `admin.contoso.com` for the admin console and `applciations.contoso.com` for the application gateway on an existing Azure DNS Zone.
+
+```bash
+$ curl -fsSL {{ site.data.var.artifactsLocationBase }}{{ pageDir }}/{{ site.data.var.artifactsLocationTag }}/cli-scripts/custom-dns-alias-cli.sh \
+ | /bin/bash -s -- \
+ --resource-group `yourResourceGroup` \
+ --admin-vm-name adminVM \
+ --admin-console-label admin \
+ --artifact-location {{ armTemplateBasePath }} \
+ --location eastus \
+ --zone-name contoso.com \
+ --gateway-label applications \
+ --identity-id `yourIndentityID` \
+ --zone-resource-group `yourDNSZoneResourceGroup`
+```
+
+An example output:
+
+```text
+Done!
+
+Custom DNS alias:
+ Resource group: haiche-dns-doc
+ WebLogic Server Administration Console URL: http://admin.contoso.com:7001/console
+ WebLogic Server Administration Console secured URL: https://admin.contoso.com:7002/console
+
+
+ Application Gateway URL: http://applications.contoso.com
+ Application Gateway secured URL: https://applications.contoso.com
+```
+
+
+### Configure DNS Alias on a New Azure DNS Zone
+
+To configure a DNS alias on a new Azure DNS Zone, you must specify the required parameters.
+
+This is an example of creating an Azure DNS Zone, then creating a DNS alias `admin.contoso.com` for the admin console and `applications.contoso.com` for application gateway.
+
+```bash
+$ curl -fsSL {{ site.data.var.artifactsLocationBase }}{{ pageDir }}/{{ site.data.var.artifactsLocationTag }}/cli-scripts/custom-dns-alias-cli.sh \
+ | /bin/bash -s -- \
+ --resource-group `yourResourceGroup` \
+ --admin-vm-name adminVM \
+ --admin-console-label admin \
+ --artifact-location {{ armTemplateBasePath }} \
+ --location eastus \
+ --zone-name contoso.com \
+ --gateway-label applications
+```
+
+An example output:
+
+```text
+DONE!
+
+
+Action required:
+ Complete Azure DNS delegation to make the alias accessible.
+ Reference: https://aka.ms/dns-domain-delegation
+ Name servers:
+ [
+ "ns1-02.azure-dns.com.",
+ "ns2-02.azure-dns.net.",
+ "ns3-02.azure-dns.org.",
+ "ns4-02.azure-dns.info."
+ ]
+
+Custom DNS alias:
+ Resource group: haiche-dns-doc
+ WebLogic Server Administration Console URL: http://admin.contoso.com:7001/console
+ WebLogic Server Administration Console secured URL: https://admin.contoso.com:7002/console
+
+
+ Application Gateway URL: http://applications.contoso.com
+ Application Gateway secured URL: https://applications.contoso.com
+```
+
+**Note:** The DNS aliases are not accessible now, you must perform Azure DNS delegation after the deployment. Follow [Delegation of DNS zones with Azure DNS](https://aka.ms/dns-domain-delegation) to complete the Azure DNS delegation.
+
+
+## Verify the Custom Alias
+
+Access the URL from output to verify if the custom alias works.
diff --git a/subtemplate-src/cluster-deletenode.md b/subtemplate-src/cluster-deletenode.md
new file mode 100644
index 000000000..5f9311fa1
--- /dev/null
+++ b/subtemplate-src/cluster-deletenode.md
@@ -0,0 +1,537 @@
+{% include variables.md %}
+
+# Delete nodes from {{ site.data.var.wlsFullBrandName }}
+
+This page documents how to configure an existing deployment of {{ site.data.var.wlsFullBrandName }} to delete nodes using Azure CLI.
+
+## Prerequisites
+
+### Environment for Setup
+
+* [Azure CLI](https://docs.microsoft.com/en-us/cli/azure), use `az --version` to test if `az` works.
+
+### WebLogic Server Instance
+
+The template will be applied to an existing {{ site.data.var.wlsFullBrandName }} instance. If you don't have one, please create a new instance from the Azure portal, by following the link to the offer [in the index](index.md).
+
+## Prepare the Parameters JSON file
+
+You must construct a parameters JSON file containing the parameters to the delete-node ARM template. See [Create Resource Manager parameter file](https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/parameter-files) for background information about parameter files. You must specify the information of the existing {{ site.data.var.wlsFullBrandName }} and nodes to be deleted. This section shows how to obtain the values for the following required properties.
+
+| Parameter Name | Explanation |
+|----------------|-------------|
+| `_artifactsLocation`| See below for details. |
+| `adminVMName`| At deployment time, if this value was changed from its default value, the value used at deployment time must be used. Otherwise, this parameter should be omitted. |
+| `deletingManagedServerNames` | The names of managed server that you want to delete. |
+| `deletingManagedServerMachineNames`| The resource names of Azure Virtual Machine hosting managed servers that you want to delete. |
+| `wlsPassword` | Must be the same value provided at deployment time. |
+| `wlsUserName` | Must be the same value provided at deployment time. |
+
+### `_artifactsLocation`
+
+This value must be the following.
+
+```bash
+{{ armTemplateDeleteNodeBasePath }}
+```
+
+### `deletingManagedServerNames`
+
+This value must be an array of strings, for example: `["msp1", "msp2"]`.
+
+You can get the server names from WebLogic Server Administration Console, following the steps:
+
+* Go to WebLogic Server Administration Console, http://admin-host:7001/console.
+
+* Go to **Environment** -> **Servers**.
+
+ You will find all available servers. Server names are listed in **Name** column.
+
+ Make note of the machine for the deleting servers, you need to find out corresponding Azure Virtual Machine names of those machines.
+
+### `deletingManagedServerMachineNames`
+
+This value must be an array of strings, for example: `["mspVM1", "mspVM2"]`.
+
+You can get the server names from WebLogic Server Administration Console, following the steps:
+
+* Go to WebLogic Server Administration Console, http://admin-host:7001/console.
+
+* Go to **Environment** -> **Machines**.
+
+ Open the machine you noted down in step `deletingManagedServerNames`.
+
+ Click **Configuration** -> **Node Manager**, you will get compute name from **Listen Address**.
+
+ The Azure Virtual Machine name was set with the same value of compute name during {{ site.data.var.wlsFullBrandName }} deployment.
+
+#### Example Parameters JSON
+
+Here is a fully filled out parameters file. Note that here we do not include `adminVMName`.
+
+{{ site.data.var.passwordInFileNote }}
+
+```json
+{
+ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "_artifactsLocation": {
+ "value": "{{ armTemplateDeleteNodeBasePath }}"
+ },
+ "deletingManagedServerNames": {
+ "value": [
+ "msp4",
+ "mspStorage2"
+ ]
+ },
+ "deletingManagedServerMachineNames": {
+ "value": [
+ "mspVM4",
+ "mspStorageVM2"
+ ]
+ },
+ "wlsPassword": {
+ "value": "welcome1"
+ },
+ "wlsUserName": {
+ "value": "weblogic"
+ }
+ }
+}
+```
+
+## Invoke the delete-node script
+
+To delete managed nodes completely, you have to delete managed servers logically from the WebLogic Server instance, and physically release Azure resources that host the managed servers. We realize the two purposes in different ways:
+ * Delete managed servers and machines logically from WebLogic Server instance by deploying delete-node ARM template with Azure CLI. You have to specify the parameters file.
+ * Release corresponding Azure resources by running Azure CLI commands. The following resources will be removed:
+ * Virtual Machines that host managed servers that will be deleted.
+ * Data disks attached to the Virtual Machines
+ * OS disks attached to the Virtual Machines
+ * Network Interfaces added to the Virtual Machines
+ * Public IPs attached to the Virtual Machines
+ * If the Application Gateway is deployed, will remove the manged server hosts from gateway.
+
+We have provided an automation script for above two purposes, you can delete managed nodes easily with the following instructions.
+
+### Invoke the script
+
+Assume your parameters file is available in the current directory and is named `parameters.json`. Replace `yourResourceGroup` with the Azure resource group in which the {{ site.data.var.wlsFullBrandName }} is deployed.
+
+The following command runs the script in silent mode with option `-s`, this mode will delete managed nodes logically and physically.
+
+If you want to keep Azure resources, refer to [advanced usage](#advanced-usage) for further information.
+
+```bash
+$ curl -fsSL {{ armTemplateDeleteNodeBasePath }}scripts/deletenode-cli.sh | /bin/bash -s -- -s -g `yourResourceGroup` -u {{ armTemplateDeleteNodeBasePath }}arm/mainTemplate.json -p parameters.json
+```
+
+The script will validate the template with your parameters file; deploy the template to delete managed servers from WebLogic Server cluster; run Azure CLI commands to delete corresponding Azure resources.
+
+This is an example output of successful deployment, the {{ site.data.var.wlsFullBrandName }} is deployed with Application Gateway. Look for `Completed!` in your output.
+
+```bash
+{
+ "error": null,
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-07232/providers/Microsoft.Resources/deployments/mainTemplate",
+ "name": "mainTemplate",
+ "properties": {
+ "correlationId": "cbfaa443-3a72-4217-83e1-cc91485597fa",
+ "debugSetting": null,
+ "dependencies": [
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-07232/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "oraclevm-cluster-07232",
+ "resourceName": "adminVM/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-07232/providers/Microsoft.Resources/deployments/pid-4b263220-3cc6-53b9-aef3-23ad10c45d52",
+ "resourceGroup": "oraclevm-cluster-07232",
+ "resourceName": "pid-4b263220-3cc6-53b9-aef3-23ad10c45d52",
+ "resourceType": "Microsoft.Resources/deployments"
+ }
+ ],
+ "duration": "PT0S",
+ "mode": "Incremental",
+ "onErrorDeployment": null,
+ "outputs": null,
+ "parameters": {
+ "_artifactsLocation": {
+ "type": "String",
+ "value": "{{ armTemplateDeleteNodeBasePath }}"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "SecureString"
+ },
+ "adminVMName": {
+ "type": "String",
+ "value": "adminVM"
+ },
+ "deletingManagedServerMachineNames": {
+ "type": "Array",
+ "value": [
+ "mspVM2"
+ ]
+ },
+ "deletingManagedServerNames": {
+ "type": "Array",
+ "value": [
+ "msp2"
+ ]
+ },
+ "location": {
+ "type": "String",
+ "value": "eastus"
+ },
+ "wlsForceShutDown": {
+ "type": "String",
+ "value": "true"
+ },
+ "wlsPassword": {
+ "type": "SecureString"
+ },
+ "wlsUserName": {
+ "type": "String",
+ "value": "weblogic"
+ }
+ },
+ "parametersLink": null,
+ "providers": [
+ {
+ "id": null,
+ "namespace": "Microsoft.Resources",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ null
+ ],
+ "properties": null,
+ "resourceType": "deployments"
+ }
+ ]
+ },
+ {
+ "id": null,
+ "namespace": "Microsoft.Compute",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "virtualMachines/extensions"
+ }
+ ]
+ }
+ ],
+ "provisioningState": "Succeeded",
+ "template": null,
+ "templateHash": "3171958496378517565",
+ "templateLink": {
+ "contentVersion": "1.0.0.0",
+ "uri": "{{ armTemplateDeleteNodeBasePath }}arm/mainTemplate.json"
+ },
+ "timestamp": "2020-07-23T07:44:38.977624+00:00",
+ "validatedResources": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-07232/providers/Microsoft.Resources/deployments/pid-7d4ae6d6-17c5-5168-b7d2-e0bf33a1e878",
+ "resourceGroup": "oraclevm-cluster-07232"
+ },
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-07232/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "oraclevm-cluster-07232"
+ },
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-07232/providers/Microsoft.Resources/deployments/pid-4b263220-3cc6-53b9-aef3-23ad10c45d52",
+ "resourceGroup": "oraclevm-cluster-07232"
+ }
+ ]
+ },
+ "resourceGroup": "oraclevm-cluster-07232",
+ "type": "Microsoft.Resources/deployments"
+}
+Accepted: newuserscript (Microsoft.Compute/virtualMachines/extensions)
+Accepted: deletenode-1595490274 (Microsoft.Resources/deployments)
+Command ran in 102.719 seconds (init: 0.061, invoke: 102.658)
+Extension 'resource-graph' is already installed.
+List resource Ids to be deleted:
+/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-07232/providers/Microsoft.Compute/virtualMachines/mspVM2
+/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-07232/providers/Microsoft.Network/networkInterfaces/mspVM2_NIC
+/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-07232/providers/Microsoft.Network/publicIPAddresses/mspVM2_PublicIP
+/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/ORACLEVM-CLUSTER-07232/providers/Microsoft.Compute/disks/mspVM2_OsDisk_1_e6d8ffb0e73649a4a713acf5e6ca7099
+/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/ORACLEVM-CLUSTER-07232/providers/Microsoft.Compute/disks/mspVM2_lun_0_2_942609646fdc4e1dab06b23ffeee650f
+Are you sure to delete these resources (y/n)?Deleting managed resources...Please do not stop.
+[
+ null,
+ null,
+ null,
+ null,
+ null
+]
+Command ran in 112.375 seconds (init: 0.062, invoke: 112.313)
+Check if application gateway has deployed...
+Removing mspVM2 from application gateway, please do not stop.
+{
+ "backendAddresses": [
+ {
+ "fqdn": "mspVM1",
+ "ipAddress": null
+ },
+ {
+ "fqdn": "mspVM3",
+ "ipAddress": null
+ }
+ ],
+ "backendIpConfigurations": null,
+ "etag": "W/\"23399346-e17b-4f56-bda4-5e77c1d82195\"",
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-07232/providers/Microsoft.Network/applicationGateways/myAppGateway/backendAddressPools/myGatewayBackendPool",
+ "name": "myGatewayBackendPool",
+ "provisioningState": "Succeeded",
+ "resourceGroup": "oraclevm-cluster-07232",
+ "type": "Microsoft.Network/applicationGateways/backendAddressPools"
+}
+
+Complete!
+```
+
+### Advanced usage
+
+If you want to learn more about the script and run it manually, follow the advanced instructions to interact with the ternimal.
+
+ * Download the script
+
+ ```bash
+ $ curl -fsSL {{ armTemplateDeleteNodeBasePath }}scripts/deletenode-cli.sh
+ ```
+
+ You will get a shell script named `deletenode-cli.sh` in your current directory. Usage of the script:
+
+ ```bash
+ ./deletenode-cli.sh -h
+ usage: deletenode-cli.sh -g resource-group [-f template-file] [-u template-url] -p paramter-file [-h]
+ -g Azure Resource Group of the Vitural Machines that host deleting manages servers, must be specified.
+ -f Path of ARM template to delete nodes, must be specified -f option or -u option.
+ -u URL of ARM template, must be specified -f option or -u option.
+ -p Path of ARM parameter, must be specified.
+ -s Execute the script in silent mode. The script will input y automatically for the prompt.
+ -h Help
+ ```
+
+ You can not only run the script with a local template file by specifying `-f` option, but also with a templatle URL using `-u` option.
+
+ * Run the script
+
+ Run the script with your parameters file in your current directory. The following command runs with a template URL:
+
+ ```bash
+ ./deletenode-cli.sh -g yourResourceGroup -u {{ armTemplateDeleteNodeBasePath }}arm/mainTemplate.json -p parameters.json
+ ```
+
+ Before deleting any Azure resource, the script will prompt up message **Are you sure to delete these resources (y/n)?** to comfirm if you want to delete Azure resources. If you input `Y/y`, the Azure resources will be deleted. Otherwise, keep the resource and exit.
+
+ This is an example output of deployment that will not delete Azure resources from your resource group, the {{ site.data.var.wlsFullBrandName }} is deployed with Application Gateway. Look for `Completed!` in your output.
+
+ ```bash
+ {
+ "error": null,
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-07232/providers/Microsoft.Resources/deployments/mainTemplate",
+ "name": "mainTemplate",
+ "properties": {
+ "correlationId": "4b15b45b-fb1f-4def-ad32-d96201000ac1",
+ "debugSetting": null,
+ "dependencies": [
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-07232/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "oraclevm-cluster-07232",
+ "resourceName": "adminVM/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-07232/providers/Microsoft.Resources/deployments/pid-4b263220-3cc6-53b9-aef3-23ad10c45d52",
+ "resourceGroup": "oraclevm-cluster-07232",
+ "resourceName": "pid-4b263220-3cc6-53b9-aef3-23ad10c45d52",
+ "resourceType": "Microsoft.Resources/deployments"
+ }
+ ],
+ "duration": "PT0S",
+ "mode": "Incremental",
+ "onErrorDeployment": null,
+ "outputs": null,
+ "parameters": {
+ "_artifactsLocation": {
+ "type": "String",
+ "value": "{{ armTemplateDeleteNodeBasePath }}"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "SecureString"
+ },
+ "adminVMName": {
+ "type": "String",
+ "value": "adminVM"
+ },
+ "deletingManagedServerMachineNames": {
+ "type": "Array",
+ "value": [
+ "mspVM3"
+ ]
+ },
+ "deletingManagedServerNames": {
+ "type": "Array",
+ "value": [
+ "msp3"
+ ]
+ },
+ "location": {
+ "type": "String",
+ "value": "eastus"
+ },
+ "wlsForceShutDown": {
+ "type": "String",
+ "value": "true"
+ },
+ "wlsPassword": {
+ "type": "SecureString"
+ },
+ "wlsUserName": {
+ "type": "String",
+ "value": "weblogic"
+ }
+ },
+ "parametersLink": null,
+ "providers": [
+ {
+ "id": null,
+ "namespace": "Microsoft.Resources",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ null
+ ],
+ "properties": null,
+ "resourceType": "deployments"
+ }
+ ]
+ },
+ {
+ "id": null,
+ "namespace": "Microsoft.Compute",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "virtualMachines/extensions"
+ }
+ ]
+ }
+ ],
+ "provisioningState": "Succeeded",
+ "template": null,
+ "templateHash": "3171958496378517565",
+ "templateLink": {
+ "contentVersion": "1.0.0.0",
+ "uri": "{{ armTemplateDeleteNodeBasePath }}arm/mainTemplate.json"
+ },
+ "timestamp": "2020-07-24T04:17:38.500948+00:00",
+ "validatedResources": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-07232/providers/Microsoft.Resources/deployments/pid-7d4ae6d6-17c5-5168-b7d2-e0bf33a1e878",
+ "resourceGroup": "oraclevm-cluster-07232"
+ },
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-07232/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "oraclevm-cluster-07232"
+ },
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-07232/providers/Microsoft.Resources/deployments/pid-4b263220-3cc6-53b9-aef3-23ad10c45d52",
+ "resourceGroup": "oraclevm-cluster-07232"
+ }
+ ]
+ },
+ "resourceGroup": "oraclevm-cluster-07232",
+ "type": "Microsoft.Resources/deployments"
+}
+Succeeded: pid-7d4ae6d6-17c5-5168-b7d2-e0bf33a1e878 (Microsoft.Resources/deployments)
+Accepted: deletenode-1595564252 (Microsoft.Resources/deployments)
+Accepted: newuserscript (Microsoft.Compute/virtualMachines/extensions)
+Command ran in 102.182 seconds (init: 0.089, invoke: 102.092)
+Extension 'resource-graph' is already installed.
+List resource Ids to be deleted:
+/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-07232/providers/Microsoft.Compute/virtualMachines/mspVM3
+/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-07232/providers/Microsoft.Network/networkInterfaces/mspVM3_NIC
+/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-07232/providers/Microsoft.Network/publicIPAddresses/mspVM3_PublicIP
+/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/ORACLEVM-CLUSTER-07232/providers/Microsoft.Compute/disks/mspVM3_OsDisk_1_d5e69682dbff491e97b7a04eea3896eb
+/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/ORACLEVM-CLUSTER-07232/providers/Microsoft.Compute/disks/mspVM3_lun_0_2_f5bfbf93870f4ed3b1d90a8b953818e7
+Are you sure to delete these resources (y/n)?n
+Check if application gateway has deployed...
+Removing mspVM3 from application gateway, please do not stop.
+{
+ "backendAddresses": [
+ {
+ "fqdn": "mspVM1",
+ "ipAddress": null
+ }
+ ],
+ "backendIpConfigurations": null,
+ "etag": "W/\"b6f76f57-be98-406d-ac9c-d11035fd3b5b\"",
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-cluster-07232/providers/Microsoft.Network/applicationGateways/myAppGateway/backendAddressPools/myGatewayBackendPool",
+ "name": "myGatewayBackendPool",
+ "provisioningState": "Succeeded",
+ "resourceGroup": "oraclevm-cluster-07232",
+ "type": "Microsoft.Network/applicationGateways/backendAddressPools"
+}
+
+Complete!
+ ```
+
+## Verify
+
+### Verify if the managed servers are deleted from WebLogic Server instance.
+
+* Go to the {{ site.data.var.wlsFullBrandName }} Administration Console.
+* Go to **Environment** -> **Servers**.
+ You should see no server names that have been deleted listed in **Name** column.
+* Go to **Environment -> Machines**.
+ You should see logical machines that host the servers that have been deleted are removed.
+
+### Verify if the Azure resources are deleted
+
+* Go to [Azure Portal](https://ms.portal.azure.com/).
+* Go to resource group that the {{ site.data.var.wlsFullBrandName }} is deployed.
+ You should see corresponding Vitual Machines, Disks, Network Interfaces, Public IPs have been removed.
+
+ For example, I want to delete managed server `msp1`, corresponding Virtual Machine name is `mspVM1`, Azure resource names are:
+ * Virtual Machine: `mspVM1`
+ * Data Disk: `mspVM1_lun_0_2_9d41e2c965744665adb6965625c20d9a`
+ * OS Disk: `mspVM1_OsDisk_1_05a8d81f5d01419a97ee17a45f974dca`
+ * Network Interface: `mspVM1_NIC`
+ * Public IP: `mspVM1_PublicIP`
+
+ All of these resource should be deleted after the script finishes, unless you don't expect to delete them without specifying "Y/y" to the prompt.
diff --git a/subtemplate-src/cluster-elkNestedTemplate.md b/subtemplate-src/cluster-elkNestedTemplate.md
new file mode 100644
index 000000000..3ee880d3e
--- /dev/null
+++ b/subtemplate-src/cluster-elkNestedTemplate.md
@@ -0,0 +1,401 @@
+{% include variables.md %}
+
+# Land {{ site.data.var.wlsFullBrandName }} logs to Elasticsearch and Kibana
+
+This page documents how to configure an existing deployment of {{ site.data.var.wlsFullBrandName }} to land logs to Elasticsearch and Kibana using Azure CLI.
+
+## Prerequisites
+
+### Environment for Setup
+
+* [Azure CLI](https://docs.microsoft.com/en-us/cli/azure), use `az --version` to test if `az` works.
+
+### WebLogic Server Instance
+
+The ELK ARM template will be applied to an existing {{ site.data.var.wlsFullBrandName }} instance. If you don't have one, please create a new instance from the Azure portal, by following the link to the offer [in the index](index.md).
+
+### Virtual machine size requirement
+Ensure the virtual machines that have been deployed have at least **2.5GB** of memory. The default virtual machine size for WLS does not have enough memory. Use at least `Standard_A2_v2`.
+
+### Elasticsearch instance
+
+Refer to [Create an an Elastic on Azure instance](https://aka.ms/arm-oraclelinux-wls-elk#create-an-an-elastic-on-azure-instance)
+
+## Prepare the Parameters JSON file
+
+You must construct a parameters JSON file containing the parameters to the ELK ARM template. See [Create Resource Manager parameter file](https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/parameter-files) for background information about parameter files.
+
+We must specify the information of the existing {{ site.data.var.wlsFullBrandName }} and Elasticsearch instance. This section shows how to obtain the values for the following required properties.
+
+| Parameter Name | Explanation |
+|----------------|-------------|
+| `_artifactsLocation`| See below for details. |
+| `adminVMName`| Virtual machine name of which hosts the {{ site.data.var.wlsFullBrandName }} admin server. |
+| `elasticsearchEndpoint` | The Elasticsearch endpoint. |
+| `elasticsearchPassword` | Password of the Elasticsearch account. Used to distibute message with REST API to Elasticsearch instance. |
+| `elasticsearchUserName` | User name of the Elasticsearch account. |
+| `location` | Must be the same region into which the server was initially deployed. |
+| `logsToIntegrate` | Specify the WebLogic logs to export to Elasticsearch, you must select at least one log. |
+| `managedServerPrefix` | Must be the same prefix with which the cluster was initially deployed. |
+| `numberOfManagedApplicationInstances` | Number of VMs that have been deployed to host managed application server. |
+| `numberOfManagedCacheInstances` | Number of VMs that have been deployed to host managed cache server, please set the value if your cluster is Coherence cluster. |
+| `wlsDomainName` | Must be the same value provided at initial deployment time. |
+| `wlsPassword` | Must be the same value provided at initial deployment time. |
+| `wlsUserName` | Must be the same value provided at initial deployment time. |
+
+### `_artifactsLocation`
+
+This value must be the following.
+
+```bash
+{{ armTemplateBasePath }}
+```
+
+### Number of Managed application instances
+
+You can get the existing Managed application instances number with the following command using Azure CLI.
+
+```shell
+$ resourceGroup=
+$ managedServerPrefix=
+$ numberOfManagedApplicationInstances=$(az resource list -g ${resourceGroup} --resource-type Microsoft.Compute/virtualMachines --query [*].name | grep "${managedServerPrefix}VM[0-9]" | sed -e 's/[^0-9]/ /g' -e 's/^ *//g' -e 's/ *$//g' | tr -s ' ' | sed 's/ /\n/g' | sort -nr | head -n1)
+$ echo ${numberOfManagedApplicationInstances}
+```
+
+### Number of Managed cache instances
+
+This parameter works for Coherence cluster. If your cluster is not Coherence cluter, keep it with default value `0`.
+
+You can get the existing Managed cache instances number with the following command using Azure CLI. It should be `0` if no value returned.
+
+```shell
+$ resourceGroup=
+$ managedServerPrefix=
+$ numberOfManagedCacheInstances=$(az resource list -g ${resourceGroup} --resource-type Microsoft.Compute/virtualMachines --query [*].name | grep "${managedServerPrefix}StorageVM[0-9]" | sed -e 's/[^0-9]/ /g' -e 's/^ *//g' -e 's/ *$//g' | tr -s ' ' | sed 's/ /\n/g' | sort -nr | head -n1)
+$ echo ${numberOfManagedCacheInstances}
+```
+
+#### Example Parameters JSON
+
+Here is a fully filled out parameters file. We will leave values of `adminUsername`, `authenticationType`, `dnsLabelPrefix`, and `usePreviewImage` as default value.
+
+{{ site.data.var.passwordInFileNote }}
+
+```json
+{
+ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "_artifactsLocation": {
+ "value": "{{ armTemplateBasePath }}"
+ },
+ "adminVMName": {
+ "value": "adminVM"
+ },
+ "elasticsearchEndpoint": {
+ "value": "https://example.eastus2.azure.elastic-cloud.com:9243"
+ },
+ "elasticsearchPassword": {
+ "value": "wlkpsw"
+ },
+ "elasticsearchUserName": {
+ "value": "elastic"
+ },
+ "location": {
+ "value": "eastus"
+ },
+ "managedServerPrefix": {
+ "value": "msp"
+ },
+ "numberOfManagedApplicationInstances": {
+ "value": 2
+ },
+ "numberOfManagedCacheInstances": {
+ "value": 0
+ },
+ "wlsDomainName": {
+ "value": "wlsd"
+ },
+ "wlsPassword": {
+ "value": "welcome1"
+ },
+ "wlsUserName": {
+ "value": "weblogic"
+ }
+ }
+}
+```
+
+## Invoke the ARM template
+
+Assume your parameters file is available in the current directory and is named `parameters.json`. This section shows the commands to configure your {{ site.data.var.wlsFullBrandName }} deployment to connect to Elasticsearch and Kinaba intance. Replace `yourResourceGroup` with the Azure resource group in which the {{ site.data.var.wlsFullBrandName }} is deployed.
+
+### First, validate your parameters file
+
+The `az group deployment validate` command is very useful to validate your parameters file is syntactically correct.
+
+```bash
+az deployment group validate --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateBasePath }}nestedtemplates/elkNestedTemplate.json
+```
+
+If the command returns with an exit status other than `0`, inspect the output and resolve the problem before proceeding. You can check the exit status by executing the commad `echo $?` immediately after the `az` command.
+
+### Next, execute the template
+
+After successfully validating the template invocation, change `validate` to `create` to invoke the template.
+
+```bash
+az deployment group create --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateBasePath }}nestedtemplates/elkNestedTemplate.json
+```
+
+As with the validate command, if the command returns with an exit status other than `0`, inspect the output and resolve the problem.
+
+This is an example output of successful deployment. Look for `"provisioningState": "Succeeded"` in your output.
+
+```json
+{
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Resources/deployments/elkNestedTemplate",
+ "location": null,
+ "name": "elkNestedTemplate",
+ "properties": {
+ "correlationId": "61a46b43-27d0-4478-baba-c288059892d5",
+ "debugSetting": null,
+ "dependencies": [
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Compute/virtualMachines/mspVM1/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-elk",
+ "resourceName": "mspVM1/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ },
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Compute/virtualMachines/mspVM2/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-elk",
+ "resourceName": "mspVM2/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ },
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Compute/virtualMachines/mspStorageVM1/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-elk",
+ "resourceName": "mspStorageVM1/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Resources/deployments/pid-e4165284-b017-5df9-9b91-3f11dd8a72e5",
+ "resourceGroup": "haiche-cluster-elk",
+ "resourceName": "pid-e4165284-b017-5df9-9b91-3f11dd8a72e5",
+ "resourceType": "Microsoft.Resources/deployments"
+ },
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-elk",
+ "resourceName": "adminVM/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Compute/virtualMachines/mspVM1/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-elk",
+ "resourceName": "mspVM1/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ },
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-elk",
+ "resourceName": "adminVM/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Compute/virtualMachines/mspVM2/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-elk",
+ "resourceName": "mspVM2/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ },
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-elk",
+ "resourceName": "adminVM/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Compute/virtualMachines/mspStorageVM1/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-elk",
+ "resourceName": "mspStorageVM1/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "duration": "PT8M54.4785762S",
+ "mode": "Incremental",
+ "onErrorDeployment": null,
+ "outputResources": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-elk"
+ },
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Compute/virtualMachines/mspStorageVM1/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-elk"
+ },
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Compute/virtualMachines/mspVM1/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-elk"
+ },
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Compute/virtualMachines/mspVM2/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-elk"
+ }
+ ],
+ "outputs": {
+ "artifactsLocationPassedIn": {
+ "type": "String",
+ "value": "{{ armTemplateBasePath }}"
+ },
+ "logIndex": {
+ "type": "String",
+ "value": "azure-weblogic-cluster-b4e465d5-6ffc-49cf-b1d9-b4dbf6455d0a"
+ }
+ },
+ "parameters": {
+ "_artifactsLocation": {
+ "type": "String",
+ "value": "{{ armTemplateBasePath }}"
+ },
+ "_artifactsLocationELKTemplate": {
+ "type": "String",
+ "value": "{{ armTemplateBasePath }}"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "SecureString"
+ },
+ "adminVMName": {
+ "type": "String",
+ "value": "adminVM"
+ },
+ "elasticsearchEndpoint": {
+ "type": "String",
+ "value": "https://example.eastus2.azure.elastic-cloud.com:9243"
+ },
+ "elasticsearchPassword": {
+ "type": "SecureString"
+ },
+ "elasticsearchUserName": {
+ "type": "String",
+ "value": "elastic"
+ },
+ "guidValue": {
+ "type": "String",
+ "value": "b4e465d5-6ffc-49cf-b1d9-b4dbf6455d0a"
+ },
+ "location": {
+ "type": "String",
+ "value": "eastus"
+ },
+ "logsToIntegrate": {
+ "type": "Array",
+ "value": [
+ "HTTPAccessLog",
+ "ServerLog",
+ "DomainLog",
+ "DataSourceLog",
+ "StandardErrorAndOutput",
+ "NodeManagerLog"
+ ]
+ },
+ "managedServerPrefix": {
+ "type": "String",
+ "value": "msp"
+ },
+ "numberOfManagedApplicationInstances": {
+ "type": "Int",
+ "value": 2
+ },
+ "numberOfManagedCacheInstances": {
+ "type": "Int",
+ "value": 1
+ },
+ "wlsDomainName": {
+ "type": "String",
+ "value": "wlsd"
+ },
+ "wlsPassword": {
+ "type": "SecureString"
+ },
+ "wlsUserName": {
+ "type": "String",
+ "value": "weblogic"
+ }
+ },
+ "parametersLink": null,
+ "providers": [
+ {
+ "id": null,
+ "namespace": "Microsoft.Resources",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ null
+ ],
+ "properties": null,
+ "resourceType": "deployments"
+ }
+ ]
+ },
+ {
+ "id": null,
+ "namespace": "Microsoft.Compute",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "virtualMachines/extensions"
+ }
+ ]
+ }
+ ],
+ "provisioningState": "Succeeded",
+ "template": null,
+ "templateHash": "10060935779116645392",
+ "templateLink": null,
+ "timestamp": "2020-11-11T07:29:42.336797+00:00"
+ },
+ "resourceGroup": "haiche-cluster-elk",
+ "type": "Microsoft.Resources/deployments"
+}
+```
+
+## Verify ELK connection
+
+Follow the steps to check if WebLogic Server logs are exported to Elasticsearch.
+
+* Go to Azure portal
+* Copy log index from your resource group -> deployments -> elkNestedTemplate -> output -> logIndex .
+* Go to Elasticsearch cloud and launch Kibana.
+* Create index
+ * Go to Kibana -> Management -> Kibana -> Index Patterns
+ * Click `Create index Patterns`
+ * Input the log index you copy from output in Index pattern
+ * There should be an index you can select, otherwise, the ELK deployment failed
+ * Next step
+ * Select `@timestamp` in Time Filter and hit `Create index pattern`
+* View logs
+ * Go to Kibana -> Discover
+ * Select the index you just created
+ * You will find the WebLogic Server logs listed
diff --git a/subtemplate-src/cluster-nsgRulesTemplate.md b/subtemplate-src/cluster-nsgRulesTemplate.md
new file mode 100644
index 000000000..510330b3b
--- /dev/null
+++ b/subtemplate-src/cluster-nsgRulesTemplate.md
@@ -0,0 +1,81 @@
+{% include variables.md %}
+
+# Apply Azure Network Security Rule ARM Template to {{ site.data.var.wlsFullBrandName }}
+
+This page documents how to append addtional security rules to an existing Azure Network Security Group deployed with {{ site.data.var.wlsFullBrandName }} using the Azure CLI.
+
+## Prerequisies
+
+### Environment for Setup
+
+* [Azure CLI](https://docs.microsoft.com/en-us/cli/azure), use `az --version` to test if `az` works.
+
+### Azure Network Security Group
+
+The Azure Network Security Rule ARM template will be applied to an existing Azure Network Security Group (NSG) instance. If you don't have one, please create a new instance from the Azure portal, by following the link to the offer [in the index](index.md).
+
+### Prepare the Parameters JSON file
+
+You must construct a parameter JSON file containing the parameters to the NSG template. See [Create Resource Manager parameter file](https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/parameter-files) for background information about parameter files. The options to this template declare the desired configuration of the NSG.
+
+| Parameter Name | Description |
+| `denyPublicTrafficForAdminServer` | Deny public tranffic for the admin server on port 7001, 7002. |
+| `denyPublicTrafficForManagedServer` | Deny public tranffic for the managed servers on port 8001. |
+| `enableAppGateway` | We deal with the configuration for managed servers when the Application Gateway is enabled. |
+| `networkSecurityGroupName` | The name of the NSG. |
+
+#### Example Parameters JSON file
+
+Here is a fully filled out parameters file, assuming the {{ site.data.var.wlsFullBrandName }} was deployed accepting the default values.
+
+```json
+{
+ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "denyPublicTrafficForManagedServer": {
+ "value": true
+ },
+ "denyPublicTrafficForAdminServer": {
+ "value": false
+ },
+ "enableAppGateway": {
+ "value": true
+ },
+ "networkSecurityGroupName": {
+ "value": "wls-nsg"
+ }
+ }
+}
+```
+
+## Invoke the ARM template
+
+This section shows how to kick off the deployment step-by-step. After the deployment, your existing NSG will append two additional Inbound Rules for admin and managed servers. Here we assume you have the parameter file in the current directory, the file is named `parameters.json`, and your NSG is named `wls-nsg`. Don't forget to replace `yourResourceGroup` with the Azure resource group in which the NSG is created.
+
+### First, validate your parameters file
+
+The `az group deployment validate` command is very useful to validate your parameters file is syntactically correct.
+
+```bash
+az group deployment validate --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateBasePath }}nestedtemplates/nsgNestedTemplate.json
+```
+
+If the command returns with an exit status other than `0`, inspect the output and resolve the problem before proceeding. You can check the exit status by executing the commad `echo $?` immediately after the `az` command.
+
+### Next, execute the template with it
+
+After successfully validating the template invocation, change `validate` to `create` to invoke the template.
+
+```bash
+az group deployment create --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateBasePath }}nestedtemplates/nsgNestedTemplate.json
+```
+
+## Verify the rules have been appended to the Azure Network Security Group successfully
+
+When the deployment is completed, you can verify the appended rules via Azure Portal
+* Visit the Azure Network Security Group under your resource group used above.
+* Go to `Settings -> Inbound security rules`.
+* Verify there is a rule named `WebLogicAdminPortsAllowed` with **Priority = '210'; Port = '7001, 7002'; Protocol = 'TCP'; Source = '10.0.0.0/24'; Aciton = 'Allow'**.
+* Verify there is a rule named `WebLogicManagedPortsDenied` with **Priority = '221'; Port = '8001'; Protocol = '*'; Aciton = 'Deny'**.
+
diff --git a/subtemplate-src/coherenceTemplate.md b/subtemplate-src/coherenceTemplate.md
new file mode 100644
index 000000000..546572006
--- /dev/null
+++ b/subtemplate-src/coherenceTemplate.md
@@ -0,0 +1,528 @@
+{% include variables.md %}
+
+# Configure Coherence cluster to {{ site.data.var.wlsFullBrandName }}
+
+This page documents how to configure an existing deployment of {{ site.data.var.wlsFullBrandName }} with a Coherence cluster using Azure CLI.
+
+## Prerequisites
+
+### Environment for Setup
+
+* [Azure CLI](https://docs.microsoft.com/en-us/cli/azure), use `az --version` to test if `az` works.
+
+### WebLogic Server Instance
+
+The Coherence ARM template will be applied to an existing {{ site.data.var.wlsFullBrandName }} instance. If you don't have one, please create a new instance from the Azure portal, by following the link to the offer [in the index](index.md).
+
+**Note:** if you have enabled Coherence in the initial offer deployment from Azure portal, the Coherence cluster has been set up, you don't need to run Coherence tempalte.
+
+### Elasticsearch instance
+
+Optional.
+
+Refer to [Create an an Elastic on Azure instance](https://aka.ms/arm-oraclelinux-wls-elk#create-an-an-elastic-on-azure-instance)
+
+## Prepare the Parameters JSON file
+
+You must construct a parameters JSON file containing the parameters to the Coherence ARM template. See [Create Resource Manager parameter file](https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/parameter-files) for background information about parameter files.
+
+The deployment of coherenceTemplate.json will:
+ * Provision Azure resources, including virtual machine, network interface, disk, public IP to host new Coherence cache servers.
+ * Configure WebLogic Coherence cluster, including:
+ * Create Coherence cluster `myCoherence`
+ * Create data tier `storage1` cluster.
+ * Associate `cluster1` and `storage1` to `myCoherence` cluster.
+ * Create cache servers and assign them to `storage1` cluster.
+
+We must specify the information of the existing {{ site.data.var.wlsFullBrandName }}. This section shows how to obtain the values for the following required properties.
+
+| Parameter Name | Explanation |
+|----------------|-------------|
+| `_artifactsLocation`| See below for details. |
+| `adminPasswordOrKey` | SSH Key or password for the Virtual Machine. SSH key is recommended. |
+| `adminVMName`| Virtual machine name of which hosts the {{ site.data.var.wlsFullBrandName }} admin server. |
+| `elasticsearchEndpoint` | The Elasticsearch endpoint. |
+| `elasticsearchPassword` | Password for the Elasticsearch account. |
+| `elasticsearchUserName` | User name for the Elasticsearch account. |
+| `enableCoherenceWebLocalStorage` | Specifies whether Local Storage is enabled for the Coherence*Web cluster tier. |
+| `enableELK` | If true, use the supplied parameters to distribute WebLogic Server logs to the Elasticsearch instance. |
+| `location` | Must be the same region into which the server was initially deployed. |
+| `logIndex` | Elasticsearch index you expect to export the logs to. Must be the same value with output from initial ELK deployment. |
+| `logsToIntegrate` | Specify the WebLogic logs to export to Elasticsearch, you must select at least one log. |
+| `managedServerPrefix` | Must be the same prefix with which the cluster was initially deployed. |
+| `numberOfCoherenceCacheInstances` | Number of Coherence cache servers, used to create Virtual Machines and Managed Server. |
+| `skuUrnVersion` | Must be the same urn with which the cluster was initially deployed. |
+| `storageAccountName` | The name of an existing storage account. |
+| `vmSizeSelectForCoherence` | Select appropriate VM Size for Coherence cache servers. |
+| `wlsDomainName` | Must be the same value provided at initial deployment time. |
+| `wlsPassword` | Must be the same value provided at initial deployment time. |
+| `wlsUserName` | Must be the same value provided at initial deployment time. |
+
+### `_artifactsLocation`
+
+This value must be the following.
+
+```bash
+{{ armTemplateBasePath }}
+```
+
+### Log index
+
+If you configured ELK in your cluster to export WebLogic Server logs to ELK, please input the value of Kibana log index, this template will set up ELK connection and export logs to specified index.
+
+You can get the value from Azure portal with the following steps:
+
+* Go to Azure portal.
+* Open you resource group and click **Deployments**.
+* Open the ELK deployment, and click **Output**.
+* Copy the value of `logIndex`.
+
+Alternatively, use Azure CLI command to list log index inside the resource group deployments:
+
+```shell
+$ az deployment group list -g 'yourResourceGroup' --query [*].properties.outputs.logIndex.value
+[
+ "azure-weblogic-cluster-f984df74-ab4d-4c17-a532-7f248659fb28"
+]
+```
+
+### Storage account
+
+Each Storage Account handles up to 20,000 IOPS, and 500TB of data. If you use a storage account for Standard Virtual Machines, you can store until 40 virtual disks.
+
+We have two disks for one Virtual Machine, it's suggested no more than 20 Virtual Machines share the same storage account. Number of virtual machines that hosting managed servers should be less than or equal to 20.
+
+You can get the name of storage account from Azure portal with steps:
+
+ * Go to Azure portal
+ * Go to the your resource group
+ * Find storage account resource and copy its name
+
+Alternatively, use Azure CLI command to list storage account inside a resource group:
+
+```shell
+$ az resource list -g 'yourResourceGroup' --resource-type Microsoft.Storage/storageAccounts --query [*].name
+[
+ "219846olvm"
+]
+```
+
+#### Example Parameters JSON
+
+Here is a fully filled out parameters file. This is an example to set up Coherence*Web. We will leave values of `adminUsername`, `authenticationType`, `dnsLabelPrefix`, and `usePreviewImage` as default value.
+
+{{ site.data.var.passwordInFileNote }}
+
+```json
+{
+ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "_artifactsLocation": {
+ "value": "{{ armTemplateBasePath }}"
+ },
+ "adminPasswordOrKey": {
+ "value": "jyfRat@nht2019"
+ },
+ "adminVMName": {
+ "value": "adminVM"
+ },
+ "elasticsearchEndpoint": {
+ "value": "https://example.eastus2.azure.elastic-cloud.com:9243"
+ },
+ "elasticsearchPassword": {
+ "value": "Secret123!"
+ },
+ "elasticsearchUserName": {
+ "value": "elastic"
+ },
+ "enableCoherenceWebLocalStorage": {
+ "value": true
+ },
+ "enableELK": {
+ "value": true
+ },
+ "managedServerPrefix": {
+ "value": "msp"
+ },
+ "location": {
+ "value": "eastus"
+ },
+ "logIndex": {
+ "value": "azure-weblogic-cluster-11122020"
+ },
+ "logsToIntegrate": {
+ "value": ["HTTPAccessLog", "ServerLog", "DomainLog", "DataSourceLog", "StandardErrorAndOutput","NodeManagerLog"]
+ },
+ "numberOfCoherenceCacheInstances": {
+ "value": 1
+ },
+ "skuUrnVersion": {
+ "value": "owls-122140-8u251-ol76;Oracle:weblogic-122140-jdk8u251-ol76:owls-122140-8u251-ol7;latest"
+ },
+ "storageAccountName": {
+ "value": "d40140olvm"
+ },
+ "vmSizeSelectForCoherence": {
+ "value": "Standard_A1"
+ },
+ "wlsDomainName": {
+ "value": "wlsd"
+ },
+ "wlsPassword": {
+ "value": "welcome1"
+ },
+ "wlsUserName": {
+ "value": "weblogic"
+ }
+ }
+}
+```
+
+## Invoke the ARM template
+
+Assume your parameters file is available in the current directory and is named `parameters.json`. This section shows the commands to configure your {{ site.data.var.wlsFullBrandName }} deployment with a Coherence cluster. Replace `yourResourceGroup` with the Azure resource group in which the {{ site.data.var.wlsFullBrandName }} is deployed.
+
+### First, validate your parameters file
+
+The `az deployment group validate` command is very useful to validate your parameters file is syntactically correct.
+
+```bash
+az deployment group validate --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateBasePath }}nestedtemplates/coherenceTemplate.json
+```
+
+If the command returns with an exit status other than `0`, inspect the output and resolve the problem before proceeding. You can check the exit status by executing the commad `echo $?` immediately after the `az` command.
+
+### Next, execute the template
+
+After successfully validating the template invocation, change `validate` to `create` to invoke the template.
+
+```bash
+az deployment group create --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateBasePath }}nestedtemplates/coherenceTemplate.json
+```
+
+As with the validate command, if the command returns with an exit status other than `0`, inspect the output and resolve the problem.
+
+This is an example output of successful deployment. Look for `"provisioningState": "Succeeded"` in your output.
+
+```json
+{
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Resources/deployments/coherenceTemplate",
+ "location": null,
+ "name": "coherenceTemplate",
+ "properties": {
+ "correlationId": "07555c54-2384-4ca3-b427-6cf7d8b53052",
+ "debugSetting": null,
+ "dependencies": [
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "adminVM/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ },
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Compute/virtualMachines/mspStorageVM1/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "mspStorageVM1/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Resources/deployments/pid-157eaa6e-12ae-11eb-adc1-0242ac120002",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "pid-157eaa6e-12ae-11eb-adc1-0242ac120002",
+ "resourceType": "Microsoft.Resources/deployments"
+ },
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Network/publicIPAddresses/mspStorageVM1_PublicIP",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "mspStorageVM1_PublicIP",
+ "resourceType": "Microsoft.Network/publicIPAddresses"
+ }
+ ],
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Network/networkInterfaces/mspStorageVM1_NIC",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "mspStorageVM1_NIC",
+ "resourceType": "Microsoft.Network/networkInterfaces"
+ },
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Network/networkInterfaces/mspStorageVM1_NIC",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "mspStorageVM1_NIC",
+ "resourceType": "Microsoft.Network/networkInterfaces"
+ },
+ {
+ "apiVersion": "2019-06-01",
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Storage/storageAccounts/33f2e3olvm",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "33f2e3olvm",
+ "resourceType": "Microsoft.Storage/storageAccounts"
+ }
+ ],
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Compute/virtualMachines/mspStorageVM1",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "mspStorageVM1",
+ "resourceType": "Microsoft.Compute/virtualMachines"
+ },
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Compute/virtualMachines/mspStorageVM1",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "mspStorageVM1",
+ "resourceType": "Microsoft.Compute/virtualMachines"
+ },
+ {
+ "actionName": "listKeys",
+ "apiVersion": "2019-06-01",
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Storage/storageAccounts/33f2e3olvm",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "33f2e3olvm",
+ "resourceType": "Microsoft.Storage/storageAccounts"
+ }
+ ],
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "adminVM/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ },
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Compute/virtualMachines/mspStorageVM1",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "mspStorageVM1",
+ "resourceType": "Microsoft.Compute/virtualMachines"
+ },
+ {
+ "actionName": "listKeys",
+ "apiVersion": "2019-06-01",
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Storage/storageAccounts/33f2e3olvm",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "33f2e3olvm",
+ "resourceType": "Microsoft.Storage/storageAccounts"
+ }
+ ],
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Compute/virtualMachines/mspStorageVM1/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-1106",
+ "resourceName": "mspStorageVM1/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "duration": "PT9M26.6278882S",
+ "mode": "Incremental",
+ "onErrorDeployment": null,
+ "outputResources": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-1106"
+ },
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Compute/virtualMachines/mspStorageVM1",
+ "resourceGroup": "haiche-cluster-1106"
+ },
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Compute/virtualMachines/mspStorageVM1/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-1106"
+ },
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Network/networkInterfaces/mspStorageVM1_NIC",
+ "resourceGroup": "haiche-cluster-1106"
+ },
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-1106/providers/Microsoft.Network/publicIPAddresses/mspStorageVM1_PublicIP",
+ "resourceGroup": "haiche-cluster-1106"
+ }
+ ],
+ "outputs": {
+ "artifactsLocationPassedIn": {
+ "type": "String",
+ "value": "{{ armTemplateBasePath }}"
+ }
+ },
+ "parameters": {
+ "_artifactsLocation": {
+ "type": "String",
+ "value": "{{ armTemplateBasePath }}"
+ },
+ "_artifactsLocationCoherenceTemplate": {
+ "type": "String",
+ "value": "{{ armTemplateBasePath }}"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "SecureString"
+ },
+ "adminPasswordOrKey": {
+ "type": "SecureString"
+ },
+ "adminUsername": {
+ "type": "String",
+ "value": "weblogic"
+ },
+ "adminVMName": {
+ "type": "String",
+ "value": "adminVM"
+ },
+ "authenticationType": {
+ "type": "String",
+ "value": "password"
+ },
+ "dnsLabelPrefix": {
+ "type": "String",
+ "value": "wls"
+ },
+ "enableCoherenceWebLocalStorage": {
+ "type": "Bool",
+ "value": true
+ },
+ "guidValue": {
+ "type": "String",
+ "value": "b4c17707-b932-43f0-a4cc-6d6990bb850f"
+ },
+ "location": {
+ "type": "String",
+ "value": "eastus"
+ },
+ "managedServerPrefix": {
+ "type": "String",
+ "value": "msp"
+ },
+ "numberOfCoherenceCacheInstances": {
+ "type": "Int",
+ "value": 1
+ },
+ "skuUrnVersion": {
+ "type": "String",
+ "value": "owls-122130-8u131-ol74;Oracle:weblogic-122130-jdk8u131-ol74:owls-122130-8u131-ol7;latest"
+ },
+ "storageAccountName": {
+ "type": "String",
+ "value": "33f2e3olvm"
+ },
+ "usePreviewImage": {
+ "type": "Bool",
+ "value": false
+ },
+ "vmSizeSelectForCoherence": {
+ "type": "String",
+ "value": "Standard_A1"
+ },
+ "wlsDomainName": {
+ "type": "String",
+ "value": "wlsd"
+ },
+ "wlsPassword": {
+ "type": "SecureString"
+ },
+ "wlsUserName": {
+ "type": "String",
+ "value": "weblogic"
+ }
+ },
+ "parametersLink": null,
+ "providers": [
+ {
+ "id": null,
+ "namespace": "Microsoft.Resources",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ null
+ ],
+ "properties": null,
+ "resourceType": "deployments"
+ }
+ ]
+ },
+ {
+ "id": null,
+ "namespace": "Microsoft.Network",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "publicIPAddresses"
+ },
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "networkInterfaces"
+ }
+ ]
+ },
+ {
+ "id": null,
+ "namespace": "Microsoft.Compute",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "virtualMachines"
+ },
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "virtualMachines/extensions"
+ }
+ ]
+ }
+ ],
+ "provisioningState": "Succeeded",
+ "template": null,
+ "templateHash": "7840329080326569798",
+ "templateLink": null,
+ "timestamp": "2020-11-06T08:48:57.229200+00:00"
+ },
+ "resourceGroup": "haiche-cluster-1106",
+ "type": "Microsoft.Resources/deployments"
+}
+```
+
+## Verify Coherence cluster
+
+Follow the steps to check if Coherence*Web is enabled.
+
+* Follow the example parameters to set up Coherence*Web.
+* Go to admin console portal.
+* Deploy [coherence-sample.war](../resources/coherence-sample.war) to `cluster1`.
+ Please select `cluster1` in the Targets page.
+* Start `coherence-sample`.
+* Open the sample with browser, click "add session" to add session infomation. Click "test session" to verify.
+
+If the Coherence cluster does not set up successfully, the application deployment will fail.
+
+If the cache server does not work correctly, session can not be saved, as we disabled local storage in application servers.
diff --git a/subtemplate-src/dbTemplate.md b/subtemplate-src/dbTemplate.md
new file mode 100644
index 000000000..b46907b35
--- /dev/null
+++ b/subtemplate-src/dbTemplate.md
@@ -0,0 +1,334 @@
+{% include variables.md %}
+
+# Apply Database ARM Template to {{ site.data.var.wlsFullBrandName }}
+
+This page documents how to configure an existing deployment of {{ site.data.var.wlsFullBrandName }} with an existing Azure database using Azure CLI.
+
+## Prerequisites
+
+### Environment for Setup
+
+* [Azure CLI](https://docs.microsoft.com/en-us/cli/azure), use `az --version` to test if `az` works.
+
+### WebLogic Server Instance
+
+The database ARM template will be applied to an existing {{ site.data.var.wlsFullBrandName }} instance. If you don't have one, please create a new instance from the Azure portal, by following the link to the offer [in the index](index.md).
+
+### Database Instance
+
+To apply configure a database with {{ site.data.var.wlsFullBrandName }},
+you must have an existing database instance to use. This template
+supports three popular Azure databases: [Oracle](https://ms.portal.azure.com/#blade/Microsoft_Azure_Marketplace/MarketplaceOffersBlade/selectedMenuItemId/home/searchQuery/oracle%20database), [Azure SQL Server](https://docs.microsoft.com/en-us/azure/azure-sql/) and [Azure Database for PostgreSQL](https://docs.microsoft.com/en-us/azure/azure-sql/database/single-database-create-quickstart?WT.mc_id=gallery&tabs=azure-portal). If you do not have an instance, please
+create one from the Azure portal.
+
+### Apply multiple databases
+
+You can deploy different databases using the database ARM template, by changing the ARM parameters file and invoking the template again with Azure CLI.
+
+To apply multiple databases, you have to remove the previous virtual machine extension. Last ARM parameters file is cached, it will block you from configuring the new database.
+
+Use the following command to remove virtual machine extension:
+
+```bash
+# remove existing vm extension
+az vm extension delete -g ${yourResourceGroup} --vm-name ${adminVMName} --name newuserscript
+```
+
+## Prepare the Parameters JSON file
+
+You must construct a parameters JSON file containing the parameters to the database ARM template. See [Create Resource Manager parameter file](https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/parameter-files) for background information about parameter files. We must specify the information of the existing {{ site.data.var.wlsFullBrandName }} and database instance. This section shows how to obtain the values for the following required properties.
+
+| Parameter Name | Explanation |
+|----------------|-------------|
+| `_artifactsLocation`| See below for details. |
+| `adminVMName`| At deployment time, if this value was changed from its default value, the value used at deployment time must be used. Otherwise, this parameter should be omitted. |
+| `databaseType`| Must be one of `postgresql`, `oracle` or `sqlserver` |
+| `dbPassword`| See below for details. |
+| `dbUser` | See below for details. |
+| `dsConnectionURL`| See below for details. |
+| `jdbcDataSourceName`| Must be the JNDI name for the JDBC DataSource. |
+| `location` | Must be the same region into which the server was initially deployed. |
+| `wlsPassword` | Must be the same value provided at deployment time. |
+| `wlsUserName` | Must be the same value provided at deployment time. |
+
+### `_artifactsLocation`
+
+This value must be the following.
+
+```bash
+{{ armTemplateBasePath }}
+```
+
+### Obtain the JDBC Connection String, Database User, and Database Password
+
+The parameter `dsConnectionURL` stands for JDBC connection string. The connection string is database specific.
+
+#### Oracle Database:
+
+The following is the format of the JDBC connection string for Oracle Database:
+
+```bash
+jdbc:oracle:thin:@HOSTNAME:1521/DATABASENAME
+```
+
+For example:
+
+```bash
+jdbc:oracle:thin:@benqoiz.southeastasia.cloudapp.azure.com:1521/pdb1
+```
+
+#### Azure Database for PostgreSQL:
+
+Deploy an Azure Database PostgreSQL as described in [Create an Azure Database for PostgreSQL server in the Azure portal](https://docs.microsoft.com/en-us/azure/postgresql/quickstart-create-server-database-portal).
+
+1. Access the [Azure portal](https://portal.azure.com), and go to the service instance.
+
+2. Click **Connection Strings** under **Settings**.
+
+3. Locate the **JDBC** section and click the copy icon on the right to copy the JDBC connection string to the clipboard. The JDBC connection string will be similar to the following:
+
+```bash
+jdbc:postgresql://20191015cbfgterfdy.postgres.database.azure.com:5432/{your_database}?user=jroybtvp@20191015cbfgterfdy&password={your_password}&sslmode=require
+```
+
+When passing this value to the ARM template, remove the database user and password values from the connection string, and let them be the parameters `dbUser` and `dbPassword`. In the above JDBC connection string sample, the value for `dsConnectionURL` argument after removing the database user and password, will be:
+
+```bash
+jdbc:postgresql://20191015cbfgterfdy.postgres.database.azure.com:5432/{your_database}?sslmode=require
+```
+
+Finally, replace `{your_database}` with the name of your database, typically `postgres`.
+
+#### Azure SQL Server
+
+Deploy Azure SQL Server as described in [Create a single database in Azure SQL Database using the Azure portal, PowerShell, and Azure CLI](https://docs.microsoft.com/en-us/azure/sql-database/sql-database-single-database-get-started?tabs=azure-portal).
+
+1. Access the [Azure portal](https://portal.azure.com) and go to the service instance.
+
+2. Click **Connection Strings** under **Settings**.
+
+3. Locate the **JDBC** section and click the copy icon on the right to copy the JDBC connection string to the clipboard. The JDBC connection string will be similar to the following:
+
+```bash
+jdbc:sqlserver://rwo102804.database.windows.net:1433;database=rwo102804;user=jroybtvp@rwo102804;password={your_password_here};encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;
+```
+
+When passing this value to the ARM template, remove the database user and password values, let them be the parameters `dbUser` and `dbPassword`. In the above JDBC connection string sample, the value for `dsConnectionURL` argument after removing the database user and password, will be:
+
+```bash
+jdbc:sqlserver://rwo102804.database.windows.net:1433;database={your_database};encrypt=true;tr
+```
+
+Finally, replace `{your_database}` with the name of your database.
+
+#### Example Parameters JSON
+
+Here is a fully filled out parameters file. Note that we did not include `adminVMName`.
+
+{{ site.data.var.passwordInFileNote }}
+
+```json
+{
+ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "_artifactsLocation":{
+ "value": "{{ armTemplateBasePath }}"
+ },
+ "location": {
+ "value": "eastus"
+ },
+ "databaseType": {
+ "value": "postgresql"
+ },
+ "dsConnectionURL": {
+ "value": "jdbc:postgresql://ejb060801p.postgres.database.azure.com:5432/postgres?sslmode=require"
+ },
+ "dbPassword": {
+ "value": "Secret123!"
+ },
+ "dbUser": {
+ "value": "postgres@ejb060801p"
+ },
+ "jdbcDataSourceName": {
+ "value": "jdbc/ejb060801p"
+ },
+ "wlsPassword": {
+ "value": "welcome1"
+ },
+ "wlsUserName": {
+ "value": "weblogic"
+ }
+ }
+}
+```
+
+## Invoke the ARM template
+
+Assume your parameters file is available in the current directory and is named `parameters.json`. This section shows the commands to configure your {{ site.data.var.wlsFullBrandName }} deployment with the specified database. Replace `yourResourceGroup` with the Azure resource group in which the {{ site.data.var.wlsFullBrandName }} is deployed.
+
+### First, validate your parameters file
+
+The `az group deployment validate` command is very useful to validate your parameters file is syntactically correct.
+
+```bash
+az group deployment validate --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateBasePath }}nestedtemplates/dbTemplate.json
+```
+
+If the command returns with an exit status other than `0`, inspect the output and resolve the problem before proceeding. You can check the exit status by executing the commad `echo $?` immediately after the `az` command.
+
+### Next, execute the template
+
+After successfully validating the template invocation, change `validate` to `create` to invoke the template.
+
+```bash
+az group deployment create --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateBasePath }}nestedtemplates/dbTemplate.json
+```
+
+As with the validate command, if the command returns with an exit status other than `0`, inspect the output and resolve the problem.
+
+This is an example output of successful deployment. Look for `"provisioningState": "Succeeded"` in your output.
+
+```json
+{
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-admin-0602/providers/Microsoft.Resources/deployments/db",
+ "location": null,
+ "name": "db",
+ "properties": {
+ "correlationId": "6fc805b9-1c47-4b32-b9b0-59745a21e559",
+ "debugSetting": null,
+ "dependencies": [
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-admin-0602/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "oraclevm-admin-0602",
+ "resourceName": "adminVM/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-admin-0602/providers/Microsoft.Resources/deployments/3b35b279-0e94-5264-85f5-0d9d662f8a38",
+ "resourceGroup": "oraclevm-admin-0602",
+ "resourceName": "3b35b279-0e94-5264-85f5-0d9d662f8a38",
+ "resourceType": "Microsoft.Resources/deployments"
+ }
+ ],
+ "duration": "PT17.4377546S",
+ "mode": "Incremental",
+ "onErrorDeployment": null,
+ "outputResources": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-admin-0602/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "oraclevm-admin-0602"
+ }
+ ],
+ "outputs": {
+ "artifactsLocationPassedIn": {
+ "type": "String",
+ "value": "{{ armTemplateBasePath }}"
+ }
+ },
+ "parameters": {
+ "_artifactsLocation": {
+ "type": "String",
+ "value": "{{ armTemplateBasePath }}"
+ },
+ "_artifactsLocationDbTemplate": {
+ "type": "String",
+ "value": "{{ armTemplateBasePath }}"
+ }
+ "adminVMName": {
+ "type": "String",
+ "value": "adminVM"
+ },
+ "databaseType": {
+ "type": "String",
+ "value": "postgresql"
+ },
+ "dbPassword": {
+ "type": "SecureString"
+ },
+ "dbUser": {
+ "type": "String",
+ "value": "weblogic@oraclevm"
+ },
+ "dsConnectionURL": {
+ "type": "String",
+ "value": "jdbc:postgresql://oraclevm.postgres.database.azure.com:5432/postgres"
+ },
+ "jdbcDataSourceName": {
+ "type": "String",
+ "value": "jdbc/WebLogicCafeDB"
+ },
+ "location": {
+ "type": "String",
+ "value": "eastus"
+ },
+ "wlsPassword": {
+ "type": "SecureString"
+ },
+ "wlsUserName": {
+ "type": "String",
+ "value": "weblogic"
+ }
+ },
+ "parametersLink": null,
+ "providers": [
+ {
+ "id": null,
+ "namespace": "Microsoft.Resources",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ null
+ ],
+ "properties": null,
+ "resourceType": "deployments"
+ }
+ ]
+ },
+ {
+ "id": null,
+ "namespace": "Microsoft.Compute",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "virtualMachines/extensions"
+ }
+ ]
+ }
+ ],
+ "provisioningState": "Succeeded",
+ "template": null,
+ "templateHash": "6381424766408193665",
+ "templateLink": null,
+ "timestamp": "2020-06-02T06:05:03.141828+00:00"
+ },
+ "resourceGroup": "oraclevm-admin-0602",
+ "type": "Microsoft.Resources/deployments"
+}
+```
+
+## Verify Database Connection
+
+Follow the steps to check if the database has successfully been connected.
+
+* Visit the {{ site.data.var.wlsFullBrandName }} Admin console.
+* In the left navigation pane, expand the **Services** tree node and the **DataSources** child node.
+* Select the row for the JDBC database name, for example `jdbc/WebLogicDB`.
+* Select the **Monitoring** tab and the **Testing** sub-tab.
+* Select `admin` and select **Test Data Source**
+* If the database is enabled, you will see a message similar to "Test of jdbc/WebLogicDB on server admin was successful."
diff --git a/subtemplate-src/dynamic-cluster-aadNestedTemplate.md b/subtemplate-src/dynamic-cluster-aadNestedTemplate.md
new file mode 100644
index 000000000..b4a6c5c27
--- /dev/null
+++ b/subtemplate-src/dynamic-cluster-aadNestedTemplate.md
@@ -0,0 +1,310 @@
+{% include variables.md %}
+
+# Apply Azure Active Directory ARM Template to {{ site.data.var.wlsFullBrandName }}
+
+This page documents how to configure an existing deployment of {{ site.data.var.wlsFullBrandName }} with an existing Azure Active Directory Domain Service (AAD DS) using Azure CLI.
+
+## Prerequisites
+
+### Environment for Setup
+
+* [Azure CLI](https://docs.microsoft.com/en-us/cli/azure), use `az --version` to test if `az` works.
+
+### WebLogic Server Instance
+
+The AAD ARM template will be applied to an existing {{ site.data.var.wlsFullBrandName }} instance. If you don't have one, please create a new instance from the Azure portal, by following the link to the offer [in the index](index.md).
+
+### Azure Active Directory LDAP Instance
+
+To apply AAD to {{ site.data.var.wlsFullBrandName }}, you must have an existing Azure Active Directory LDAP instance to use. If you don't have AAD LADP instance, please follow the steps in the tutorial [Configure secure LDAP for an Azure Active Directory Domain Services managed domain](https://docs.microsoft.com/en-us/azure/active-directory-domain-services/tutorial-configure-ldaps).
+
+## Prepare the Parameters JSON file
+
+You must construct a parameters JSON file containing the parameters to the AAD ARM template. See [Create Resource Manager parameter file](https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/parameter-files) for background information about parameter files. We must specify the information of the existing {{ site.data.var.wlsFullBrandName }} and AAD instance. This section shows how to obtain the values for the following required properties.
+
+| Parameter Name | Explanation |
+|----------------|-------------|
+| `_artifactsLocation`| See below for details. |
+| `aadsPortNumber` | (optional) The LDAP port number, defaults to 636. |
+| `aadsPublicIP` | The IP address of the LDAP server |
+| `aadsServerHost` | The hostname of the Active Directory Domain Services server. |
+| `adminVMName`| At deployment time, if this value was changed from its default value, the value used at deployment time must be used. Otherwise, this parameter should be omitted. |
+| `dynamicClusterSize` | Size of the dynamic cluster. |
+| `location` | Must be the same region into which the server was initially deployed. |
+| `managedServerPrefix` | Must be the same managed server prefix with that in initial deployed. |
+| `wlsDomainName` | The name of the {{ site.data.var.wlsFullBrandName }} domain. |
+| `wlsLDAPGroupBaseDN` | The base distinguished name (DN) of the tree in the LDAP directory that contains groups. |
+| `wlsLDAPPrincipalPassword` | The credential (usually a password) used to connect to the LDAP server. |
+| `wlsLDAPPrincipal` | The Distinguished Name (DN) of the LDAP user that {{ site.data.var.wlsFullBrandName }} should use to connect to the LDAP server. |
+| `wlsLDAPProviderName` | (optional) The value used for creating authentication provider name of WebLogic Server. |
+| `wlsLDAPSSLCertificate` | Client certificate that will be imported to trust store of SSL. |
+| `wlsLDAPSSLCertificate` | See below for details. |
+| `wlsLDAPUserBaseDN` | The base distinguished name (DN) of the tree in the LDAP directory that contains users. |
+| `wlsPassword` | Must be the same value provided at deployment time. |
+| `wlsUserName` | Must be the same value provided at deployment time. |
+
+### `_artifactsLocation`
+
+This value must be the following.
+
+```bash
+{{ armTemplateBasePath }}
+```
+
+### `wlsLDAPSSLCertificate`
+
+Use base64 to encode your existing SSL certificate.
+
+```bash
+base64 your-certificate.cer -w 0 >temp.txt
+```
+
+Use the content as this file as the value of the `wlsLDAPSSLCertificate` parameter.
+
+### `dynamicClusterSize`
+
+Size of the dynamic cluster, it should equal to numbers of Virtual Machines that have names starting with `msp`.
+
+#### Example Parameters JSON
+
+Here is a fully filled out parameters file. Note that we did not include values for parameters that have a default value. Pay attention to the value of `dynamicClusterSize`.
+
+{{ site.data.var.passwordInFileNote }}
+
+```json
+{
+ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "_artifactsLocation": {
+ "value": "{{ armTemplateBasePath }}"
+ },
+ "aadsPublicIP": {
+ "value": "1.2.3.4"
+ },
+ "aadsServerHost": {
+ "value": "ladps.fabrikam.com"
+ },
+ "location": {
+ "value": "eastus"
+ },
+ "wlsDomainName": {
+ "value": "wlsd"
+ },
+ "wlsLDAPGroupBaseDN": {
+ "value": "OU=AADDC Users,DC=fabrikam,DC=com"
+ },
+ "wlsLDAPPrincipal": {
+ "value": "CN=WLSTest,OU=AADDC Users,DC=fabrikam,DC=com"
+ },
+ "wlsLDAPPrincipalPassword": {
+ "value": "Secret123!"
+ },
+ "wlsLDAPSSLCertificate": {
+ "value": "MIIKQQIBAz....EkAgIIAA=="
+ },
+ "wlsLDAPUserBaseDN": {
+ "value": "OU=AADDC Users,DC=fabrikam,DC=com"
+ },
+ "wlsPassword": {
+ "value": "welcome1"
+ },
+ "wlsUserName": {
+ "value": "weblogic"
+ }
+ }
+}
+```
+
+## Invoke the ARM template
+
+Assume your parameters file is available in the current directory and is named `parameters.json`. This section shows the commands to configure your {{ site.data.var.wlsFullBrandName }} deployment with the specified AAD. Replace `yourResourceGroup` with the Azure resource group in which the {{ site.data.var.wlsFullBrandName }} is deployed.
+
+### First, validate your parameters file
+
+The `az group deployment validate` command is very useful to validate your parameters file is syntactically correct.
+
+```bash
+az group deployment validate --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateBasePath }}nestedtemplates/aadNestedTemplate.json
+```
+
+If the command returns with an exit status other than `0`, inspect the output and resolve the problem before proceeding. You can check the exit status by executing the commad `echo $?` immediately after the `az` command.
+
+### Next, execute the template
+
+After successfully validating the template invocation, change `validate` to `create` to invoke the template.
+
+```bash
+az group deployment create --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateBasePath }}nestedtemplates/aadNestedTemplate.json
+```
+
+As with the validate command, if the command returns with an exit status other than `0`, inspect the output and resolve the problem.
+
+This is an example output of successful deployment. Look for `"provisioningState": "Succeeded"` in your output.
+
+```json
+{
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-admin-06082/providers/Microsoft.Resources/deployments/cli",
+ "location": null,
+ "name": "cli",
+ "properties": {
+ "correlationId": "6d98e1c8-0778-4fa5-a30a-8f10bbbb6818",
+ "debugSetting": null,
+ "dependencies": [
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-admin-06082/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "oraclevm-admin-06082",
+ "resourceName": "adminVM/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-admin-06082/providers/Microsoft.Resources/deployments/pid-8295df19-fe6b-5745-ad24-51ef66522b24",
+ "resourceGroup": "oraclevm-admin-06082",
+ "resourceName": "pid-8295df19-fe6b-5745-ad24-51ef66522b24",
+ "resourceType": "Microsoft.Resources/deployments"
+ }
+ ],
+ "duration": "PT2M59.6052694S",
+ "mode": "Incremental",
+ "onErrorDeployment": null,
+ "outputResources": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-admin-06082/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "oraclevm-admin-06082"
+ }
+ ],
+ "outputs": {
+ "artifactsLocationPassedIn": {
+ "type": "String",
+ "value": "https://raw.githubusercontent.com/galiacheng/arm-oraclelinux-wls-admin/deploy/src/main/arm/"
+ }
+ },
+ "parameters": {
+ "_artifactsLocation": {
+ "type": "String",
+ "value": "https://raw.githubusercontent.com/galiacheng/arm-oraclelinux-wls-admin/deploy/src/main/arm/"
+ },
+ "_artifactsLocationAADTemplate": {
+ "type": "String",
+ "value": "https://raw.githubusercontent.com/galiacheng/arm-oraclelinux-wls-admin/deploy/src/main/arm/"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "SecureString"
+ },
+ "aadsPortNumber": {
+ "type": "String",
+ "value": "636"
+ },
+ "aadsPublicIP": {
+ "type": "String",
+ "value": "40.76.11.111"
+ },
+ "aadsServerHost": {
+ "type": "String",
+ "value": "ladps.wls-security.com"
+ },
+ "adminVMName": {
+ "type": "String",
+ "value": "adminVM"
+ },
+ "location": {
+ "type": "String",
+ "value": "eastus"
+ },
+ "wlsDomainName": {
+ "type": "String",
+ "value": "adminDomain"
+ },
+ "wlsLDAPGroupBaseDN": {
+ "type": "String",
+ "value": "OU=AADDC Users,DC=wls-security,DC=com"
+ },
+ "wlsLDAPPrincipal": {
+ "type": "String",
+ "value": "CN=WLSTest,OU=AADDC Users,DC=wls-security,DC=com"
+ },
+ "wlsLDAPPrincipalPassword": {
+ "type": "SecureString"
+ },
+ "wlsLDAPProviderName": {
+ "type": "String",
+ "value": "AzureActiveDirectoryProvider"
+ },
+ "wlsLDAPSSLCertificate": {
+ "type": "String",
+ "value": "LS0tLS1...LQ0K"
+ },
+ "wlsLDAPUserBaseDN": {
+ "type": "String",
+ "value": "OU=AADDC Users,DC=wls-security,DC=com"
+ },
+ "wlsPassword": {
+ "type": "SecureString"
+ },
+ "wlsUserName": {
+ "type": "String",
+ "value": "weblogic"
+ }
+ },
+ "parametersLink": null,
+ "providers": [
+ {
+ "id": null,
+ "namespace": "Microsoft.Resources",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ null
+ ],
+ "properties": null,
+ "resourceType": "deployments"
+ }
+ ]
+ },
+ {
+ "id": null,
+ "namespace": "Microsoft.Compute",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "virtualMachines/extensions"
+ }
+ ]
+ }
+ ],
+ "provisioningState": "Succeeded",
+ "template": null,
+ "templateHash": "2818584196763146470",
+ "templateLink": null,
+ "timestamp": "2020-06-09T07:07:03.444046+00:00"
+ },
+ "resourceGroup": "oraclevm-admin-06082",
+ "type": "Microsoft.Resources/deployments"
+}
+
+```
+
+## Verify AAD Integration
+
+Follow the steps to check if AAD is enabled.
+
+* Visit the {{ site.data.var.wlsFullBrandName }} Admin console.
+* In the left navigator, expand the tree to select **Security Realms** -> **myrealm** -> **Providers**.
+* If the integration was successful, you will find the AAD provider for example `AzureActiveDirectoryProvider`.
+* In the left navigator, expand the tree to select **Security Realms** -> **myrealm** -> **Users and Groups**.
+* If the integration was successful, you will find users from the AAD provider.
diff --git a/subtemplate-src/dynamic-cluster-addnode.md b/subtemplate-src/dynamic-cluster-addnode.md
new file mode 100644
index 000000000..7dea5b0e7
--- /dev/null
+++ b/subtemplate-src/dynamic-cluster-addnode.md
@@ -0,0 +1,686 @@
+{% include variables.md %}
+
+# Add nodes to {{ site.data.var.wlsFullBrandName }}
+
+This page documents how to configure an existing deployment of {{ site.data.var.wlsFullBrandName }} to add add new managed application nodes using Azure CLI.
+
+## Prerequisites
+
+### Environment for Setup
+
+* [Azure CLI](https://docs.microsoft.com/en-us/cli/azure), use `az --version` to test if `az` works.
+
+### WebLogic Server Instance
+
+The template will be applied to an existing {{ site.data.var.wlsFullBrandName }} instance. If you don't have one, please create a new instance from the Azure portal, by following the link to the offer [in the index](index.md).
+
+### Azure Active Directory LDAP Instance
+
+Refer to [Azure Active Directory(AAD) LDAP Instance](aadNestedTemplate.html#azure-active-directory-ldap-instance).
+
+### Administering Security for Oracle WebLogic Server & Configuring KeyStores
+
+Refer to [Configuring Keystores](https://docs.oracle.com/en/middleware/fusion-middleware/weblogic-server/12.2.1.4/secmg/identity_trust.html).
+
+### Generate Base64 string for a given ssl certificate/keystore file
+
+Use the following command to generate a Base64 string for a given ssl certificate/keystore file, to be used as input in the parameters JSON file
+
+
+
+
+## Prepare the Parameters JSON file
+
+You must construct a parameters JSON file containing the parameters to the add-node ARM template. See [Create Resource Manager parameter file](https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/parameter-files) for background information about parameter files. You must specify the information of the existing {{ site.data.var.wlsFullBrandName }} and nodes that to be added. This section shows how to obtain the values for the following required properties.
+
+
+
+
Parameter Name
+
Explanation
+
+
+
_artifactsLocation
+
See below for details.
+
+
+
aadsSettings
+
Optional. JSON object type. You can specify this parameters for Azure Active Directory integration. If enable is true, must specify other properties. See the page WebLogic to Azure with AAD via LDAP for further information.
+
+
+
+
enable
+
If enable is true, must specify all properties of the aadSettings.
+
+
+
+
publicIP
+
The public IP address of Azure Active Directory LDAP server.
+
+
+
+
serverHost
+
The server host of Azure Active Directory LDAP server.
+
+
+
+
certificateBase64String
+
The based64 string of LADP client certificate that will be imported to trust store of WebLogic Server to enable SSL connection of AD provider.
+
+
+
adminPasswordOrKey
+
Password of administration account for the new Virtual Machine that host new nodes.
+
+
+
adminURL
+
The URL of WebLogic Administration Server, usually made up with Virtual Machine name and port, for example: adminVM:7001.
+
+
+
elkSettings
+
Optional. JSON object type. You can specify this parameters for Elasticsearch and Kibana(ELK) connection. If enable is true, must specify other properties. See the page WebLogic with Elastic on Azure for further information.
+
+
+
+
enable
+
If enable is true, must specify all properties of the elkSettings.
+
+
+
+
elasticsearchEndpoint
+
Endpoint of the Elasticsearch instance.
+
+
+
+
elasticsearchPassword
+
Password for Elasticsearch account.
+
+
+
+
elasticsearchUserName
+
User name for Elasticsearch account.
+
+
+
+
logIndex
+
Must be the same value output at ELK deployment time.
+
+
+
+
logsToIntegrate
+
Array with string value. Specify the expeted logs to integrate, you must input at least one log.
+
+
+
numberOfExistingNodes
+
The number of existing managed application nodes, used to generate new virtual machine name,.
+
+
+
numberOfNewNodes
+
The number of nodes to add.
+
+
+
storageAccountName
+
The name of an existing storage account.
+
+
+
wlsDomainName
+
Must be the same value provided at deployment time.
+
+
+
wlsUserName
+
Must be the same value provided at deployment time.
+
+
+
wlsPassword
+
Must be the same value provided at deployment time.
If enable is true, must specify all properties of the customSSLSettings.
+ Set to false by default.
+
+
+
customIdentityKeyStoreBase64String
+
The based64 string of the custom identity keystore file that will be configured in the WebLogic Administration Server to enable SSL connection.
+
+
+
customIdentityKeyStorePassPhrase
+
The identity keystore pass phrase
+
+
+
customIdentityKeyStoreType
+
Identity Key Store Type. This can be either JKS or PKCS12
+
+
+
customTrustKeyStoreBase64String
+
The based64 string of the custom trust keystore file that will be configured in the WebLogic Administration Server to enable SSL connection.
+
+
+
customTrustKeyStorePassPhrase
+
The trust keystore pass phrase
+
+
+
customTrustKeyStoreType
+
Trust Key Store Type. This can be either JKS or PKCS12
+
+
+
privateKeyAlias
+
The private key alias
+
+
+
privateKeyPassPhrase
+
The private Key Pass phrase.
+
+
+
+### `_artifactsLocation`
+
+This value must be the following.
+
+```bash
+{{ armTemplateAddNodeBasePath }}
+```
+
+### Existing managed application servers
+To differentiate functionality of managed servers, we use **managed application server** to represent managed servers that host Java EE application, and use **managed cache server** to represent managed servers that used for cache.
+
+You can get the existing managed application nodes with the following command:
+
+```shell
+$ resourceGroup=
+$ managedServerPrefix=
+$ numberOfExistingNodes=$(az resource list -g ${resourceGroup} --resource-type Microsoft.Compute/virtualMachines --query [*].name | grep "${managedServerPrefix}VM[0-9]" | sed -e 's/[^0-9]/ /g' -e 's/^ *//g' -e 's/ *$//g' | tr -s ' ' | sed 's/ /\n/g' | sort -nr | head -n1)
+$ echo ${numberOfExistingNodes}
+```
+
+### Log index
+
+If you configured ELK in your cluster to export WebLogic Server logs to ELK, please input the value of Kibana log index, this template will set up ELK connection and export logs to specified index.
+
+You can get the value from Azure portal with the following steps:
+
+* Go to Azure portal.
+* Open you resource group and click **Deployments**.
+* Open the ELK deployment, and click **Output**.
+* Copy the value of `logIndex`.
+
+Alternatively, use Azure CLI command to list log index inside the resource group deployments:
+
+```shell
+$ az deployment group list -g 'yourResourceGroup' --query [*].properties.outputs.logIndex.value
+[
+ "azure-weblogic-cluster-f984df74-ab4d-4c17-a532-7f248659fb28"
+]
+```
+
+### Storage account
+
+Each Storage Account handles up to 20,000 IOPS, and 500TB of data. If you use a storage account for Standard Virtual Machines, you can store until 40 virtual disks.
+
+We have two disks for one Virtual Machine, it's suggested no more than 20 Virtual Machines share the same storage account. Number of virtual machines that hosting managed servers should be less than or equal to 20.
+
+You can get the name of storage account from Azure portal with steps:
+
+ * Go to Azure portal
+ * Go to the your resource group
+ * Find storage account resource and copy its name
+
+Alternatively, use Azure CLI command to list storage account inside a resource group:
+
+```shell
+$ az resource list -g 'yourResourceGroup' --resource-type Microsoft.Storage/storageAccounts --query [*].name
+[
+ "219846olvm"
+]
+```
+
+#### Example Parameters JSON
+
+Here is a fully filled out parameters file, with Azure Active Directory enabled. We will leave values of `adminUsername`, `authenticationType`, `dnsLabelPrefix`, `managedServerPrefix`, `skuUrnVersion`, `usePreviewImage` and `vmSizeSelect` as default value.
+
+{{ site.data.var.passwordInFileNote }}
+
+```json
+{
+ "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "_artifactsLocation": {
+ "value": "{{ armTemplateAddNodeBasePath }}"
+ },
+ "aadsSettings": {
+ "value": {
+ "enable": true,
+ "publicIP":"13.68.244.90",
+ "serverHost": "ladps.wls-security.com",
+ "certificateBase64String":"LS0tLS1C...tLS0tLQ0K"
+ }
+ },
+ "adminPasswordOrKey": {
+ "value": "Secret123!"
+ },
+ "adminURL":{
+ "value": "adminVM:7001"
+ },
+ "elkSettings": {
+ "value": {
+ "enable": true,
+ "elasticsearchEndpoint":"https://example.eastus2.azure.elastic-cloud.com:9243",
+ "elasticsearchPassword": "Secret123!",
+ "elasticsearchUserName":"elastic",
+ "logIndex": "azure-weblogic-dynamic-cluster-11122020",
+ "logsToIntegrate": ["HTTPAccessLog", "ServerLog", "DomainLog", "DataSourceLog", "StandardErrorAndOutput", "NodeManagerLog"]
+ }
+ },
+ "location": {
+ "value": "eastus"
+ },
+ "numberOfExistingNodes": {
+ "value": 4
+ },
+ "numberOfNewNodes": {
+ "value": 3
+ },
+ "storageAccountName": {
+ "value": "496dfdolvm"
+ },
+ "wlsDomainName": {
+ "value": "wlsd"
+ },
+ "wlsUserName": {
+ "value": "weblogic"
+ },
+ "wlsPassword": {
+ "value": "welcome1"
+ },
+ "customSSLSettings": {
+ "value": {
+ "enable": true,
+ "customIdentityKeyStoreBase64String": "/u3+7QAAAAIAAAABAAAAAQAKc2VydmV....QZL24ljJLq",
+ "customIdentityKeyStorePassPhrase": "mypassword",
+ "customIdentityKeyStoreType": "JKS",
+ "customTrustKeyStoreBase64String": "/u3+7QAAAAIAAAABAAAAAgAJdHJ1c3R....Td4bYVnONyS0PC7k=",
+ "customTrustKeyStorePassPhrase": "mypassword",
+ "customTrustKeyStoreType": "JKS",
+ "privateKeyAliasSecret": "servercert",
+ "privateKeyPassPhraseSecret": "mypassword"
+ }
+ }
+ }
+}
+```
+
+## Invoke the ARM template
+
+Assume your parameters file is available in the current directory and is named `parameters.json`. This section shows the commands to configure your {{ site.data.var.wlsFullBrandName }} deployment to add new nodes. Replace `yourResourceGroup` with the Azure resource group in which the {{ site.data.var.wlsFullBrandName }} is deployed.
+
+### First, validate your parameters file
+
+The `az group deployment validate` command is very useful to validate your parameters file is syntactically correct.
+
+```bash
+az group deployment validate --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateAddNodeBasePath }}arm/mainTemplate.json
+```
+
+If the command returns with an exit status other than `0`, inspect the output and resolve the problem before proceeding. You can check the exit status by executing the commad `echo $?` immediately after the `az` command.
+
+### Next, execute the template
+
+After successfully validating the template invocation, change `validate` to `create` to invoke the template.
+
+```bash
+az group deployment create --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateAddNodeBasePath }}arm/mainTemplate.json
+```
+
+As with the validate command, if the command returns with an exit status other than `0`, inspect the output and resolve the problem.
+
+This is an example output of successful deployment. Look for `"provisioningState": "Succeeded"` in your output.
+
+```bash
+{
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Resources/deployments/mainTemplate",
+ "location": null,
+ "name": "mainTemplate",
+ "properties": {
+ "correlationId": "54517529-a1c4-422f-a539-23b9a5129e80",
+ "debugSetting": null,
+ "dependencies": [
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Compute/virtualMachines/mspVM7/extensions/newuserscript",
+ "resourceGroup": "oraclevm-dcluster-0727",
+ "resourceName": "mspVM7/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Resources/deployments/pid-c7671c10-ae59-5ec5-bff3-c60db22d7ea4",
+ "resourceGroup": "oraclevm-dcluster-0727",
+ "resourceName": "pid-c7671c10-ae59-5ec5-bff3-c60db22d7ea4",
+ "resourceType": "Microsoft.Resources/deployments"
+ },
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Network/publicIPAddresses/mspVM7_PublicIP",
+ "resourceGroup": "oraclevm-dcluster-0727",
+ "resourceName": "mspVM7_PublicIP",
+ "resourceType": "Microsoft.Network/publicIPAddresses"
+ }
+ ],
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Network/networkInterfaces/mspVM7_NIC",
+ "resourceGroup": "oraclevm-dcluster-0727",
+ "resourceName": "mspVM7_NIC",
+ "resourceType": "Microsoft.Network/networkInterfaces"
+ },
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Network/networkInterfaces/mspVM7_NIC",
+ "resourceGroup": "oraclevm-dcluster-0727",
+ "resourceName": "mspVM7_NIC",
+ "resourceType": "Microsoft.Network/networkInterfaces"
+ },
+ {
+ "apiVersion": "2019-06-01",
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Storage/storageAccounts/09b943olvm",
+ "resourceGroup": "oraclevm-dcluster-0727",
+ "resourceName": "09b943olvm",
+ "resourceType": "Microsoft.Storage/storageAccounts"
+ }
+ ],
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Compute/virtualMachines/mspVM7",
+ "resourceGroup": "oraclevm-dcluster-0727",
+ "resourceName": "mspVM7",
+ "resourceType": "Microsoft.Compute/virtualMachines"
+ },
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Compute/virtualMachines/mspVM7",
+ "resourceGroup": "oraclevm-dcluster-0727",
+ "resourceName": "mspVM7",
+ "resourceType": "Microsoft.Compute/virtualMachines"
+ },
+ {
+ "actionName": "listKeys",
+ "apiVersion": "2019-04-01",
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Storage/storageAccounts/09b943olvm",
+ "resourceGroup": "oraclevm-dcluster-0727",
+ "resourceName": "09b943olvm",
+ "resourceType": "Microsoft.Storage/storageAccounts"
+ }
+ ],
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Compute/virtualMachines/mspVM7/extensions/newuserscript",
+ "resourceGroup": "oraclevm-dcluster-0727",
+ "resourceName": "mspVM7/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "duration": "PT9M6.8098765S",
+ "mode": "Incremental",
+ "onErrorDeployment": null,
+ "outputResources": [
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Compute/virtualMachines/mspVM7",
+ "resourceGroup": "oraclevm-dcluster-0727"
+ },
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Compute/virtualMachines/mspVM7/extensions/newuserscript",
+ "resourceGroup": "oraclevm-dcluster-0727"
+ },
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Network/networkInterfaces/mspVM7_NIC",
+ "resourceGroup": "oraclevm-dcluster-0727"
+ },
+ {
+ "id": "/subscriptions/05887623-95c5-4e50-a71c-6e1c738794e2/resourceGroups/oraclevm-dcluster-0727/providers/Microsoft.Network/publicIPAddresses/mspVM7_PublicIP",
+ "resourceGroup": "oraclevm-dcluster-0727"
+ }
+ ],
+ "outputs": {
+ "wlsDomainLocation": {
+ "type": "String",
+ "value": "/u01/domains/wlsd"
+ }
+ },
+ "parameters": {
+ "_artifactsLocation": {
+ "type": "String",
+ "value": "{{ armTemplateAddNodeBasePath }}"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "SecureString"
+ },
+ "aadsSettings": {
+ "type": "Object",
+ "value": {
+ "certificateBase64String": "LS0tLS1C...S0tLQ0K",
+ "enable": true,
+ "publicIP": "40.76.11.111",
+ "serverHost": "ladps.wls-security.com"
+ }
+ },
+ "adminPasswordOrKey": {
+ "type": "SecureString"
+ },
+ "adminURL": {
+ "type": "String",
+ "value": "adminVM:7001"
+ },
+ "adminUsername": {
+ "type": "String",
+ "value": "weblogic"
+ },
+ "authenticationType": {
+ "type": "String",
+ "value": "password"
+ },
+ "dnsLabelPrefix": {
+ "type": "String",
+ "value": "wls"
+ },
+ "guidValue": {
+ "type": "String",
+ "value": "67657ba3-6248-46e5-bedc-53e16ac82571"
+ },
+ "location": {
+ "type": "String",
+ "value": "eastus"
+ },
+ "managedServerPrefix": {
+ "type": "String",
+ "value": "msp"
+ },
+ "numberOfExistingNodes": {
+ "type": "Int",
+ "value": 7
+ },
+ "numberOfNewNodes": {
+ "type": "Int",
+ "value": 1
+ },
+ "skuUrnVersion": {
+ "type": "String",
+ "value": "owls-122130-8u131-ol74;Oracle:weblogic-122130-jdk8u131-ol74:owls-122130-8u131-ol7;1.1.1"
+ },
+ "storageAccountName": {
+ "type": "String",
+ "value": "09b943olvm"
+ },
+ "usePreviewImage": {
+ "type": "Bool",
+ "value": false
+ },
+ "vmSizeSelect": {
+ "type": "String",
+ "value": "Standard_A3"
+ },
+ "wlsDomainName": {
+ "type": "String",
+ "value": "wlsd"
+ },
+ "wlsPassword": {
+ "type": "SecureString"
+ },
+ "wlsUserName": {
+ "type": "String",
+ "value": "weblogic"
+ },
+ "customSSLSettings": {
+ "type": "Object",
+ "value": {
+ "enable": true,
+ "customIdentityKeyStoreBase64String": "/u3+7QAAAAIAAAABAAAAAQAKc2VydmV....QZL24ljJLq",
+ "customIdentityKeyStorePassPhrase": "mypassword",
+ "customIdentityKeyStoreType": "JKS",
+ "customTrustKeyStoreBase64String": "/u3+7QAAAAIAAAABAAAAAgAJdHJ1c3R....Td4bYVnONyS0PC7k=",
+ "customTrustKeyStorePassPhrase": "mypassword",
+ "customTrustKeyStoreType": "JKS",
+ "privateKeyAliasSecret": "servercert",
+ "privateKeyPassPhraseSecret": "mypassword"
+ }
+ }
+ },
+ "parametersLink": null,
+ "providers": [
+ {
+ "id": null,
+ "namespace": "Microsoft.Resources",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ null
+ ],
+ "properties": null,
+ "resourceType": "deployments"
+ }
+ ]
+ },
+ {
+ "id": null,
+ "namespace": "Microsoft.Network",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "publicIPAddresses"
+ },
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "networkInterfaces"
+ }
+ ]
+ },
+ {
+ "id": null,
+ "namespace": "Microsoft.Compute",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "virtualMachines"
+ },
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "virtualMachines/extensions"
+ }
+ ]
+ }
+ ],
+ "provisioningState": "Succeeded",
+ "template": null,
+ "templateHash": "15879952829017360289",
+ "templateLink": {
+ "contentVersion": "1.0.0.0",
+ "uri": "{{ armTemplateAddNodeBasePath }}arm/mainTemplate.json"
+ },
+ "timestamp": "2020-07-27T12:37:03.733682+00:00"
+ },
+ "resourceGroup": "oraclevm-dcluster-0727",
+ "type": "Microsoft.Resources/deployments"
+}
+```
+
+## Verify
+
+### Verify if new nodes are added to the WebLogic Server instance.
+
+* Go to the {{ site.data.var.wlsFullBrandName }} Administration Console.
+* Go to **Environment -> Machines**.
+ You should see logical machines with suffix from `numberOfExistingNodes` to `numberOfExistingNodes + numberOfNewNodes` are added.
+ Make note of the total number of machines.
+
+* Scale up to check if the machines work
+ * Go to **Environment** -> **Cluster** -> `cluster1` -> **Control** -> **Scaling**.
+
+ Input value to **Desired Number of Running Servers** with the total number of machines, saved in last step.
+ * Save and activate.
+ * Go to **Environment** -> **Servers**.
+
+ Expected result: the running managed server number is the same as machine total number. And there are servers running on the new managed nodes.
+
+### Verify if Azure resources are added
+
+* Go to [Azure Portal](https://ms.portal.azure.com/).
+* Go to resource group that the {{ site.data.var.wlsFullBrandName }} is deployed.
+
+ You should see corresponding Vitual Machines, Disks, Network Interfaces, Public IPs have been added.
+
+### Verify AAD Integration
+
+Verify AAD integration by delpoying a simple Java EE applciation with basic authentication.
+
+* Go to Administration Server Console and deploy [testing application](../resources/basicauth.war).
+ * Select **Deployments**.
+ * Select **Install**.
+ * Select file `basicauth.war`.
+ * Select **Next**. Choose "Install this deployment as an application".
+ * Select **Next**. Select "cluster-1" and "All servers in the cluster".
+ * Keep configuration as default and select **Finish**.
+ * Select **Activate Changes**
+ * In the left navigation pane, select **Deployments**.
+ * Select **Control**
+ * Select `basicauth`
+ * Select **Start**
+ * Select **Servicing all requests**
+
+* Access the sample application
+ * Go to Administration Server Console
+ * Go to **Environment -> Machines**. Click one of the new machines, make sure there are servers running on that machine. Click **Node Manager** and make note of the machine host in **Listen Address**, here named it as `machineName`. Click **Servers** and make note of **Listen Port**, here named it as `port`.
+ * Go to [Azure Portal](https://ms.portal.azure.com/), and get DNS name from Virtual Machine has the same name of `machineName`, named it `machineDNS`
+ * Go to `http://${machineDNS}:${port}/basicauth`, the browser will prompt up to ask for credentials, input one of AAD users from group **AAD DC Administrators**, note that use name should be **sAMAccountName**, for example `wlstest` for user `wlstest@javaeehotmailcom.onmicrosoft.com`.
+ * Expected result, you can access the sample application without error.
diff --git a/subtemplate-src/dynamic-cluster-customDNSTemplate.md b/subtemplate-src/dynamic-cluster-customDNSTemplate.md
new file mode 100644
index 000000000..5e6921581
--- /dev/null
+++ b/subtemplate-src/dynamic-cluster-customDNSTemplate.md
@@ -0,0 +1,177 @@
+{% include variables.md %}
+
+# Configure DNS alias to {{ site.data.var.wlsFullBrandName }}
+
+This page documents how to configure an existing deployment of {{ site.data.var.wlsFullBrandName }} with a custom DNS alias.
+
+## Prerequisites
+
+### Environment for Setup
+
+* [Azure CLI](https://docs.microsoft.com/en-us/cli/azure), use `az --version` to test if `az` works.
+
+### WebLogic Server Instance
+
+The DNS Configuraton ARM template will be applied to an existing {{ site.data.var.wlsFullBrandName }} instance. If you don't have one, please create a new instance from the Azure portal, by following the link to the offer [in the index](index.md).
+
+### Registered Domain Name
+
+You need to buy a domain name to create a custom DNS alias.
+
+### Azure DNS Zone
+
+If you create the DNS alias on an existing [Azure DNS Zone](https://docs.microsoft.com/en-us/azure/dns/dns-overview), make sure you have perfomed the [Azure DNS Delegation](https://docs.microsoft.com/en-us/azure/dns/dns-domain-delegation). Once you have completed the delegation, you can verify it with `nslookup`. For example, assuming your domain name is **contoso.com**, this output shows a correct delegation.
+
+```bash
+$ nslookup -type=SOA contoso.com
+Server: 172.29.80.1
+Address: 172.29.80.1#53
+
+Non-authoritative answer:
+contoso.com
+ origin = ns1-01.azure-dns.com
+ mail addr = azuredns-hostmaster.microsoft.com
+ serial = 1
+ refresh = 3600
+ retry = 300
+ expire = 2419200
+ minimum = 300
+Name: ns1-01.azure-dns.com
+Address: 40.90.4.1
+Name: ns1-01.azure-dns.com
+Address: 2603:1061::1
+```
+
+We strongly recommand you create an Azure DNS Zone for domain management and reuse it for other perpose. Follow the [guide](https://docs.microsoft.com/en-us/azure/dns/dns-getstarted-portal) to create an Azure DNS Zone.
+
+### Azure Managed Indentify
+
+If you are going to configure DNS alias based on an existing DNS Zone, you are required to input the ID of a user-assigned managed identity.
+
+Follow this [guide](https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/how-to-manage-ua-identity-portal) to create a user-assigned managed identity.
+
+To obtain ID of the indentify: go to Azure Portal; open the identity **Overview** page; click **JSON View** and copy the **Resource ID**.
+
+
+## Prepare the Parameters
+
+We provide an automation shell script for DNS configuration. You must specify the information of the existing Oracle WebLogic Server. This section shows how to obtain the values for the following required properties.
+
+| Parameter Name | Explanation |
+|----------------|-------------|
+| `--admin-vm-name`| Required. Name of vitual machine that hosts {{ site.data.var.wlsFullBrandName }} admin server. Must be the same value provided at initial deployment time.|
+| `--admin-console-label` | Required. Label for {{ site.data.var.wlsFullBrandName }} admin console. Used to generate subdomain of admin console. |
+| `--artifact-location`| Required. See below for details. |
+| `--resource-group` | Required. Name of resource group that has WebLogic cluster deployed. |
+| `--location` | Required. Must be the same region into which the server was initially deployed. |
+| `--zone-name` | Required. Azure DNS Zone name. |
+| `--ohs-vm-name` | Optional. Specify name of the VM that hosts the Oracle HTTP Server Load Balancer. |
+| `--loadbalancer-label` | Optional. Label for Load Balancer. Used to generate subdomain of application gateway. The parameter is only required if you want to create DNS alias for application gateway.|
+| `--identity-id` | Optional. ID of Azure user-assigned managed identity. The parameter is only required if you are creating DNS alias on an existing DNS Zone.|
+| `--zone-resource-group` | Optional. Name of resource group that has Azure DNS Zone deployed. The parameter is only required if you are creating DNS alias on an existing DNS Zone. |
+| `--help` | Help. |
+
+### Artifacts location
+
+This value must be the following.
+
+```bash
+{{ armTemplateBasePath }}
+```
+
+## Invoke the Automation Script
+
+We provide an automation script to configure a custom DNS alias. The script lets you do the following:
+
+ * If you have an Azure DNS Zone, it will create a DNS alias for the admin console and application gateway on the existing DNS Zone.
+ * If you don't have an Azure DNS Zone, it will create the DNS Zone in the same resource group as the WebLogic cluster, then create the DNS alias for the admin console and application gateway.
+
+### Configure DNS Alias on an Existing Azure DNS Zone
+
+To configure a DNS alias on an existing Azure DNS Zone, in addition to the required parameters, you must also specify an Azure user-assigned managed identity ID and the resource group name in which your DNS Zone is deployed.
+
+This is an example to create a DNS alias `admin.contoso.com` for the admin console and `applciations.contoso.com` for the application gateway on an existing Azure DNS Zone.
+
+```bash
+$ curl -fsSL {{ site.data.var.artifactsLocationBase }}{{ pageDir }}/{{ site.data.var.artifactsLocationTag }}/cli-scripts/custom-dns-alias-cli.sh \
+ | /bin/bash -s -- \
+ --resource-group `yourResourceGroup` \
+ --admin-vm-name adminVM \
+ --admin-console-label admin \
+ --artifact-location {{ armTemplateBasePath }} \
+ --location eastus \
+ --zone-name contoso.com \
+ --ohs-vm-name ohsVM \
+ --loadbalancer-label applications \
+ --identity-id `yourIndentityID` \
+ --zone-resource-group `yourDNSZoneResourceGroup`
+```
+
+An example output:
+
+```text
+Done!
+
+Custom DNS alias:
+ Resource group: haiche-dns-doc
+ WebLogic Server Administration Console URL: http://admin.contoso.com:7001/console
+ WebLogic Server Administration Console secured URL: https://admin.contoso.com:7002/console
+
+
+ Application Gateway URL: http://applications.contoso.com:7777
+ Application Gateway secured URL: https://applications.contoso.com:4444
+```
+
+
+### Configure DNS Alias on a New Azure DNS Zone
+
+To configure a DNS alias on a new Azure DNS Zone, you must specify the required parameters.
+
+This is an example of creating an Azure DNS Zone, then creating a DNS alias `admin.contoso.com` for the admin console and `applications.contoso.com` for application gateway.
+
+```bash
+$ curl -fsSL {{ site.data.var.artifactsLocationBase }}{{ pageDir }}/{{ site.data.var.artifactsLocationTag }}/cli-scripts/custom-dns-alias-cli.sh \
+ | /bin/bash -s -- \
+ --resource-group `yourResourceGroup` \
+ --admin-vm-name adminVM \
+ --admin-console-label admin \
+ --artifact-location {{ armTemplateBasePath }} \
+ --location eastus \
+ --zone-name contoso.com \
+ --ohs-vm-name ohsVM \
+ --loadbalancer-label applications
+```
+
+An example output:
+
+```text
+DONE!
+
+
+Action required:
+ Complete Azure DNS delegation to make the alias accessible.
+ Reference: https://aka.ms/dns-domain-delegation
+ Name servers:
+ [
+ "ns1-02.azure-dns.com.",
+ "ns2-02.azure-dns.net.",
+ "ns3-02.azure-dns.org.",
+ "ns4-02.azure-dns.info."
+ ]
+
+Custom DNS alias:
+ Resource group: haiche-dns-doc
+ WebLogic Server Administration Console URL: http://admin.contoso.com:7001/console
+ WebLogic Server Administration Console secured URL: https://admin.contoso.com:7002/console
+
+
+ Application Gateway URL: http://applications.contoso.com:7777
+ Application Gateway secured URL: https://applications.contoso.com:4444
+```
+
+**Note:** The DNS aliases are not accessible now, you must perform Azure DNS delegation after the deployment. Follow [Delegation of DNS zones with Azure DNS](https://aka.ms/dns-domain-delegation) to complete the Azure DNS delegation.
+
+
+## Verify the Custom Alias
+
+Access the URL from output to verify if the custom alias works.
diff --git a/subtemplate-src/dynamic-cluster-deletenode.md b/subtemplate-src/dynamic-cluster-deletenode.md
new file mode 100644
index 000000000..40aa025b5
--- /dev/null
+++ b/subtemplate-src/dynamic-cluster-deletenode.md
@@ -0,0 +1,484 @@
+{% include variables.md %}
+
+# Delete nodes from {{ site.data.var.wlsFullBrandName }}
+
+This page documents how to configure an existing deployment of {{ site.data.var.wlsFullBrandName }} to delete nodes using Azure CLI.
+
+## Prerequisites
+
+### Environment for Setup
+
+* [Azure CLI](https://docs.microsoft.com/en-us/cli/azure), use `az --version` to test if `az` works.
+
+### WebLogic Server Instance
+
+The template will be applied to an existing {{ site.data.var.wlsFullBrandName }} instance. If you don't have one, please create a new instance from the Azure portal, by following the link to the offer [in the index](index.md).
+
+## Prepare the Parameters JSON file
+
+You must construct a parameters JSON file containing the parameters that to the delete-node ARM template. See [Create Resource Manager parameter file](https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/parameter-files) for background information about parameter files. You must specify the information of the existing {{ site.data.var.wlsFullBrandName }} and nodes that to be deleted. This section shows how to obtain the values for the following required properties.
+
+| Parameter Name | Explanation |
+|----------------|-------------|
+| `_artifactsLocation`| See below for details. |
+| `adminVMName`| At deployment time, if this value was changed from its default value, the value used at deployment time must be used. Otherwise, this parameter should be omitted. |
+| `deletingCacheServerNames`| (Optional) Names of cache servers to be deleted, comma delimited. Please ignore this parameter if you are not deleting cache servers. |
+| `deletingManagedServerMachineNames`| The resource names of Azure Virtual Machine hosting managed nodes that you want to delete. |
+| `wlsPassword` | Must be the same value provided at deployment time. |
+| `wlsUserName` | Must be the same value provided at deployment time. |
+
+### `_artifactsLocation`
+
+This value must be the following.
+
+```bash
+{{ armTemplateDeleteNodeBasePath }}
+```
+
+### Server names
+
+This value must be an array of strings, with pattern `^${managedServerPrefix}Storage[0-9]+$`, for example: `["mspStorage1", "mspStorage2"]`.
+
+You can get the server names from WebLogic Server Administration Console, following the steps:
+
+* Go to WebLogic Server Administration Console, http://admin-host:7001/console.
+
+* Go to **Environment** -> **Servers**.
+
+ Server names are listed in the first column.
+
+ If you want to remove coresponding virtual machine, please go to [Machine names](#machine-names) to obtain machine names.
+
+### Machine names
+
+This value must be an array of strings, for example: `["mspVM1", "mspVM2", "mspStorageVM2"]`.
+
+You can get the machine names from WebLogic Server Administration Console, following the steps:
+
+* Go to WebLogic Server Administration Console, http://admin-host:7001/console.
+
+* Go to **Environment** -> **Machines**.
+
+ Open the machine you want to delete.
+
+ Click **Configuration** -> **Node Manager**, you will get compute name from **Listen Address**.
+
+ The Azure Virtual Machine name was set with the same value of compute name during {{ site.data.var.wlsFullBrandName }} deployment.
+
+#### Example Parameters JSON
+
+Here is a fully filled out parameters file. Note that we do not include `adminVMName`.
+
+{{ site.data.var.passwordInFileNote }}
+
+```json
+{
+ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "_artifactsLocation": {
+ "value": "{{ armTemplateDeleteNodeBasePath }}"
+ },
+ "deletingCacheServerNames": {
+ "value": [
+ "mspStorage2"
+ ]
+ },
+ "deletingManagedServerMachineNames": {
+ "value": [
+ "mspVM4",
+ "mspStorageVM2"
+ ]
+ },
+ "wlsPassword": {
+ "value": "welcome1"
+ },
+ "wlsUserName": {
+ "value": "weblogic"
+ }
+ }
+}
+```
+
+## Invoke the delete-node script
+
+To delete managed nodes completely, you have to delete managed nodes logically from the WebLogic Server instance, and physically release Azure resources that host the managed nodes. We realize the two purposes in different ways:
+ * Delete machines logically from WebLogic Server instance by deploying delete-node ARM template with Azure CLI. You have to specify the parameters file.
+ The cluster will restart after deleting the machines, and manages servers may be reallocated to another existing machine.
+ * Release corresponding Azure resources by running Azure CLI commands. The following resources will be removed:
+ * Virtual Machines that host managed nodes that will be deleted.
+ * Data disks attached to the Virtual Machines
+ * OS disks attached to the Virtual Machines
+ * Network Interfaces added to the Virtual Machines
+ * Public IPs attached to the Virtual Machines
+
+We have provided an automation script for above two purposes, you can delete managed nodes easily with the following instructions.
+
+### Invoke the script
+
+Assume your parameters file is available in the current directory and is named `parameters.json`. Replace `yourResourceGroup` with the Azure resource group in which the {{ site.data.var.wlsFullBrandName }} is deployed.
+
+The following command runs the script in silent mode with option `-s`, this mode will delete managed nodes logically and physically.
+
+If you want to keep Azure resources, refer to [advanced usage](#advanced-usage) for further information.
+
+```bash
+$ curl -fsSL {{ armTemplateDeleteNodeBasePath }}scripts/deletenode-cli.sh | /bin/bash -s -- -s -g `yourResourceGroup` -u {{ armTemplateDeleteNodeBasePath }}arm/mainTemplate.json -p parameters.json
+```
+
+The script will validate the template with your parameters file; deploy the template to delete managed servers from WebLogic Server cluster; run Azure CLI commands to delete corresponding Azure resources.
+
+This is an example output of successful deployment, the {{ site.data.var.wlsFullBrandName }} is deployed with Application Gateway. Look for `Completed!` in your output.
+
+```bash
+{
+ "error": null,
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/oraclevm-dcluster-07222/providers/Microsoft.Resources/deployments/mainTemplate",
+ "name": "mainTemplate",
+ "properties": {
+ "correlationId": "be24f5de-1fdf-4fc6-be97-ac53af3ccd3c",
+ "debugSetting": null,
+ "dependencies": [
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/oraclevm-dcluster-07222/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "oraclevm-dcluster-07222",
+ "resourceName": "adminVM/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/oraclevm-dcluster-07222/providers/Microsoft.Resources/deployments/pid-db9aa5e4-1e77-5f54-af38-9a7515cd27ab",
+ "resourceGroup": "oraclevm-dcluster-07222",
+ "resourceName": "pid-db9aa5e4-1e77-5f54-af38-9a7515cd27ab",
+ "resourceType": "Microsoft.Resources/deployments"
+ }
+ ],
+ "duration": "PT0S",
+ "mode": "Incremental",
+ "onErrorDeployment": null,
+ "outputs": null,
+ "parameters": {
+ "_artifactsLocation": {
+ "type": "String",
+ "value": "{{ armTemplateDeleteNodeBasePath }}"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "SecureString"
+ },
+ "adminVMName": {
+ "type": "String",
+ "value": "adminVM"
+ },
+ "deletingManagedServerMachineNames": {
+ "type": "Array",
+ "value": [
+ "mspVM1"
+ ]
+ },
+ "location": {
+ "type": "String",
+ "value": "eastus"
+ },
+ "wlsForceShutDown": {
+ "type": "String",
+ "value": "true"
+ },
+ "wlsPassword": {
+ "type": "SecureString"
+ },
+ "wlsUserName": {
+ "type": "String",
+ "value": "weblogic"
+ }
+ },
+ "parametersLink": null,
+ "providers": [
+ {
+ "id": null,
+ "namespace": "Microsoft.Resources",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ null
+ ],
+ "properties": null,
+ "resourceType": "deployments"
+ }
+ ]
+ },
+ {
+ "id": null,
+ "namespace": "Microsoft.Compute",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "virtualMachines/extensions"
+ }
+ ]
+ }
+ ],
+ "provisioningState": "Succeeded",
+ "template": null,
+ "templateHash": "17905048512558945100",
+ "templateLink": {
+ "contentVersion": "1.0.0.0",
+ "uri": "{{ armTemplateDeleteNodeBasePath }}arm/mainTemplate.json"
+ },
+ "timestamp": "2020-07-23T08:36:10.953240+00:00",
+ "validatedResources": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/oraclevm-dcluster-07222/providers/Microsoft.Resources/deployments/pid-a816a607-eb8a-5aa1-9475-c3fba6994679",
+ "resourceGroup": "oraclevm-dcluster-07222"
+ },
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/oraclevm-dcluster-07222/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "oraclevm-dcluster-07222"
+ },
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/oraclevm-dcluster-07222/providers/Microsoft.Resources/deployments/pid-db9aa5e4-1e77-5f54-af38-9a7515cd27ab",
+ "resourceGroup": "oraclevm-dcluster-07222"
+ }
+ ]
+ },
+ "resourceGroup": "oraclevm-dcluster-07222",
+ "type": "Microsoft.Resources/deployments"
+}
+Command ran in 46.180 seconds (init: 0.064, invoke: 46.116)
+Extension 'resource-graph' is already installed.
+List resource Ids to be deleted:
+/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/oraclevm-dcluster-07222/providers/Microsoft.Compute/virtualMachines/mspVM1
+/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/oraclevm-dcluster-07222/providers/Microsoft.Network/networkInterfaces/mspVM1NIC
+/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/oraclevm-dcluster-07222/providers/Microsoft.Network/publicIPAddresses/mspVM1PublicIP
+/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/ORACLEVM-DCLUSTER-07222/providers/Microsoft.Compute/disks/mspVM1_OsDisk_1_e490d8e72ef14081aea596eab709efef
+/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/ORACLEVM-DCLUSTER-07222/providers/Microsoft.Compute/disks/mspVM1_lun_0_2_bb9f86a391c34e2d8dbe3b1b408d4952
+Are you sure to delete these resources (y/n)?Deleting managed resources...Please do not stop.
+Deleting managed resources...Please do not stop.
+[
+ null,
+ null,
+ null,
+ null,
+ null
+]
+Command ran in 99.764 seconds (init: 0.068, invoke: 99.696)
+
+Complete!
+```
+
+### Advanced usage
+
+If you want to learn more about the script and run it manually, follow the advanced instructions to interact with the ternimal.
+
+ * Download the script
+
+ ```bash
+ $ curl -fsSL {{ armTemplateDeleteNodeBasePath }}scripts/deletenode-cli.sh
+ ```
+
+ You will get a shell script named `deletenode-cli.sh` in your current directory. Usage of the script:
+
+ ```bash
+ ./deletenode-cli.sh -h
+ usage: deletenode-cli.sh -g resource-group [-f template-file] [-u template-url] -p paramter-file [-h]
+ -g Azure Resource Group of the Vitural Machines that host deleting manages servers, must be specified.
+ -f Path of ARM template to delete nodes, must be specified -f option or -u option.
+ -u URL of ARM template, must be specified -f option or -u option.
+ -p Path of ARM parameter, must be specified.
+ -s Execute the script in silent mode. The script will input y automatically for the prompt.
+ -h Help
+ ```
+
+ You can not only run the script with a local template file by specifying `-f` option, but also with a templatle URL using `-u` option.
+
+ * Run the script
+
+ Run the script with your parameters file in your current directory. The following command runs with a template URL:
+
+ ```bash
+ ./deletenode-cli.sh -g yourResourceGroup -u {{ armTemplateDeleteNodeBasePath }}arm/mainTemplate.json -p parameters.json
+ ```
+
+ Before deleting any Azure resource, the script will prompt up message **Are you sure to delete these resources (y/n)?** to comfirm if you want to delete Azure resources. If you input `Y/y`, the Azure resources will be deleted. Otherwise, keep the resource and exit.
+
+ This is an example output of deployment that will not delete Azure resources from your resource group, the {{ site.data.var.wlsFullBrandName }} is deployed with Application Gateway. Look for `Completed!` in your output.
+
+ ```bash
+ {
+ "error": null,
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/oraclevm-dcluster-07222/providers/Microsoft.Resources/deployments/mainTemplate",
+ "name": "mainTemplate",
+ "properties": {
+ "correlationId": "be24f5de-1fdf-4fc6-be97-ac53af3ccd3c",
+ "debugSetting": null,
+ "dependencies": [
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/oraclevm-dcluster-07222/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "oraclevm-dcluster-07222",
+ "resourceName": "adminVM/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/oraclevm-dcluster-07222/providers/Microsoft.Resources/deployments/pid-db9aa5e4-1e77-5f54-af38-9a7515cd27ab",
+ "resourceGroup": "oraclevm-dcluster-07222",
+ "resourceName": "pid-db9aa5e4-1e77-5f54-af38-9a7515cd27ab",
+ "resourceType": "Microsoft.Resources/deployments"
+ }
+ ],
+ "duration": "PT0S",
+ "mode": "Incremental",
+ "onErrorDeployment": null,
+ "outputs": null,
+ "parameters": {
+ "_artifactsLocation": {
+ "type": "String",
+ "value": "{{ armTemplateDeleteNodeBasePath }}"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "SecureString"
+ },
+ "adminVMName": {
+ "type": "String",
+ "value": "adminVM"
+ },
+ "deletingManagedServerMachineNames": {
+ "type": "Array",
+ "value": [
+ "mspVM1"
+ ]
+ },
+ "location": {
+ "type": "String",
+ "value": "eastus"
+ },
+ "wlsForceShutDown": {
+ "type": "String",
+ "value": "true"
+ },
+ "wlsPassword": {
+ "type": "SecureString"
+ },
+ "wlsUserName": {
+ "type": "String",
+ "value": "weblogic"
+ }
+ },
+ "parametersLink": null,
+ "providers": [
+ {
+ "id": null,
+ "namespace": "Microsoft.Resources",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ null
+ ],
+ "properties": null,
+ "resourceType": "deployments"
+ }
+ ]
+ },
+ {
+ "id": null,
+ "namespace": "Microsoft.Compute",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "virtualMachines/extensions"
+ }
+ ]
+ }
+ ],
+ "provisioningState": "Succeeded",
+ "template": null,
+ "templateHash": "17905048512558945100",
+ "templateLink": {
+ "contentVersion": "1.0.0.0",
+ "uri": "{{ armTemplateDeleteNodeBasePath }}arm/mainTemplate.json"
+ },
+ "timestamp": "2020-07-23T08:36:10.953240+00:00",
+ "validatedResources": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/oraclevm-dcluster-07222/providers/Microsoft.Resources/deployments/pid-a816a607-eb8a-5aa1-9475-c3fba6994679",
+ "resourceGroup": "oraclevm-dcluster-07222"
+ },
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/oraclevm-dcluster-07222/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "oraclevm-dcluster-07222"
+ },
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/oraclevm-dcluster-07222/providers/Microsoft.Resources/deployments/pid-db9aa5e4-1e77-5f54-af38-9a7515cd27ab",
+ "resourceGroup": "oraclevm-dcluster-07222"
+ }
+ ]
+ },
+ "resourceGroup": "oraclevm-dcluster-07222",
+ "type": "Microsoft.Resources/deployments"
+}
+Command ran in 46.180 seconds (init: 0.064, invoke: 46.116)
+Extension 'resource-graph' is already installed.
+List resource Ids to be deleted:
+/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/oraclevm-dcluster-07222/providers/Microsoft.Compute/virtualMachines/mspVM1
+/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/oraclevm-dcluster-07222/providers/Microsoft.Network/networkInterfaces/mspVM1NIC
+/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/oraclevm-dcluster-07222/providers/Microsoft.Network/publicIPAddresses/mspVM1PublicIP
+/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/ORACLEVM-DCLUSTER-07222/providers/Microsoft.Compute/disks/mspVM1_OsDisk_1_e490d8e72ef14081aea596eab709efef
+/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/ORACLEVM-DCLUSTER-07222/providers/Microsoft.Compute/disks/mspVM1_lun_0_2_bb9f86a391c34e2d8dbe3b1b408d4952
+Are you sure to delete these resources (y/n)?n
+
+Complete!
+ ```
+
+## Verify
+
+### Verify if the managed servers are deleted from WebLogic Server instance.
+
+* Go to the {{ site.data.var.wlsFullBrandName }} Administration Console.
+* Go to **Environment** -> **Machines**.
+
+ You should see the logical machine names (e.g. `machine-mspVM1`) that have been deleted is not listed in **Name** column.
+
+### Verify if the Azure resources are deleted
+
+* Go to Azure Portal, https://ms.portal.azure.com/.
+* Go to resource group that the {{ site.data.var.wlsFullBrandName }} is deployed.
+
+ You should see corresponding Vitual Machines, Disks, Network Interfaces, Public IPs have been removed.
+
+ For example, I want to delete managed server `msp1`, corresponding Virtual Machine name is `mspVM1`, Azure resource names are:
+ * Virtual Machine: `mspVM1`
+ * Data Disk: `mspVM1_lun_0_2_9d41e2c965744665adb6965625c20d9a`
+ * OS Disk: `mspVM1_OsDisk_1_05a8d81f5d01419a97ee17a45f974dca`
+ * Network Interface: `mspVM1_NIC`
+ * Public IP: `mspVM1_PublicIP`
+
+ All of these resource should be deleted after the script finishes, unless you don't expect to delete them without specifying "Y/y" to the prompt.
+
+
diff --git a/subtemplate-src/dynamic-cluster-elkNestedTemplate.md b/subtemplate-src/dynamic-cluster-elkNestedTemplate.md
new file mode 100644
index 000000000..1eaa960f3
--- /dev/null
+++ b/subtemplate-src/dynamic-cluster-elkNestedTemplate.md
@@ -0,0 +1,408 @@
+{% include variables.md %}
+
+# Land {{ site.data.var.wlsFullBrandName }} logs to Elasticsearch and Kibana
+
+This page documents how to configure an existing deployment of {{ site.data.var.wlsFullBrandName }} to land logs to Elasticsearch and Kibana using Azure CLI.
+
+## Prerequisites
+
+### Environment for Setup
+
+* [Azure CLI](https://docs.microsoft.com/en-us/cli/azure), use `az --version` to test if `az` works.
+
+### WebLogic Server Instance
+
+The ELK ARM template will be applied to an existing {{ site.data.var.wlsFullBrandName }} instance. If you don't have one, please create a new instance from the Azure portal, by following the link to the offer [in the index](index.md).
+
+### Virtual machine size requirement
+Ensure the virtual machines that have been deployed have at least **2.5GB** of memory. The default virtual machine size for WLS does not have enough memory. Use at least `Standard_A2_v2`.
+
+### Elasticsearch instance
+
+Refer to [Create an an Elastic on Azure instance](https://aka.ms/arm-oraclelinux-wls-elk#create-an-an-elastic-on-azure-instance)
+
+## Prepare the Parameters JSON file
+
+You must construct a parameters JSON file containing the parameters to the ELK ARM template. See [Create Resource Manager parameter file](https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/parameter-files) for background information about parameter files.
+
+We must specify the information of the existing {{ site.data.var.wlsFullBrandName }} and Elasticsearch instance. This section shows how to obtain the values for the following required properties.
+
+| Parameter Name | Explanation |
+|----------------|-------------|
+| `_artifactsLocation`| See below for details. |
+| `adminVMName`| Virtual machine name of which hosts the {{ site.data.var.wlsFullBrandName }} admin server. |
+| `elasticsearchEndpoint` | The Elasticsearch endpoint. |
+| `elasticsearchPassword` | Password for the Elasticsearch account. |
+| `elasticsearchUserName` | User name for the Elasticsearch account. |
+| `location` | Must be the same region into which the server was initially deployed. |
+| `logsToIntegrate` | Specify the WebLogic logs to export to Elasticsearch, you must select at least one log. |
+| `managedServerPrefix` | Must be the same prefix with which the cluster was initially deployed. |
+| `maxDynamicClusterSize` | Must be the same value with which the cluster was initially deployed. |
+| `numberOfManagedApplicationInstances` | Number of VMs that have been deployed to host managed application server. |
+| `numberOfManagedCacheInstances` | Number of VMs that have been deployed to host managed cache server, please set the value if your cluster is Coherence cluster. |
+| `wlsDomainName` | Must be the same value provided at initial deployment time. |
+| `wlsPassword` | Must be the same value provided at initial deployment time. |
+| `wlsUserName` | Must be the same value provided at initial deployment time. |
+
+### `_artifactsLocation`
+
+This value must be the following.
+
+```bash
+{{ armTemplateBasePath }}
+```
+
+### Number of Managed application instances
+
+You can get the existing Managed application instances number with the following command using Azure CLI.
+
+```shell
+$ resourceGroup=
+$ managedServerPrefix=
+$ numberOfManagedApplicationInstances=$(az resource list -g ${resourceGroup} --resource-type Microsoft.Compute/virtualMachines --query [*].name | grep "${managedServerPrefix}VM[0-9]" | sed -e 's/[^0-9]/ /g' -e 's/^ *//g' -e 's/ *$//g' | tr -s ' ' | sed 's/ /\n/g' | sort -nr | head -n1)
+$ echo ${numberOfManagedApplicationInstances}
+```
+
+### Number of Managed cache instances
+
+This parameter works for Coherence cluster. If your cluster is not Coherence cluter, keep it with default value `0`.
+
+You can get the existing Managed cache instances number with the following command using Azure CLI. It should be `0` if no value returned.
+
+```shell
+$ resourceGroup=
+$ managedServerPrefix=
+$ numberOfManagedCacheInstances=$(az resource list -g ${resourceGroup} --resource-type Microsoft.Compute/virtualMachines --query [*].name | grep "${managedServerPrefix}StorageVM[0-9]" | sed -e 's/[^0-9]/ /g' -e 's/^ *//g' -e 's/ *$//g' | tr -s ' ' | sed 's/ /\n/g' | sort -nr | head -n1)
+$ echo ${numberOfManagedCacheInstances}
+```
+
+#### Example Parameters JSON
+
+Here is a fully filled out parameters file. We will leave values of `adminUsername`, `authenticationType`, `dnsLabelPrefix`, and `usePreviewImage` as default value.
+
+{{ site.data.var.passwordInFileNote }}
+
+```json
+{
+ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "_artifactsLocation": {
+ "value": "{{ armTemplateBasePath }}"
+ },
+ "adminVMName": {
+ "value": "adminVM"
+ },
+ "elasticsearchEndpoint": {
+ "value": "https://example.eastus2.azure.elastic-cloud.com:9243"
+ },
+ "elasticsearchPassword": {
+ "value": "wlkpsw"
+ },
+ "elasticsearchUserName": {
+ "value": "elastic"
+ },
+ "location": {
+ "value": "eastus"
+ },
+ "managedServerPrefix": {
+ "value": "msp"
+ },
+ "maxDynamicClusterSize": {
+ "value": 8
+ },
+ "numberOfManagedApplicationInstances": {
+ "value": 3
+ },
+ "numberOfManagedCacheInstances": {
+ "value": 0
+ },
+ "wlsDomainName": {
+ "value": "wlsd"
+ },
+ "wlsPassword": {
+ "value": "welcome1"
+ },
+ "wlsUserName": {
+ "value": "weblogic"
+ }
+ }
+}
+```
+
+## Invoke the ARM template
+
+Assume your parameters file is available in the current directory and is named `parameters.json`. This section shows the commands to configure your {{ site.data.var.wlsFullBrandName }} deployment to connect to Elasticsearch and Kinaba intance. Replace `yourResourceGroup` with the Azure resource group in which the {{ site.data.var.wlsFullBrandName }} is deployed.
+
+### First, validate your parameters file
+
+The `az group deployment validate` command is very useful to validate your parameters file is syntactically correct.
+
+```bash
+az deployment group validate --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateBasePath }}nestedtemplates/elkNestedTemplate.json
+```
+
+If the command returns with an exit status other than `0`, inspect the output and resolve the problem before proceeding. You can check the exit status by executing the commad `echo $?` immediately after the `az` command.
+
+### Next, execute the template
+
+After successfully validating the template invocation, change `validate` to `create` to invoke the template.
+
+```bash
+az deployment group create --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateBasePath }}nestedtemplates/elkNestedTemplate.json
+```
+
+As with the validate command, if the command returns with an exit status other than `0`, inspect the output and resolve the problem.
+
+This is an example output of successful deployment. Look for `"provisioningState": "Succeeded"` in your output.
+
+```json
+{
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Resources/deployments/elkNestedTemplate",
+ "location": null,
+ "name": "elkNestedTemplate",
+ "properties": {
+ "correlationId": "61a46b43-27d0-4478-baba-c288059892d5",
+ "debugSetting": null,
+ "dependencies": [
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Compute/virtualMachines/mspVM1/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-elk",
+ "resourceName": "mspVM1/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ },
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Compute/virtualMachines/mspVM2/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-elk",
+ "resourceName": "mspVM2/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ },
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Compute/virtualMachines/mspStorageVM1/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-elk",
+ "resourceName": "mspStorageVM1/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Resources/deployments/pid-e4165284-b017-5df9-9b91-3f11dd8a72e5",
+ "resourceGroup": "haiche-cluster-elk",
+ "resourceName": "pid-e4165284-b017-5df9-9b91-3f11dd8a72e5",
+ "resourceType": "Microsoft.Resources/deployments"
+ },
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-elk",
+ "resourceName": "adminVM/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Compute/virtualMachines/mspVM1/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-elk",
+ "resourceName": "mspVM1/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ },
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-elk",
+ "resourceName": "adminVM/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Compute/virtualMachines/mspVM2/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-elk",
+ "resourceName": "mspVM2/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ },
+ {
+ "dependsOn": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-elk",
+ "resourceName": "adminVM/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Compute/virtualMachines/mspStorageVM1/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-elk",
+ "resourceName": "mspStorageVM1/newuserscript",
+ "resourceType": "Microsoft.Compute/virtualMachines/extensions"
+ }
+ ],
+ "duration": "PT8M54.4785762S",
+ "mode": "Incremental",
+ "onErrorDeployment": null,
+ "outputResources": [
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Compute/virtualMachines/adminVM/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-elk"
+ },
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Compute/virtualMachines/mspStorageVM1/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-elk"
+ },
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Compute/virtualMachines/mspVM1/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-elk"
+ },
+ {
+ "id": "/subscriptions/685ba005-af8d-4b04-8f16-a7bf38b2eb5a/resourceGroups/haiche-cluster-elk/providers/Microsoft.Compute/virtualMachines/mspVM2/extensions/newuserscript",
+ "resourceGroup": "haiche-cluster-elk"
+ }
+ ],
+ "outputs": {
+ "artifactsLocationPassedIn": {
+ "type": "String",
+ "value": "{{ armTemplateBasePath }}"
+ },
+ "logIndex": {
+ "type": "String",
+ "value": "azure-weblogic-cluster-b4e465d5-6ffc-49cf-b1d9-b4dbf6455d0a"
+ }
+ },
+ "parameters": {
+ "_artifactsLocation": {
+ "type": "String",
+ "value": "{{ armTemplateBasePath }}"
+ },
+ "_artifactsLocationELKTemplate": {
+ "type": "String",
+ "value": "{{ armTemplateBasePath }}"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "SecureString"
+ },
+ "adminVMName": {
+ "type": "String",
+ "value": "adminVM"
+ },
+ "elasticsearchEndpoint": {
+ "type": "String",
+ "value": "https://example.eastus2.azure.elastic-cloud.com:9243"
+ },
+ "elasticsearchPassword": {
+ "type": "SecureString"
+ },
+ "elasticsearchUserName": {
+ "type": "String",
+ "value": "elastic"
+ },
+ "guidValue": {
+ "type": "String",
+ "value": "b4e465d5-6ffc-49cf-b1d9-b4dbf6455d0a"
+ },
+ "location": {
+ "type": "String",
+ "value": "eastus"
+ },
+ "logsToIntegrate": {
+ "type": "Array",
+ "value": [
+ "HTTPAccessLog",
+ "ServerLog",
+ "DomainLog",
+ "DataSourceLog",
+ "StandardErrorAndOutput",
+ "NodeManagerLog"
+ ]
+ },
+ "managedServerPrefix": {
+ "type": "String",
+ "value": "msp"
+ },
+ "maxDynamicClusterSize": {
+ "value": 8
+ },
+ "numberOfManagedApplicationInstances": {
+ "type": "Int",
+ "value": 2
+ },
+ "numberOfManagedCacheInstances": {
+ "type": "Int",
+ "value": 1
+ },
+ "wlsDomainName": {
+ "type": "String",
+ "value": "wlsd"
+ },
+ "wlsPassword": {
+ "type": "SecureString"
+ },
+ "wlsUserName": {
+ "type": "String",
+ "value": "weblogic"
+ }
+ },
+ "parametersLink": null,
+ "providers": [
+ {
+ "id": null,
+ "namespace": "Microsoft.Resources",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ null
+ ],
+ "properties": null,
+ "resourceType": "deployments"
+ }
+ ]
+ },
+ {
+ "id": null,
+ "namespace": "Microsoft.Compute",
+ "registrationPolicy": null,
+ "registrationState": null,
+ "resourceTypes": [
+ {
+ "aliases": null,
+ "apiVersions": null,
+ "capabilities": null,
+ "locations": [
+ "eastus"
+ ],
+ "properties": null,
+ "resourceType": "virtualMachines/extensions"
+ }
+ ]
+ }
+ ],
+ "provisioningState": "Succeeded",
+ "template": null,
+ "templateHash": "10060935779116645392",
+ "templateLink": null,
+ "timestamp": "2020-11-11T07:29:42.336797+00:00"
+ },
+ "resourceGroup": "haiche-cluster-elk",
+ "type": "Microsoft.Resources/deployments"
+}
+```
+
+## Verify ELK connection
+
+Follow the steps to check if WebLogic Server logs are exported to Elasticsearch.
+
+* Go to Azure portal
+* Copy log index from your resource group -> deployments -> elkNestedTemplate -> output -> logIndex .
+* Go to Elasticsearch cloud and launch Kibana.
+* Create index
+ * Go to Kibana -> Management -> Kibana -> Index Patterns
+ * Click `Create index Patterns`
+ * Input the log index you copy from output in Index pattern
+ * There should be an index you can select, otherwise, the ELK deployment failed
+ * Next step
+ * Select `@timestamp` in Time Filter and hit `Create index pattern`
+* View logs
+ * Go to Kibana -> Discover
+ * Select the index you just created
+ * You will find the WebLogic Server logs listed
diff --git a/subtemplate-src/dynamic-cluster-nsgRulesTemplate.md b/subtemplate-src/dynamic-cluster-nsgRulesTemplate.md
new file mode 100644
index 000000000..c7d63674d
--- /dev/null
+++ b/subtemplate-src/dynamic-cluster-nsgRulesTemplate.md
@@ -0,0 +1,81 @@
+{% include variables.md %}
+
+# Apply Azure Network Security Rule ARM Template to {{ site.data.var.wlsFullBrandName }}
+
+This page documents how to append addtional security rules to an existing Azure Network Security Group deployed with {{ site.data.var.wlsFullBrandName }} using the Azure CLI.
+
+## Prerequisies
+
+### Environment for Setup
+
+* [Azure CLI](https://docs.microsoft.com/en-us/cli/azure), use `az --version` to test if `az` works.
+
+### Azure Network Security Group
+
+The Azure Network Security Rule ARM template will be applied to an existing Azure Network Security Group (NSG) instance. If you don't have one, please create a new instance from the Azure portal, by following the link to the offer [in the index](index.md).
+
+### Prepare the Parameters JSON file
+
+You must construct a parameter JSON file containing the parameters to the NSG template. See [Create Resource Manager parameter file](https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/parameter-files) for background information about parameter files. The options to this template declare the desired configuration of the NSG.
+
+| Parameter Name | Description |
+| `denyPublicTrafficForAdminServer` | Deny public tranffic for the admin server on port 7001, 7002. |
+| `denyPublicTrafficForManagedServer` | Deny public tranffic for the managed servers on port 8001. |
+| `enableOHS` | We deal with the configuration for managed servers when the OHS load balancer is enabled. |
+| `networkSecurityGroupName` | The name of the NSG. |
+
+#### Example Parameters JSON file
+
+Here is a fully filled out parameters file, assuming the {{ site.data.var.wlsFullBrandName }} was deployed accepting the default values.
+
+```json
+{
+ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "denyPublicTrafficForManagedServer": {
+ "value": true
+ },
+ "denyPublicTrafficForAdminServer": {
+ "value": false
+ },
+ "enableOHS": {
+ "value": true
+ },
+ "networkSecurityGroupName": {
+ "value": "wls-nsg"
+ }
+ }
+}
+```
+
+## Invoke the ARM template
+
+This section shows how to kick off the deployment step-by-step. After the deployment, your existing NSG will append two additional Inbound Rules for admin and managed servers. Here we assume you have the parameter file in the current directory, the file is named `parameters.json`, and your NSG is named `wls-nsg`. Don't forget to replace `yourResourceGroup` with the Azure resource group in which the NSG is created.
+
+### First, validate your parameters file
+
+The `az group deployment validate` command is very useful to validate your parameters file is syntactically correct.
+
+```bash
+az group deployment validate --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateBasePath }}nestedtemplates/nsgNestedTemplate.json
+```
+
+If the command returns with an exit status other than `0`, inspect the output and resolve the problem before proceeding. You can check the exit status by executing the commad `echo $?` immediately after the `az` command.
+
+### Next, execute the template with it
+
+After successfully validating the template invocation, change `validate` to `create` to invoke the template.
+
+```bash
+az group deployment create --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateBasePath }}nestedtemplates/nsgNestedTemplate.json
+```
+
+## Verify the rules have been appended to the Azure Network Security Group successfully
+
+When the deployment is completed, you can verify the appended rules via Azure Portal
+* Visit the Azure Network Security Group under your resource group used above.
+* Go to `Settings -> Inbound security rules`.
+* Verify there is a rule named `WebLogicAdminPortsAllowed` with **Priority = '210'; Port = '7001, 7002'; Protocol = 'TCP'; Source = '10.0.0.0/24'; Aciton = 'Allow'**.
+* Verify there is a rule named `WebLogicManagedPortsDenied` with **Priority = '221'; Port = '8001'; Protocol = '*'; Aciton = 'Deny'**.
+
diff --git a/subtemplate-src/dynamic-cluster-ohsNestedTemplate.md b/subtemplate-src/dynamic-cluster-ohsNestedTemplate.md
new file mode 100644
index 000000000..f9a774d53
--- /dev/null
+++ b/subtemplate-src/dynamic-cluster-ohsNestedTemplate.md
@@ -0,0 +1,211 @@
+
+{% include variables.md %}
+
+# Apply OHS ARM Template to {{ site.data.var.wlsFullBrandName }}
+
+This page documents how to configure an existing deployment of {{ site.data.var.wlsFullBrandName }} with a Oracle HTTP Server using Azure CLI.
+
+## Prerequisites
+
+### Environment for Setup
+
+* [Azure CLI](https://docs.microsoft.com/en-us/cli/azure), use `az --version` to test if `az` works.
+
+### WebLogic Server Instance
+
+The template will be applied to an existing {{ site.data.var.wlsFullBrandName }} instance. If you don't have one, please create a new instance from the Azure portal, by following the link to the offer [in the index](index.md).
+
+### Certificate for SSL Termination
+
+Oracle HTTP Server serves as the front end load balancer for the {{ site.data.var.wlsFullBrandName }} dynamic cluster, hence it must be provided with a certificate to allow browsers to connect via SSL.
+
+#### Creating Self-signed certificate
+
+This section describes how to create a self-signed certificate in the format expected by Oracle HTTP server. The example provided below is one of the ways to create self-signed certificates. Note that such self-signed certificates created should only be used for testing purpose and it is not recommended for production purpose.
+
+* JKS format certificate
+
+ ```bash
+ keytool -genkey -keyalg RSA -alias selfsigned -keystore keyStore.jks -storepass password -validity 360 -keysize 2048
+ ```
+
+ Provide all information prompted and store in a file.
+
+* PKCS12 format certificate
+
+ ```bash
+ openssl req -newkey rsa:2048 -x509 -keyout key.pem -out out.pem -days 3650
+ ```
+
+ Provide all information prompted and store in a file.
+
+## Prepare the Parameters JSON file
+
+You must construct a parameters JSON file containing the parameters to the OHS ARM template. See [Create Resource Manager parameter file](https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/parameter-files) for background information about parameter files. We must specify the information of the existing SSL certificate. This section shows how to obtain the values for the following required properties.
+
+| Parameter Name | Explanation |
+|----------------|-------------|
+| `_artifactsLocation`| See below for details. |
+|`adminPasswordOrKey`|Password of administration account for the new Virtual Machine that hosts Oracle HTTP Server.|
+|`adminUsername`| Username of administration account for the new Virtual Machine that hosts Oracle HTTP Server.|
+|`adminRestMgmtURL`| WebLogic Server admin REST management URL. It should be in the format `http://admincomputername:adminport/management/weblogic/latest`.Example `http://adminVM:7001/management/weblogic/latest` or `http://adminVM:7005/management/weblogic/latest` |
+|`dnsLabelPrefix`| Must be the same `dnsLabelPrefix` value with which WebLogic Dynamic cluster deployment is made. This value is used for fetching existing deployment `dnsLabelPrefix-nsg` NSG value. |
+|`location`| Must be the same region into which the WebLogic dynamic cluster deployment is made.|
+|`ohsComponentName` | Oracle HTTP Server component name to be configured as part of domain. At deployment, if this value is changed from its default value, the value used at deployment time must be used.|
+|`ohsDomainName`| Oracle HTTP Server standalone domain name. At deployment, if this value is changed from its default value, the value used at deployment time must be used. |
+|`ohsNMPassword`| Oracle HTTP Server NodeManager password configured as part of the domain. |
+|`ohsNMUser`| Oracle HTTP Server NodeManager user name configured as part of the domain.|
+|`keyType` | Certificate format supported for configuring Oracle HTTP Server SSL configuration. Supported format is `JKS` and `PKCS12`. Default value is `PKCS12`|
+|`ohsSSLKeystoreData`| base64 bit encoded value of JKS/PKCS12 certificate contents. See below for details|
+|`ohsSSLKeystorePassword`|The keystore stored password |
+|`ohsSkuUrnVersion`| Oracle HTTP Server base images provided by publisher Oracle. Refer [Azure Marketplace OHS Base Images](https://azuremarketplace.microsoft.com/en-us/marketplace/apps?search=oracle%20ohs%20base%20image) |
+|`ohsVMName`|At deployment time, if this value is changed from its default value, the value used at deployment time must be used. Otherwise, this parameter should be omitted.|
+|`ohshttpPort` | Http server port configured using which application can be accessed via Oracle HTTP Server.At deployment, if this value is changed from its default value, the value used at deployment time must be used.|
+|`ohshttpsPort`| Https server port configured using which application can be accessed via Oracle HTTP Server.At deployment, if this value is changed from its default value, the value used at deployment time must be used.|
+|`oracleVaultPswd` | Password for Oracle wallet/vault, to add certificates supplied for OHS.|
+|`storageAccountName`| The name of an existing storage account. Must be the same storage account name avilable in existing deployed WebLogic dynamic cluster|
+|`virtualNetworkName`| The name of an existing virtual network name. Must be the same virtual network name available in existing deployed WebLogic dynamic cluster|
+|`wlsUserName` |Must be the same value provided at deployment time for WebLogic dynamic cluster deployment time.|
+|`wlsPassword` |Must be the same value provided at deployment time WebLogic dynamic cluster deployment time.|
+
+
+### `_artifactsLocation`
+
+This value must be the following.
+
+```bash
+{{ armTemplateBasePath }}
+```
+
+### `ohsSSLKeystoreData`
+Use base64 to encode your existing SSL certificate.
+
+ base64 your-JKS/PKCS12-certificate-contents -w 0 > temp.txt
+
+Use temp.txt contents to set the value for ohsSSLKeystoreData
+
+#### Example Parameters JSON
+
+Here is a fully filled out parameters file. Note that we did not include any optional parameters, assuming the {{ site.data.var.wlsFullBrandName }} was deployed accepting the default values.
+
+{{ site.data.var.passwordInFileNote }}
+
+```json
+{
+ "_artifactsLocation": {
+ "value": "{{ armTemplateBasePath }}"
+ },
+ "adminPasswordOrKey": {
+ "value": "Azure123456!"
+ },
+ "adminRestMgmtURL": {
+ "value": "http://adminVM:7001/management/weblogic/latest"
+ },
+ "adminUsername": {
+ "value": "azureuser"
+ },
+ "dnsLabelPrefix": {
+ "value": "wls"
+ },
+ "keyType": {
+ "value": "JKS"
+ },
+ "location": {
+ "value": "eastus"
+ },
+ "ohsComponentName": {
+ "value": "ohs_component"
+ },
+ "ohsDomainName": {
+ "value": "ohsStandaloneDomain"
+ },
+ "ohsNMPassword": {
+ "value": "Nmpswd1234567"
+ },
+ "ohsNMUser": {
+ "value": "weblogic"
+ },
+ "ohsSSLKeystoreData": {
+ "value": "/u3+7QAAAAIAAAABAAAAAQAKc2VsZnNpZ25lZAAAAX ...."
+ },
+ "ohsSSLKeystorePassword": {
+ "value": "azure123!"
+ },
+ "ohsSkuUrnVersion": {
+ "value": "ohs-122140-jdk8-ol76;ohs-122140-jdk8-ol76;latest"
+ },
+ "ohsVMName": {
+ "value": "ohsVM"
+ },
+ "ohshttpPort": {
+ "value": "7777"
+ },
+ "ohshttpsPort": {
+ "value": "4444"
+ },
+ "oracleVaultPswd": {
+ "value": "Welcome1234567"
+ },
+ "storageAccountName": {
+ "value": "6be282olvm"
+ },
+ "virtualNetworkName": {
+ "value": "wlsd_VNET"
+ },
+ "wlsPassword": {
+ "value": "Welcome1234567"
+ },
+ "wlsUserName": {
+ "value": "weblogic"
+ }
+}
+```
+
+### Invoke the ARM template
+Assume your parameters file is available in the current directory and is named parameters.json. This section shows the commands to configure your {{ site.data.var.wlsFullBrandName }} deployment with a Oracle HTTP Server. Replace yourResourceGroup with the Azure resource group in which the {{ site.data.var.wlsFullBrandName }} is deployed.
+
+### First, validate your parameters file
+The `az deployment group validate` command is very useful to validate your parameters file is syntactically correct.
+
+```bash
+az deployment group validate --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateBasePath }}nestedtemplates/ohsNestedTemplate.json
+```
+If the command returns with an exit status other than `0`, inspect the output and resolve the problem before proceeding. You can check the exit status by executing the commad `echo $?` immediately after the `az` command.
+
+### Next, execute the template
+After successfully validating the template invocation, change `validate` to `create` to invoke the template.
+
+```bash
+az deployment group create --verbose --resource-group `yourResourceGroup` --parameters @parameters.json --template-uri {{ armTemplateBasePath }}nestedtemplates/ohsNestedTemplate.json
+```
+As with the validate command, if the command returns with an exit status other than 0, inspect the output and resolve the problem.
+
+This is an example output of successful deployment. Look for `"provisioningState": "Succeeded"` in your output.
+
+```bash
+ "provisioningState": "Succeeded",
+ "template": null,
+ "templateHash": "13760326614657528322",
+```
+
+## Verify Oracle HTTP Server setup
+
+Successful deployment provides Oracle HTTP Server access url in your output, similar to below.
+
+```json
+ "ohsAccessURL": {
+ "type": "String",
+ "value": "http://wls-5ff4cab395-loadbalancer.eastus.cloudapp.azure.com:7777"
+ },
+ "ohsSecureAccessURL": {
+ "type": "String",
+ "value": "https://wls-5ff4cab395-loadbalancer.eastus.cloudapp.azure.com:4444"
+ }
+```
+
+Follow the steps to verify Oracle HTTP Server.
+* Visit the {{ site.data.var.wlsFullBrandName }} Admin console.
+* In the left navigator, expand the tree to select **Deployments**, install some sample application targeted to WebLogic Cluster and start the service.
+* Access your application using ohsAccessURL/application
+* Access your application using ohsSecureAccessURL/application
+
diff --git a/subtemplate-src/dynamic-customDNSTemplate.md b/subtemplate-src/dynamic-customDNSTemplate.md
new file mode 100644
index 000000000..5e6921581
--- /dev/null
+++ b/subtemplate-src/dynamic-customDNSTemplate.md
@@ -0,0 +1,177 @@
+{% include variables.md %}
+
+# Configure DNS alias to {{ site.data.var.wlsFullBrandName }}
+
+This page documents how to configure an existing deployment of {{ site.data.var.wlsFullBrandName }} with a custom DNS alias.
+
+## Prerequisites
+
+### Environment for Setup
+
+* [Azure CLI](https://docs.microsoft.com/en-us/cli/azure), use `az --version` to test if `az` works.
+
+### WebLogic Server Instance
+
+The DNS Configuraton ARM template will be applied to an existing {{ site.data.var.wlsFullBrandName }} instance. If you don't have one, please create a new instance from the Azure portal, by following the link to the offer [in the index](index.md).
+
+### Registered Domain Name
+
+You need to buy a domain name to create a custom DNS alias.
+
+### Azure DNS Zone
+
+If you create the DNS alias on an existing [Azure DNS Zone](https://docs.microsoft.com/en-us/azure/dns/dns-overview), make sure you have perfomed the [Azure DNS Delegation](https://docs.microsoft.com/en-us/azure/dns/dns-domain-delegation). Once you have completed the delegation, you can verify it with `nslookup`. For example, assuming your domain name is **contoso.com**, this output shows a correct delegation.
+
+```bash
+$ nslookup -type=SOA contoso.com
+Server: 172.29.80.1
+Address: 172.29.80.1#53
+
+Non-authoritative answer:
+contoso.com
+ origin = ns1-01.azure-dns.com
+ mail addr = azuredns-hostmaster.microsoft.com
+ serial = 1
+ refresh = 3600
+ retry = 300
+ expire = 2419200
+ minimum = 300
+Name: ns1-01.azure-dns.com
+Address: 40.90.4.1
+Name: ns1-01.azure-dns.com
+Address: 2603:1061::1
+```
+
+We strongly recommand you create an Azure DNS Zone for domain management and reuse it for other perpose. Follow the [guide](https://docs.microsoft.com/en-us/azure/dns/dns-getstarted-portal) to create an Azure DNS Zone.
+
+### Azure Managed Indentify
+
+If you are going to configure DNS alias based on an existing DNS Zone, you are required to input the ID of a user-assigned managed identity.
+
+Follow this [guide](https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/how-to-manage-ua-identity-portal) to create a user-assigned managed identity.
+
+To obtain ID of the indentify: go to Azure Portal; open the identity **Overview** page; click **JSON View** and copy the **Resource ID**.
+
+
+## Prepare the Parameters
+
+We provide an automation shell script for DNS configuration. You must specify the information of the existing Oracle WebLogic Server. This section shows how to obtain the values for the following required properties.
+
+| Parameter Name | Explanation |
+|----------------|-------------|
+| `--admin-vm-name`| Required. Name of vitual machine that hosts {{ site.data.var.wlsFullBrandName }} admin server. Must be the same value provided at initial deployment time.|
+| `--admin-console-label` | Required. Label for {{ site.data.var.wlsFullBrandName }} admin console. Used to generate subdomain of admin console. |
+| `--artifact-location`| Required. See below for details. |
+| `--resource-group` | Required. Name of resource group that has WebLogic cluster deployed. |
+| `--location` | Required. Must be the same region into which the server was initially deployed. |
+| `--zone-name` | Required. Azure DNS Zone name. |
+| `--ohs-vm-name` | Optional. Specify name of the VM that hosts the Oracle HTTP Server Load Balancer. |
+| `--loadbalancer-label` | Optional. Label for Load Balancer. Used to generate subdomain of application gateway. The parameter is only required if you want to create DNS alias for application gateway.|
+| `--identity-id` | Optional. ID of Azure user-assigned managed identity. The parameter is only required if you are creating DNS alias on an existing DNS Zone.|
+| `--zone-resource-group` | Optional. Name of resource group that has Azure DNS Zone deployed. The parameter is only required if you are creating DNS alias on an existing DNS Zone. |
+| `--help` | Help. |
+
+### Artifacts location
+
+This value must be the following.
+
+```bash
+{{ armTemplateBasePath }}
+```
+
+## Invoke the Automation Script
+
+We provide an automation script to configure a custom DNS alias. The script lets you do the following:
+
+ * If you have an Azure DNS Zone, it will create a DNS alias for the admin console and application gateway on the existing DNS Zone.
+ * If you don't have an Azure DNS Zone, it will create the DNS Zone in the same resource group as the WebLogic cluster, then create the DNS alias for the admin console and application gateway.
+
+### Configure DNS Alias on an Existing Azure DNS Zone
+
+To configure a DNS alias on an existing Azure DNS Zone, in addition to the required parameters, you must also specify an Azure user-assigned managed identity ID and the resource group name in which your DNS Zone is deployed.
+
+This is an example to create a DNS alias `admin.contoso.com` for the admin console and `applciations.contoso.com` for the application gateway on an existing Azure DNS Zone.
+
+```bash
+$ curl -fsSL {{ site.data.var.artifactsLocationBase }}{{ pageDir }}/{{ site.data.var.artifactsLocationTag }}/cli-scripts/custom-dns-alias-cli.sh \
+ | /bin/bash -s -- \
+ --resource-group `yourResourceGroup` \
+ --admin-vm-name adminVM \
+ --admin-console-label admin \
+ --artifact-location {{ armTemplateBasePath }} \
+ --location eastus \
+ --zone-name contoso.com \
+ --ohs-vm-name ohsVM \
+ --loadbalancer-label applications \
+ --identity-id `yourIndentityID` \
+ --zone-resource-group `yourDNSZoneResourceGroup`
+```
+
+An example output:
+
+```text
+Done!
+
+Custom DNS alias:
+ Resource group: haiche-dns-doc
+ WebLogic Server Administration Console URL: http://admin.contoso.com:7001/console
+ WebLogic Server Administration Console secured URL: https://admin.contoso.com:7002/console
+
+
+ Application Gateway URL: http://applications.contoso.com:7777
+ Application Gateway secured URL: https://applications.contoso.com:4444
+```
+
+
+### Configure DNS Alias on a New Azure DNS Zone
+
+To configure a DNS alias on a new Azure DNS Zone, you must specify the required parameters.
+
+This is an example of creating an Azure DNS Zone, then creating a DNS alias `admin.contoso.com` for the admin console and `applications.contoso.com` for application gateway.
+
+```bash
+$ curl -fsSL {{ site.data.var.artifactsLocationBase }}{{ pageDir }}/{{ site.data.var.artifactsLocationTag }}/cli-scripts/custom-dns-alias-cli.sh \
+ | /bin/bash -s -- \
+ --resource-group `yourResourceGroup` \
+ --admin-vm-name adminVM \
+ --admin-console-label admin \
+ --artifact-location {{ armTemplateBasePath }} \
+ --location eastus \
+ --zone-name contoso.com \
+ --ohs-vm-name ohsVM \
+ --loadbalancer-label applications
+```
+
+An example output:
+
+```text
+DONE!
+
+
+Action required:
+ Complete Azure DNS delegation to make the alias accessible.
+ Reference: https://aka.ms/dns-domain-delegation
+ Name servers:
+ [
+ "ns1-02.azure-dns.com.",
+ "ns2-02.azure-dns.net.",
+ "ns3-02.azure-dns.org.",
+ "ns4-02.azure-dns.info."
+ ]
+
+Custom DNS alias:
+ Resource group: haiche-dns-doc
+ WebLogic Server Administration Console URL: http://admin.contoso.com:7001/console
+ WebLogic Server Administration Console secured URL: https://admin.contoso.com:7002/console
+
+
+ Application Gateway URL: http://applications.contoso.com:7777
+ Application Gateway secured URL: https://applications.contoso.com:4444
+```
+
+**Note:** The DNS aliases are not accessible now, you must perform Azure DNS delegation after the deployment. Follow [Delegation of DNS zones with Azure DNS](https://aka.ms/dns-domain-delegation) to complete the Azure DNS delegation.
+
+
+## Verify the Custom Alias
+
+Access the URL from output to verify if the custom alias works.