Узнайте, как развернуть полнофункциональное решение MOVEit Automation.

Цель этой статьи — продемонстрировать, как можно использовать инфраструктуру как код с помощью шаблонов ARM для развертывания решения MOVEit в Azure.

Что такое MOVEit?

Progress® MOVEit Automation — это программное обеспечение для автоматизации управляемой передачи файлов (MFT), которое работает поверх виртуальной машины в Azure или у вашего предпочтительного облачного провайдера. Он предлагает следующие преимущества:

  • Легко автоматизируйте многоэтапные логические рабочие процессы без каких-либо навыков программирования.
  • Авторизованные бизнес-администраторы могут отслеживать, планировать и запускать задачи автоматической передачи файлов.
  • Сквозное шифрование данных и подтвержденная безопасность для соответствия внутренним политикам и нормативным требованиям
  • RESTful API и сценарии PowerShell для гибкой интеграции со сторонними приложениями.
  • Информационная панель позволяет оперативно получать информацию о ключевых функциях MOVEit Automation.

Основная цель этой статьи — использовать шаблоны ARM для автоматизации процесса развертывания этого решения. Начнем с предпосылок.

Предварительные условия для развертывания MOVEit.

  • Активная подписка Azure
  • Пользователь Azure с ролью владельца или участника
  • SMTP-ретранслятор. Почтовый SMTP-сервер, способный принимать исходящую почту от виртуальных машин, работающих в Azure. Вы можете настроить SMTP после развертывания.

Теперь давайте создадим наш шаблон ARM.

Мы приступим к определению параметров.

1. Шаблон MOVEit ARM — параметры

Решение работает поверх виртуальной машины, поэтому мы определим следующие параметры:

  • Место расположения
  • Размер виртуальной машины
  • Имя пользователя и пароль администратора
  • Имя и фамилия клиента
  • название компании
  • Электронная почта клиента
  • Телефон
  • Город
  • Состояние
  • Страна
  • Пароль системного администратора
  • Электронная почта
  • Электронная почта от
  • SMTP-порт
  • Имя пользователя и пароль SMTP

В приведенном ниже коде показано определение раздела параметров шаблона ARM:

"parameters": {
        "location": {
            "type": "string"
        },
        "virtualMachineSize": {
            "type": "string"
        },
        "adminUsername": {
            "type": "string"
        },
        "adminPassword": {
            "type": "securestring"
        },
        "mi_sysadminPassword": {
            "type": "securestring"
        },
        "mi_emailTo": {
            "type": "string"
        },
        "mi_emailFrom": {
            "type": "string"
        },
        "mi_smtpHost": {
            "type": "string"
        },
        "mi_smtpPort": {
            "type": "string"
        },
        "mi_smtpUsername": {
            "type": "string"
        },
        "mi_smtpPassword": {
            "type": "securestring"
        },
        "ci_custFirstName": {
            "type": "string"
        },
        "ci_custLastName": {
            "type": "string"
        },
        "ci_custCompanyName": {
            "type": "string"
        },
        "ci_custEmail": {
            "type": "string"
        },
        "ci_custPhone": {
            "type": "string"
        },
        "ci_custCity": {
            "type": "string",
            "defaultValue": ""
        },
        "ci_custState": {
            "type": "string",
            "defaultValue": ""
        },
        "ci_custCountry": {
            "type": "string",
            "defaultValue": ""
        }
    },

Обратите внимание, что мы используем ‘secureString’ для передачи паролей/секретов и конфиденциальных данных в развертывании. Эти секреты не будут храниться в истории развертывания или регистрироваться.

Теперь мы определим переменные, которые будут использоваться.

2. Шаблон MOVEit ARM — переменные

В разделе переменных шаблона ARM мы включим следующее:

  • Имя виртуальной машины
  • Имя виртуальной сети
  • Имя сетевого интерфейса
  • Имя группы безопасности сети
  • Префикс адреса
  • Имя подсети
  • Префикс подсети
  • Имя общедоступного IP-адреса
  • Тип общедоступного IP-адреса
  • Имя издателя
  • Предложение
  • Артикул
  • Версия
  • Ссылка на изображение
  • План

