根据公共或私有等参数将公共 ip 附加到 nic 仅具有多个虚拟机 [英] Attach public ip to nic base on parameter like public or privateonly with multiple VM'S

查看:14
本文介绍了根据公共或私有等参数将公共 ip 附加到 nic 仅具有多个虚拟机的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何根据参数privateonly 或public 附加公共ip,尝试使用多个虚拟机创建它.我在这里提供我正在运行的完整模板.

How to attach public ip based on parameter privateonly or public, trying to create it with multiple vms. I am giving here full template which i am running.

  {
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]",
      "metadata": {
        "description": "Location for the resources."
      }
    },
    "vmName": {
      "type": "string",
      "defaultValue": "vm",
      "metadata": {
        "description": "Name for the Virtual Machine."
      }
    },
    "ClusterType": {
      "type": "string",
      "defaultValue": "3 vm apache",
      "metadata": {
        "description": "Type of cluster to deploy, this is using a single storage account"
      }
    },
    "adminUsername": {
      "type": "string",
      "defaultValue": "centos",
      "metadata": {
        "description": "User name for the Virtual Machine."
      }
    },
    "adminPasswordOrKey": {
      "type": "string"
    },
    "vmSize": {
      "type": "string",
      "metadata": {
        "description": "Size for the Virtual Machine."
      }
    },
    "storageNewOrExisting": {
      "type": "string",
      "defaultValue": "new"
    },
    "storageAccountName": {
      "type": "string",
      "defaultValue": "[concat('storage', uniqueString(resourceGroup().id))]",
      "metadata": {
        "description": "Name of the storage account"
      }
    },
    "storageAccountType": {
      "type": "string",
      "defaultValue": "Standard_LRS",
      "metadata": {
        "description": "Storage account type"
      }
    },
    "storageAccountResourceGroupName": {
      "type": "string",
      "defaultValue": "[resourceGroup().name]",
      "metadata": {
        "description": "Name of the resource group for the existing storage account"
      }
    },
    "virtualNetworkNewOrExisting": {
      "type": "string",
      "defaultValue": "new",
      "metadata": {
        "description": "Determines whether or not a new virtual network should be provisioned."
      }
    },
    "virtualNetworkName": {
      "type": "string",
      "defaultValue": "VirtualNetwork",
      "metadata": {
        "description": "Name of the virtual network"
      }
    },
    "addressPrefixes": {
      "type": "array",
      "defaultValue": [
        "10.0.0.0/16"
      ],
      "metadata": {
        "description": "Address prefix of the virtual network"
      }
    },
    "subnetName": {
      "type": "string",
      "defaultValue": "default",
      "metadata": {
        "description": "Name of the subnet"
      }
    },
    "subnetPrefix": {
      "type": "string",
      "defaultValue": "10.0.0.0/24",
      "metadata": {
        "description": "Subnet prefix of the virtual network"
      }
    },
    "virtualNetworkResourceGroupName": {
      "type": "string",
      "defaultValue": "[resourceGroup().name]",
      "metadata": {
        "description": "Name of the resource group for the existing virtual network"
      }
    },
    "vmDataDiskSize":{
      "type": "string",
      "defaultValue": "50",
      "metadata": {
        "description": "Minimum data disk size should be 50 GB"
      },    
    "publicIpName": {
      "type": "string",
      "defaultValue": "rxnode",
      "metadata": {
        "description": "Name of public IP Address"
      }
    }
  },
  "variables": {
    "publisher": "OpenLogic",
    "offer": "CentOS",
    "sku": "7.3",
    "version": "latest",
    "vmBootDiskSize": 50,
    "nicName": "[concat(parameters('vmName'), '-nic-')]",
    "numberOfVM": "[int(first(parameters('ClusterType')))]",
    "apacheinstallation": "[contains(parameters('ClusterType'), 'apache')]",
    "networkSecurityGroupName": "[concat(parameters('vmName'), '-nsg-ssh')]",
    "publicIpName": "[concat(parameters('vmName'),'-publicip')]"
    "privateIp": {
      "privateIPAllocationMethod": "Dynamic",
      "subnet": {
          "id": "[resourceId(parameters('virtualNetworkResourceGroupName'), 'Microsoft.Network/virtualNetworks/subnets/', parameters('virtualNetworkName'), parameters('subnetName'))]"
      }
    },
    "copy": [
      {
          "name": "publicIPAddress",
          "count": "[variables('numberOfVM')]",
          "input": {
            "id": "[resourceId('Microsoft.Network/publicIPAddresses',  concat(variables('publicIpName'), copyIndex('publicIPAddress')))]"
          }
      }
    ]
  },
  "resources": [
    {
      "condition": "[equals(parameters('storageNewOrExisting'), 'new')]",
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2018-02-01",
      "name": "[parameters('storageAccountName')]",
      "location": "[parameters('location')]",
      "kind": "Storage",
      "sku": {
        "name": "[parameters('storageAccountType')]"
      }
    },
    {
      "condition": "[equals(parameters('publicIpName'), 'None')]",
      "type": "Microsoft.Network/publicIPAddresses",
      "apiVersion": "2018-04-01",
      "name": "[concat(variables('publicIpName'), copyIndex())]",
      "location": "[parameters('location')]",
      "copy": {
        "name": "ipLoop",
        "count": "[variables('numberOfVM')]"
      },
      "sku": {
        "name": "Basic"
      },
      "properties": {
        "publicIPAllocationMethod": "Dynamic"
      }
    },
    {
      "condition": "[equals(parameters('virtualNetworkNewOrExisting'), 'new')]",
      "type": "Microsoft.Network/virtualNetworks",
      "apiVersion": "2018-04-01",
      "name": "[parameters('virtualNetworkName')]",
      "location": "[parameters('location')]",
      "properties": {
        "addressSpace": {
          "addressPrefixes": "[parameters('addressPrefixes')]"
        },
        "subnets": [
          {
            "name": "[parameters('subnetName')]",
            "properties": {
              "addressPrefix": "[parameters('subnetPrefix')]"
            }
          }
        ]
      }
    },
    {
      "name": "[variables('networkSecurityGroupName')]",
      "type": "Microsoft.Network/networkSecurityGroups",
      "apiVersion": "2018-04-01",
      "location": "[parameters('location')]",
      "properties": {
        "securityRules": [
          {
            "name": "default-allow-ssh",
            "properties": {
              "priority": 1000,
              "sourceAddressPrefix": "*",
              "protocol": "Tcp",
              "destinationPortRange": "22",
              "access": "Allow",
              "direction": "Inbound",
              "sourcePortRange": "*",
              "destinationAddressPrefix": "*"
            }
          },
          {
            "name": "allow-webport-8080",
            "properties": {
              "priority": 1200,
              "sourceAddressPrefix": "*",
              "protocol": "Tcp",
              "destinationPortRange": "8080",
              "access": "Allow",
              "direction": "Inbound",
              "sourcePortRange": "*",
              "destinationAddressPrefix": "*"
            }
          }
        ]
      }
    },
    {
      "apiVersion": "2018-04-01",
      "type": "Microsoft.Network/networkInterfaces",
      "name": "[concat(variables('nicName'), copyIndex())]",
      "location": "[parameters('location')]",
      "copy": {
        "name": "nicLoop",
        "count": "[variables('numberOfVM')]"
      },
      "dependsOn": [
        "ipLoop",
        "[parameters('virtualNetworkName')]",
        "[variables('networkSecurityGroupName')]"
      ],
      "properties": {
        "ipConfigurations": [
          {
            "name": "ipconfig1",
            "properties": "[if(equals(variables('publicipName'), 'None'), variables('privateIp'), union(variables('privateIp'), variables('publicIPAddress')[copyIndex()]))]" }
        ],
        "networkSecurityGroup": {
           "id": "[resourceId('Microsoft.Network/networkSecurityGroups', variables('networkSecurityGroupName'))]"
        }
      }
    },
    {
      "apiVersion": "2018-04-01",
      "type": "Microsoft.Compute/virtualMachines",
      "name": "[concat(parameters('vmName'), copyIndex())]",
      "location": "[parameters('location')]",
      "copy": {
        "name": "virtualMachineLoop",
        "count": "[variables('numberOfVM')]"
      },
      "dependsOn": [
        "[parameters('storageAccountName')]",
        "nicLoop"
      ],
      "properties": {
        "hardwareProfile": {
          "vmSize": "[parameters('vmSize')]"
        },
        "osProfile": {
          "computerName": "[concat(parameters('vmName'), copyIndex())]",
          "adminUsername": "[parameters('adminUsername')]",
          "adminPassword": "[parameters('adminPasswordOrKey')]",
          "linuxConfiguration": {
            "disablePasswordAuthentication": true,
            "ssh": {
              "publicKeys": [
                {
                  "path": "[concat('/home/', parameters('adminUsername'), '/.ssh/authorized_keys')]",
                  "keyData": "[parameters('adminPasswordOrKey')]"
                }
              ]
            }
          }
        },
        "storageProfile": {
          "imageReference": {
            "publisher": "[variables('publisher')]",
            "offer": "[variables('offer')]",
            "sku": "[variables('sku')]",
            "version": "[variables('version')]"
          },
          "osDisk": {
            "caching": "ReadWrite",
            "createOption": "FromImage",
            "diskSizeGB": "[variables('vmBootDiskSize')]"
          },
          "copy": [
            {
              "name": "dataDisks",
              "count": 1,
              "input": {
                "caching": "ReadWrite",
                "diskSizeGB": "[parameters('vmDataDiskSize')]",
                "lun": "[copyIndex('dataDisks')]",
                "name": "[concat(parameters('vmName'), '-datadisk', copyIndex(), copyIndex('dataDisks'))]",
                "createOption": "Empty"
              }
            }
          ]
        },
        "networkProfile": {
          "networkInterfaces": [
            {
              "id": "[resourceId('Microsoft.Network/networkInterfaces', concat(variables('nicName'), copyindex()))]"
            }
          ]
        },
        "diagnosticsProfile": {
          "bootDiagnostics": {
            "enabled": true,
            "storageUri": "[reference(resourceId(parameters('storageAccountResourceGroupName'), 'Microsoft.Storage/storageAccounts/', parameters('storageAccountName')), '2018-02-01').primaryEndpoints.blob]"
          }
        }
      }
    }
  ],
  "outputs": {
  }
}