В приведенном ниже коде показано определение раздела переменных шаблона ARM:

"variables": {
        "virtualMachineName": "MIA",
        "virtualNetworkName": "vnet1",
        "networkInterfaceName": "nic1",
        "networkSecurityGroupName": "nsg1",
        "addressPrefix": "10.5.0.0/16",
        "subnetName": "subnet1",
        "subnetPrefix": "10.5.0.0/24",
        "publicIpAddressName": "publicip1",
        "publicIpAddressType": "dynamic",
        "myPublisher": "progresssoftwarecorporation",
        "myOffer": "moveit-automation-vm",
        "mySKU": "moveit-automation-starter",
        "myVersion": "latest",
        "myImageReference": {
            "publisher": "[variables('myPublisher')]",
            "offer": "[variables('myOffer')]",
            "sku": "[variables('mySKU')]",
            "version": "[variables('myVersion')]"
        },
        "myPlan": {
            "name": "[variables('mySKU')]",
            "product": "[variables('myOffer')]",
            "publisher": "[variables('myPublisher')]"
        }
    },

Далее мы определим ресурсы.

3. Шаблон MOVEit ARM — Ресурсы

В разделе ресурсов шаблона ARM мы определим развертывание с вложенным шаблоном с внешней областью действия.

В приведенном ниже коде показано определение раздела ресурсов шаблона ARM:

"resources": [
        {
            "name": "pid-f4ddf0e0-b9cf-4104-860f-2b39bda08d19-partnercenter",
            "type": "Microsoft.Resources/deployments",
            "apiVersion": "2020-10-01",
            "properties": {
                "mode": "Incremental",
                "template": {
                    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
                    "contentVersion": "1.0.0.0",
                    "resources": []
                }
            }
        },
        {
            "name": "[variables('virtualMachineName')]",
            "type": "Microsoft.Compute/virtualMachines",
            "apiVersion": "2019-12-01",
            "plan": "[variables('myPlan')]",
            "location": "[parameters('location')]",
            "dependsOn": [
                "[concat('Microsoft.Network/networkInterfaces/', variables('networkInterfaceName'))]"
            ],
            "properties": {
                "osProfile": {
                    "computerName": "[variables('virtualMachineName')]",
                    "adminUsername": "[parameters('adminUsername')]",
                    "adminPassword": "[parameters('adminPassword')]",
                    "windowsConfiguration": {
                        "provisionVmAgent": "true"
                    }
                },
                "hardwareProfile": {
                    "vmSize": "[parameters('virtualMachineSize')]"
                },
                "storageProfile": {
                    "imageReference": "[variables('myImageReference')]",
                    "osDisk": {
                        "name": "[variables('virtualMachineName')]",
                        "createOption": "FromImage",
                        "managedDisk": {
                            "storageAccountType": "Standard_LRS"
                        }
                    }
                },
                "networkProfile": {
                    "networkInterfaces": [
                        {
                            "id": "[resourceId('Microsoft.Network/networkInterfaces', variables('networkInterfaceName'))]"
                        }
                    ]
                }
            },
            "resources": [
                {
                    "apiVersion": "2018-06-01",
                    "type": "extensions",
                    "name": "CustomScriptExtension",
                    "location": "[parameters('location')]",
                    "dependsOn": [
                        "[concat('Microsoft.Compute/virtualMachines/', variables('virtualMachineName'))]"
                    ],
                    "tags": {
                        "displayName": "config-app"
                    },
                    "properties": {
                        "publisher": "Microsoft.Compute",
                        "type": "CustomScriptExtension",
                        "typeHandlerVersion": "1.8",
                        "autoUpgradeMinorVersion": true,
                        "protectedSettings": {
                            "commandToExecute": "[concat ('C:\\Deploy\\PreMIBoot.exe', ' -app mia -vmSize ', base64(parameters('virtualMachineSize')), ' -mi_emailTo ',  base64(parameters('mi_emailTo')), ' -mi_emailFrom ', base64(parameters('mi_emailFrom')), ' -mi_smtpHost ', base64(parameters('mi_smtpHost')), ' -mi_smtpPort ', base64(parameters('mi_smtpPort')), ' -mi_smtpUsername ', base64(parameters('mi_smtpUsername')), ' -mi_smtpPassword ', base64(parameters('mi_smtpPassword')), ' -mi_sysadminPassword ', base64(parameters('mi_sysadminPassword')),  ' -ci_custFirstName ', base64(parameters('ci_custFirstName')), ' -ci_custLastName ', base64(parameters('ci_custLastName')), ' -ci_custCompanyName ', base64(parameters('ci_custCompanyName')), ' -ci_custEmail ', base64(parameters('ci_custEmail')), ' -ci_custPhone ', base64(parameters('ci_custPhone')), ' -ci_custCity ', base64(parameters('ci_custCity')), ' -ci_custState ', base64(parameters('ci_custState')), ' -ci_custCountry ', base64(parameters('ci_custCountry')))]"
                        }
                    }
                }
            ]
        },
        {
            "name": "[variables('virtualNetworkName')]",
            "type": "Microsoft.Network/virtualNetworks",
            "apiVersion": "2018-11-01",
            "location": "[parameters('location')]",
            "properties": {
                "addressSpace": {
                    "addressPrefixes": [
                        "[variables('addressPrefix')]"
                    ]
                },
                "subnets": [
                    {
                        "name": "[variables('subnetName')]",
                        "properties": {
                            "addressPrefix": "[variables('subnetPrefix')]"
                        }
                    }
                ]
            }
        },
        {
            "name": "[variables('networkInterfaceName')]",
            "type": "Microsoft.Network/networkInterfaces",
            "apiVersion": "2018-11-01",
            "location": "[parameters('location')]",
            "dependsOn": [
                "[resourceId('Microsoft.Network/publicIPAddresses', variables('publicIPAddressName'))]",
                "[resourceId('Microsoft.Network/virtualNetworks', variables('virtualNetworkName'))]",
                "[resourceId('Microsoft.Network/networkSecurityGroups', variables('networkSecurityGroupName'))]"
            ],
            "properties": {
                "ipConfigurations": [
                    {
                        "name": "ipconfig1",
                        "properties": {
                            "subnet": {
                                "id": "[resourceId('Microsoft.Network/virtualNetworks/subnets', variables('virtualNetworkName'), variables('subnetName'))]"
                            },
                            "privateIPAllocationMethod": "Dynamic",
                            "publicIpAddress": {
                                "id": "[resourceId('Microsoft.Network/publicIpAddresses', variables('publicIpAddressName'))]"
                            }
                        }
                    }
                ],
                "networkSecurityGroup": {
                    "id": "[resourceId('Microsoft.Network/networkSecurityGroups', variables('networkSecurityGroupName'))]"
                }
            }
        },
        {
            "name": "[variables('publicIpAddressName')]",
            "type": "Microsoft.Network/publicIpAddresses",
            "apiVersion": "2018-11-01",
            "location": "[parameters('location')]",
            "properties": {
                "publicIpAllocationMethod": "[variables('publicIpAddressType')]"
            }
        },
        {
            "name": "[variables('networkSecurityGroupName')]",
            "type": "Microsoft.Network/networkSecurityGroups",
            "apiVersion": "2018-11-01",
            "location": "[parameters('location')]",
            "properties": {
                "securityRules": [
                    {
                        "name": "default-allow-rdp",
                        "properties": {
                            "priority": 1000,
                            "sourceAddressPrefix": "*",
                            "protocol": "Tcp",
                            "destinationPortRange": "3389",
                            "access": "Allow",
                            "direction": "Inbound",
                            "sourcePortRange": "*",
                            "destinationAddressPrefix": "*"
                        }
                    },
                    {
                        "name": "HTTP-In",
                        "properties": {
                            "priority": 1010,
                            "sourceAddressPrefix": "*",
                            "protocol": "Tcp",
                            "destinationPortRange": "80",
                            "access": "Allow",
                            "direction": "Inbound",
                            "sourcePortRange": "*",
                            "destinationAddressPrefix": "*"
                        }
                    },
                    {
                        "name": "HTTPS-In",
                        "properties": {
                            "priority": 1020,
                            "sourceAddressPrefix": "*",
                            "protocol": "Tcp",
                            "destinationPortRange": "443",
                            "access": "Allow",
                            "direction": "Inbound",
                            "sourcePortRange": "*",
                            "destinationAddressPrefix": "*"
                        }
                    },
                    {
                        "name": "SSH-In",
                        "properties": {
                            "priority": 1030,
                            "sourceAddressPrefix": "*",
                            "protocol": "Tcp",
                            "destinationPortRange": "22",
                            "access": "Allow",
                            "direction": "Inbound",
                            "sourcePortRange": "*",
                            "destinationAddressPrefix": "*"
                        }
                    },
                    {
                        "name": "FTP-In",
                        "properties": {
                            "priority": 1040,
                            "sourceAddressPrefix": "*",
                            "protocol": "Tcp",
                            "destinationPortRange": "21",
                            "access": "Allow",
                            "direction": "Inbound",
                            "sourcePortRange": "*",
                            "destinationAddressPrefix": "*"
                        }
                    },
                    {
                        "name": "FTP-Implicit-In",
                        "properties": {
                            "priority": 1050,
                            "sourceAddressPrefix": "*",
                            "protocol": "Tcp",
                            "destinationPortRange": "990",
                            "access": "Allow",
                            "direction": "Inbound",
                            "sourcePortRange": "*",
                            "destinationAddressPrefix": "*"
                        }
                    },
                    {
                        "name": "FTP-Data-In",
                        "properties": {
                            "priority": 1060,
                            "sourceAddressPrefix": "*",
                            "protocol": "Tcp",
                            "destinationPortRange": "3000-3100",
                            "access": "Allow",
                            "direction": "Inbound",
                            "sourcePortRange": "*",
                            "destinationAddressPrefix": "*"
                        }
                    },
                    {
                        "name": "FTP-Explicit-CC-In",
                        "properties": {
                            "priority": 1070,
                            "sourceAddressPrefix": "*",
                            "protocol": "Tcp",
                            "destinationPortRange": "10021",
                            "access": "Allow",
                            "direction": "Inbound",
                            "sourcePortRange": "*",
                            "destinationAddressPrefix": "*"
                        }
                    },
                    {
                        "name": "FTP-Implicit-CC-In",
                        "properties": {
                            "priority": 1080,
                            "sourceAddressPrefix": "*",
                            "protocol": "Tcp",
                            "destinationPortRange": "10990",
                            "access": "Allow",
                            "direction": "Inbound",
                            "sourcePortRange": "*",
                            "destinationAddressPrefix": "*"
                        }
                    }
                ]
            }
        }
    ],