这里我将 json 上下文放入 if 条件中.如果需要附加公共 ip 则将 json 上下文传递给 publicIPAddress 否则它将传递空值.

Here I am putting json context into if condition. If needs to attach public ip then it will pass json context to publicIPAddress else it will pass null value.

推荐答案

您可以使用带有预定义变量的 union() 函数来实现这一点.更干净+我不确定你的方式是否适用于所有的转义(我认为你不允许使用 json() 函数构建真正的 json;至少我尝试过的任何东西 - 都失败了).

you can use union() function with predefined variables to achieve that. a lot cleaner + I'm not sure your way will work with all the escapes (i think you are not allowed to build real json with json() function; at least whatever I tried - failed).

"variables": {
    "publicIP": {
        "publicIPAddress": {
            "id": "[resourceId('Microsoft.Network/publicIPAddresses',  concat(variables('publicIpName')))]"
        }
    },
    "privateIp": {
        "privateIPAllocationMethod": "Dynamic",
        "subnet": {
            "id": "[resourceId(parameters('virtualNetworkResourceGroupName'), 'Microsoft.Network/virtualNetworks/subnets/', parameters('virtualNetworkName'), parameters('subnetName'))]"
        }
    }
}

然后在您的 ipConfigurations 中,您可以这样做:

and then in your ipConfigurations you can do this:

"ipConfigurations": [
    {
        "name": "ipconfig1",
        "properties": "[if(equals(variables('publicipName'), 'None'), variables('privateIp'), union(variables('privateIp'), variables('publicIp'))]"
    }
],

这将在不需要公共 IP 时使用 privateIp 变量,并在需要时添加公共 IP.

this will use privateIp variable when no public IP is needed and it will add public IP when its needed.

如果将 copyIndex 与 publicIp 一起使用,您需要这样做:

if using copyIndex with publicIp you need to do this:

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {},
    "variables": {
        "name": "testo",
        "copy": [
            {
                "name": "publicIPAddress",
                "count": 3,
                "input": {
                    "publicIPAddress": {
                        "id": "[resourceId('Microsoft.Network/publicIPAddresses',  concat(variables('name'), '-ip-', copyIndex('publicIPAddress')))]"
                    }
                }
            }
        ],
        "privateIp": {
            "privateIPAllocationMethod": "Dynamic",
            "subnet": {
                "id": "resourceId"
            }
        }
    },
    "resources": [
        {
            "apiVersion": "2015-06-15",
            "type": "Microsoft.Network/publicIPAddresses",
            "name": "[concat(variables('name'), '-ip-', copyIndex())]",
            "location": "[resourceGroup().location]",
            "copy": {
                "name": "ipLoop",
                "count": 3
            },
            "properties": {
                "publicIPAllocationMethod": "Dynamic"
            }
        },
        {
            "apiVersion": "2018-04-01",
            "type": "Microsoft.Network/networkInterfaces",
            "name": "[concat(variables('name'), copyIndex())]",
            "location": "[resourceGroup().location]",
            "dependsOn": [
                "ipLoop"
            ],
            "copy": {
                "name": "nicLoop",
                "count": 3
            },
            "properties": {
                "ipConfigurations": [
                    {
                        "name": "ipconfig1",
                        "properties": "[union(variables('privateIp'), variables('publicIPAddress')[copyIndex()])]"
                    }
                ]
            }
        }
    ]
}

这篇关于根据公共或私有等参数将公共 ip 附加到 nic 仅具有多个虚拟机的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