Обратите внимание, что в приведенном выше коде мы определяем виртуальную машину и ее свойства, включая профиль ОС, профиль оборудования, хранилище и профиль сети.

Затем мы включаем расширение, которое запускает расширение пользовательского сценария, и ссылаемся на сетевые компоненты и общедоступный IP-адрес.

Наконец, мы определяем группу безопасности сети и добавляем правила безопасности для RDP, входящего HTTP(S), входящего SSH и FTP.

После раздела ресурсов мы определяем один вывод для имени пользователя администратора.

"outputs": {
        "adminUsername": {
            "type": "string",
            "value": "[parameters('adminUsername')]"
        }
    }

4. MOVEit — полный шаблон ARM

В приведенном ниже коде показан полный шаблон ARM.

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "location": {
            "type": "string"
        },
        "virtualMachineSize": {
            "type": "string"
        },
        "adminUsername": {
            "type": "string"
        },
        "adminPassword": {
            "type": "securestring"
        },
        "mi_sysadminPassword": {
            "type": "securestring"
        },
        "mi_emailTo": {
            "type": "string"
        },
        "mi_emailFrom": {
            "type": "string"
        },
        "mi_smtpHost": {
            "type": "string"
        },
        "mi_smtpPort": {
            "type": "string"
        },
        "mi_smtpUsername": {
            "type": "string"
        },
        "mi_smtpPassword": {
            "type": "securestring"
        },
        "ci_custFirstName": {
            "type": "string"
        },
        "ci_custLastName": {
            "type": "string"
        },
        "ci_custCompanyName": {
            "type": "string"
        },
        "ci_custEmail": {
            "type": "string"
        },
        "ci_custPhone": {
            "type": "string"
        },
        "ci_custCity": {
            "type": "string",
            "defaultValue": ""
        },
        "ci_custState": {
            "type": "string",
            "defaultValue": ""
        },
        "ci_custCountry": {
            "type": "string",
            "defaultValue": ""
        }
    },
    "variables": {
        "virtualMachineName": "MIA",
        "virtualNetworkName": "vnet1",
        "networkInterfaceName": "nic1",
        "networkSecurityGroupName": "nsg1",
        "addressPrefix": "10.5.0.0/16",
        "subnetName": "subnet1",
        "subnetPrefix": "10.5.0.0/24",
        "publicIpAddressName": "publicip1",
        "publicIpAddressType": "dynamic",
        "myPublisher": "progresssoftwarecorporation",
        "myOffer": "moveit-automation-vm",
        "mySKU": "moveit-automation-starter",
        "myVersion": "latest",
        "myImageReference": {
            "publisher": "[variables('myPublisher')]",
            "offer": "[variables('myOffer')]",
            "sku": "[variables('mySKU')]",
            "version": "[variables('myVersion')]"
        },
        "myPlan": {
            "name": "[variables('mySKU')]",
            "product": "[variables('myOffer')]",
            "publisher": "[variables('myPublisher')]"
        }
    },
    "resources": [
        {
            "name": "pid-f4ddf0e0-b9cf-4104-860f-2b39bda08d19-partnercenter",
            "type": "Microsoft.Resources/deployments",
            "apiVersion": "2020-10-01",
            "properties": {
                "mode": "Incremental",
                "template": {
                    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
                    "contentVersion": "1.0.0.0",
                    "resources": []
                }
            }
        },
        {
            "name": "[variables('virtualMachineName')]",
            "type": "Microsoft.Compute/virtualMachines",
            "apiVersion": "2019-12-01",
            "plan": "[variables('myPlan')]",
            "location": "[parameters('location')]",
            "dependsOn": [
                "[concat('Microsoft.Network/networkInterfaces/', variables('networkInterfaceName'))]"
            ],
            "properties": {
                "osProfile": {
                    "computerName": "[variables('virtualMachineName')]",
                    "adminUsername": "[parameters('adminUsername')]",
                    "adminPassword": "[parameters('adminPassword')]",
                    "windowsConfiguration": {
                        "provisionVmAgent": "true"
                    }
                },
                "hardwareProfile": {
                    "vmSize": "[parameters('virtualMachineSize')]"
                },
                "storageProfile": {
                    "imageReference": "[variables('myImageReference')]",
                    "osDisk": {
                        "name": "[variables('virtualMachineName')]",
                        "createOption": "FromImage",
                        "managedDisk": {
                            "storageAccountType": "Standard_LRS"
                        }
                    }
                },
                "networkProfile": {
                    "networkInterfaces": [
                        {
                            "id": "[resourceId('Microsoft.Network/networkInterfaces', variables('networkInterfaceName'))]"
                        }
                    ]
                }
            },
            "resources": [
                {
                    "apiVersion": "2018-06-01",
                    "type": "extensions",
                    "name": "CustomScriptExtension",
                    "location": "[parameters('location')]",
                    "dependsOn": [
                        "[concat('Microsoft.Compute/virtualMachines/', variables('virtualMachineName'))]"
                    ],
                    "tags": {
                        "displayName": "config-app"
                    },
                    "properties": {
                        "publisher": "Microsoft.Compute",
                        "type": "CustomScriptExtension",
                        "typeHandlerVersion": "1.8",
                        "autoUpgradeMinorVersion": true,
                        "protectedSettings": {
                            "commandToExecute": "[concat ('C:\\Deploy\\PreMIBoot.exe', ' -app mia -vmSize ', base64(parameters('virtualMachineSize')), ' -mi_emailTo ',  base64(parameters('mi_emailTo')), ' -mi_emailFrom ', base64(parameters('mi_emailFrom')), ' -mi_smtpHost ', base64(parameters('mi_smtpHost')), ' -mi_smtpPort ', base64(parameters('mi_smtpPort')), ' -mi_smtpUsername ', base64(parameters('mi_smtpUsername')), ' -mi_smtpPassword ', base64(parameters('mi_smtpPassword')), ' -mi_sysadminPassword ', base64(parameters('mi_sysadminPassword')),  ' -ci_custFirstName ', base64(parameters('ci_custFirstName')), ' -ci_custLastName ', base64(parameters('ci_custLastName')), ' -ci_custCompanyName ', base64(parameters('ci_custCompanyName')), ' -ci_custEmail ', base64(parameters('ci_custEmail')), ' -ci_custPhone ', base64(parameters('ci_custPhone')), ' -ci_custCity ', base64(parameters('ci_custCity')), ' -ci_custState ', base64(parameters('ci_custState')), ' -ci_custCountry ', base64(parameters('ci_custCountry')))]"
                        }
                    }
                }
            ]
        },
        {
            "name": "[variables('virtualNetworkName')]",
            "type": "Microsoft.Network/virtualNetworks",
            "apiVersion": "2018-11-01",
            "location": "[parameters('location')]",
            "properties": {
                "addressSpace": {
                    "addressPrefixes": [
                        "[variables('addressPrefix')]"
                    ]
                },
                "subnets": [
                    {
                        "name": "[variables('subnetName')]",
                        "properties": {
                            "addressPrefix": "[variables('subnetPrefix')]"
                        }
                    }
                ]
            }
        },
        {
            "name": "[variables('networkInterfaceName')]",
            "type": "Microsoft.Network/networkInterfaces",
            "apiVersion": "2018-11-01",
            "location": "[parameters('location')]",
            "dependsOn": [
                "[resourceId('Microsoft.Network/publicIPAddresses', variables('publicIPAddressName'))]",
                "[resourceId('Microsoft.Network/virtualNetworks', variables('virtualNetworkName'))]",
                "[resourceId('Microsoft.Network/networkSecurityGroups', variables('networkSecurityGroupName'))]"
            ],
            "properties": {
                "ipConfigurations": [
                    {
                        "name": "ipconfig1",
                        "properties": {
                            "subnet": {
                                "id": "[resourceId('Microsoft.Network/virtualNetworks/subnets', variables('virtualNetworkName'), variables('subnetName'))]"
                            },
                            "privateIPAllocationMethod": "Dynamic",
                            "publicIpAddress": {
                                "id": "[resourceId('Microsoft.Network/publicIpAddresses', variables('publicIpAddressName'))]"
                            }
                        }
                    }
                ],
                "networkSecurityGroup": {
                    "id": "[resourceId('Microsoft.Network/networkSecurityGroups', variables('networkSecurityGroupName'))]"
                }
            }
        },
        {
            "name": "[variables('publicIpAddressName')]",
            "type": "Microsoft.Network/publicIpAddresses",
            "apiVersion": "2018-11-01",
            "location": "[parameters('location')]",
            "properties": {
                "publicIpAllocationMethod": "[variables('publicIpAddressType')]"
            }
        },
        {
            "name": "[variables('networkSecurityGroupName')]",
            "type": "Microsoft.Network/networkSecurityGroups",
            "apiVersion": "2018-11-01",
            "location": "[parameters('location')]",
            "properties": {
                "securityRules": [
                    {
                        "name": "default-allow-rdp",
                        "properties": {
                            "priority": 1000,
                            "sourceAddressPrefix": "*",
                            "protocol": "Tcp",
                            "destinationPortRange": "3389",
                            "access": "Allow",
                            "direction": "Inbound",
                            "sourcePortRange": "*",
                            "destinationAddressPrefix": "*"
                        }
                    },
                    {
                        "name": "HTTP-In",
                        "properties": {
                            "priority": 1010,
                            "sourceAddressPrefix": "*",
                            "protocol": "Tcp",
                            "destinationPortRange": "80",
                            "access": "Allow",
                            "direction": "Inbound",
                            "sourcePortRange": "*",
                            "destinationAddressPrefix": "*"
                        }
                    },
                    {
                        "name": "HTTPS-In",
                        "properties": {
                            "priority": 1020,
                            "sourceAddressPrefix": "*",
                            "protocol": "Tcp",
                            "destinationPortRange": "443",
                            "access": "Allow",
                            "direction": "Inbound",
                            "sourcePortRange": "*",
                            "destinationAddressPrefix": "*"
                        }
                    },
                    {
                        "name": "SSH-In",
                        "properties": {
                            "priority": 1030,
                            "sourceAddressPrefix": "*",
                            "protocol": "Tcp",
                            "destinationPortRange": "22",
                            "access": "Allow",
                            "direction": "Inbound",
                            "sourcePortRange": "*",
                            "destinationAddressPrefix": "*"
                        }
                    },
                    {
                        "name": "FTP-In",
                        "properties": {
                            "priority": 1040,
                            "sourceAddressPrefix": "*",
                            "protocol": "Tcp",
                            "destinationPortRange": "21",
                            "access": "Allow",
                            "direction": "Inbound",
                            "sourcePortRange": "*",
                            "destinationAddressPrefix": "*"
                        }
                    },
                    {
                        "name": "FTP-Implicit-In",
                        "properties": {
                            "priority": 1050,
                            "sourceAddressPrefix": "*",
                            "protocol": "Tcp",
                            "destinationPortRange": "990",
                            "access": "Allow",
                            "direction": "Inbound",
                            "sourcePortRange": "*",
                            "destinationAddressPrefix": "*"
                        }
                    },
                    {
                        "name": "FTP-Data-In",
                        "properties": {
                            "priority": 1060,
                            "sourceAddressPrefix": "*",
                            "protocol": "Tcp",
                            "destinationPortRange": "3000-3100",
                            "access": "Allow",
                            "direction": "Inbound",
                            "sourcePortRange": "*",
                            "destinationAddressPrefix": "*"
                        }
                    },
                    {
                        "name": "FTP-Explicit-CC-In",
                        "properties": {
                            "priority": 1070,
                            "sourceAddressPrefix": "*",
                            "protocol": "Tcp",
                            "destinationPortRange": "10021",
                            "access": "Allow",
                            "direction": "Inbound",
                            "sourcePortRange": "*",
                            "destinationAddressPrefix": "*"
                        }
                    },
                    {
                        "name": "FTP-Implicit-CC-In",
                        "properties": {
                            "priority": 1080,
                            "sourceAddressPrefix": "*",
                            "protocol": "Tcp",
                            "destinationPortRange": "10990",
                            "access": "Allow",
                            "direction": "Inbound",
                            "sourcePortRange": "*",
                            "destinationAddressPrefix": "*"
                        }
                    }
                ]
            }
        }
    ],
    "outputs": {
        "adminUsername": {
            "type": "string",
            "value": "[parameters('adminUsername')]"
        }
    }
}

Теперь мы будем работать с файлом параметров, чтобы ссылаться на все значения в развертывании, а не передавать их вручную во время развертывания.

5. MOVEit — файл параметров

В файле параметров мы определим все фактические значения для решения. Сюда входит весь список параметров, определенных на шаге 1.

Важное примечание:

  • Имя пользователя виртуальной машины должно быть «miadmin».
  • Вы можете использовать другую конфигурацию для SMTP-сервера.

В приведенном ниже коде показано определение файла параметров.

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "location": {
            "value": "westus2"
        },
        "virtualMachineSize": {
            "value": "Standard_DS2_v2"
        },
        "adminUsername": {
            "value": "miadmin"
        },
        "adminPassword": {
            "value": "YourPassword"
        },
        "ci_custFirstName": {
            "value": "dave"
        },
        "ci_custLastName": {
            "value": "rendon"
        },
        "ci_custCompanyName": {
            "value": "kemp"
        },
        "ci_custEmail": {
            "value": "YourMailAddress"
        },
        "ci_custPhone": {
            "value": "34729220191"
        },
        "ci_custCity": {
            "value": "NYC"
        },
        "ci_custState": {
            "value": "NYC"
        },
        "ci_custCountry": {
            "value": "United States"
        },
        "mi_sysadminPassword": {
            "value": "YourPassword"
        },
        "mi_emailTo": {
            "value": "YourMailAddress"
        },
        "mi_emailFrom": {
            "value": "YourMailAddress"
        },
        "mi_smtpHost": {
            "value": "smtp.office365.com"
        },
        "mi_smtpPort": {
            "value": "587"
        },
        "mi_smtpUsername": {
            "value": "YourMailAddress"
        },
        "mi_smtpPassword": {
            "value": "YourPassword"
        }
    }
}

Теперь приступим к развертыванию этого решения.

6. Разверните MOVEit с помощью шаблона ARM.

Прежде чем развертывать это решение, мы должны принять юридические условия образа виртуальной машины.

Чтобы прочитать и принять юридические условия, вы можете использовать PowerShell для принятия условий с помощью приведенного ниже командлета:

Get-AzMarketplaceTerms `
-Publisher 'progresssoftwarecorporation' `
-Product 'moveit-automation-vm' `
-Name 'moveit-automation-starter' |
Set-AzMarketplaceTerms -Accept

На изображении ниже показан вывод приведенной выше команды.

Как только мы примем юридический термин, мы развернем шаблон ARM.

Перед этим развертыванием мы создали группу ресурсов под названием «MOVEit».

Мы будем использовать следующий командлет для проверки и развертывания шаблона ARM.

$date = Get-Date -Format "MM-dd-yyyy"
$deploymentName = "AzInsiderDeployment"+"$date"
New-AzResourceGroupDeployment -Name $deploymentName -ResourceGroupName MOVEit -TemplateFile .\azuredeploy.json -TemplateParameterFile .\azuredeploy.parameters.json -c

Обратите внимание, что мы используем флаг -c для проверки шаблона ARM с функциональностью What-IF. Подробнее о WhatIF можно прочитать здесь.

На изображении ниже показан процесс проверки шаблона ARM.

Как вы можете видеть на изображении выше, операция «что, если» позволит вам увидеть, как изменятся ресурсы, если вы развернете шаблон. Теперь мы подтвердим выполнение развертывания.

На изображении ниже показан результат операции развертывания.

Развертывание этого решения занимает около 14 минут, поскольку оно развертывает ресурсы, а также выполняет настраиваемый сценарий.

Теперь мы можем получить доступ к виртуальной машине, используя HTTPS://VMPublicIPAddress.

Затем вы должны увидеть начальную панель инструментов.

Надеюсь, это поможет вам лучше понять, как можно развернуть MOVEit с помощью шаблонов ARM.

Присоединяйтесь к списку рассылки AzInsider здесь.

-Дэйв Р.