Узнайте, как развернуть GitHub Enterprise Server в Azure с помощью инфраструктуры как кода.

В этой статье мы будем использовать Bicep, новый язык для декларативного развертывания ресурсов Azure, и создадим шаблон Bicep для развертывания GitHub Enterprise Server.

Мы выполним следующие шаги:

  1. Создать пару ключей SSH
  2. Создайте наш шаблон бицепса
  3. Развернуть шаблон бицепса

1. Создайте пару ключей SSH

Первый шаг — создать пару ключей SSH; вы можете прочитать следующую статью о том, как создать пару ключей SSH для виртуальных машин Linux в Azure — https://docs.microsoft.com/en-us/azure/virtual-machines/linux/mac-create-ssh-keys »

В этом случае мы создадим пару ключей SSH с помощью консоли Azure Bash. На портале Azure запросите новую консоль, как показано на изображении ниже.

Затем мы сгенерируем SSH-ключ, используя следующую команду:

ssh-keygen \
    -m PEM \
    -t rsa \
    -b 4096 \
    -C "github-enterprise" \
    -f ~/.ssh/ge-priv-key \
    -N yourpasshphrase

Это сгенерирует ключ в каталоге SSH в вашем файловом ресурсе:

Если вы не знакомы с форматом открытого ключа SSH, вы можете отобразить свой открытый ключ с помощью следующей команды cat, заменив «~/.ssh/id_rsa.pub» на путь и имя файла. вашего собственного файла открытого ключа, если необходимо:

cat ~/.ssh/ge-priv-key.pub

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

Прохладный! Теперь у нас есть пара ключей SSH.

2. Шаблон Azure Bicep — параметры

Мы определим запуск, определив параметры виртуальной машины.

В приведенном ниже коде показаны параметры, которые будут использоваться для этого развертывания:

@description('Unique prefix for your Storage Account and VM name. Must be all lower case letters or numbers. No spaces or special characters.')
param accountPrefix string
@description('Username for the VM. This value is ignored.')
param adminUsername string
@description('VM Size. Select an ES v3 Series VM with at least 32 GB of RAM. Default value: Standard_E4s_v3')
param vmSize string = 'Standard_E4s_v3'
@description('Select a Premium Storage disk capacity for your source code, in GB. Default value: 512.')
param storageDiskSizeGB int = 512
@allowed([
  'sshPublicKey'
  'password'
])
@description('Type of authentication to use on the Virtual Machine. SSH key is recommended.')
param authenticationType string = 'sshPublicKey'
@description('SSH Key or password for the Virtual Machine. SSH key is recommended.')
@secure()
param adminPasswordOrKey string
@description('Location for all resources.')
param location string = resourceGroup().location

Обратите внимание, что мы используем декоратор “@secure()” для безопасной передачи ключа SSH. Я рекомендую вам прочитать эту статью о том, как использовать декоратор @secure() для безопасной передачи секретов в параметрах.

3. Шаблон Azure Bicep — переменные

Далее мы определим следующие переменные:

var imagePublisher = 'GitHub'
var imageOffer = 'GitHub-Enterprise'
var OSDiskName = 'osdiskforlinuxsimple'
var nicName_var = '${replace(replace(accountPrefix, '.', ''), '_', '-')}-nic'
var addressPrefix = '10.0.0.0/16'
var subnetName = 'Subnet'
var subnetPrefix = '10.0.0.0/24'
var storageAccountType = 'Premium_LRS'
var storageAccountName_var = '${replace(replace(replace(accountPrefix, '.', ''), '_', ''), '-', '')}data'
var publicIPAddressName_var = '${replace(replace(accountPrefix, '.', ''), '_', '-')}-pub-ip'
var publicIPAddressType = 'Dynamic'
var dnsNameForPublicIP = '${accountPrefix}-ghe'
var vmName_var = '${replace(replace(accountPrefix, '.', ''), '_', '-')}-ghe-vm'
var virtualNetworkName_var = '${replace(replace(accountPrefix, '.', ''), '_', '-')}-vnet'
var networkSecurityGroupName_var = '${replace(replace(accountPrefix, '.', ''), '_', '-')}-nsg'
var subnetRef = resourceId('Microsoft.Network/virtualNetworks/subnets', virtualNetworkName_var, subnetName)
var dataDiskName = 'ghe-data'
var linuxConfiguration = {
  disablePasswordAuthentication: true
  ssh: {
    publicKeys: [
      {
        path: '/home/${adminUsername}/.ssh/authorized_keys'
        keyData: adminPasswordOrKey
      }
    ]
  }
}

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

4. Шаблон Azure Bicep — ресурсы

Теперь мы определим ресурсы следующим образом:

resource storageAccountName 'Microsoft.Storage/storageAccounts@2021-01-01' = {
  name: storageAccountName_var
  location: location
  sku: {
    name: storageAccountType
  }
  kind: 'StorageV2'
}
resource publicIPAddressName 'Microsoft.Network/publicIPAddresses@2020-05-01' = {
  name: publicIPAddressName_var
  location: location
  properties: {
    publicIPAllocationMethod: publicIPAddressType
    dnsSettings: {
      domainNameLabel: dnsNameForPublicIP
    }
  }
}
resource virtualNetworkName 'Microsoft.Network/virtualNetworks@2020-05-01' = {
  name: virtualNetworkName_var
  location: location
  properties: {
    addressSpace: {
      addressPrefixes: [
        addressPrefix
      ]
    }
    subnets: [
      {
        name: subnetName
        properties: {
          addressPrefix: subnetPrefix
          networkSecurityGroup: {
            id: networkSecurityGroupName.id
          }
        }
      }
    ]
  }
}
resource nicName 'Microsoft.Network/networkInterfaces@2020-05-01' = {
  name: nicName_var
  location: location
  properties: {
    ipConfigurations: [
      {
        name: 'ipconfig1'
        properties: {
          privateIPAllocationMethod: 'Dynamic'
          publicIPAddress: {
            id: publicIPAddressName.id
          }
          subnet: {
            id: subnetRef
          }
        }
      }
    ]
  }
  dependsOn: [
    virtualNetworkName
  ]
}
resource vmName 'Microsoft.Compute/virtualMachines@2019-12-01' = {
  name: vmName_var
  location: location
  properties: {
    hardwareProfile: {
      vmSize: vmSize
    }
    osProfile: {
      computerName: vmName_var
      adminUsername: adminUsername
      adminPassword: adminPasswordOrKey
      linuxConfiguration: ((authenticationType == 'password') ? json('null') : linuxConfiguration)
    }
    storageProfile: {
      imageReference: {
        publisher: imagePublisher
        offer: imageOffer
        sku: imageOffer
        version: 'latest'
      }
      osDisk: {
        name: '${OSDiskName}_OSDisk'
        caching: 'ReadWrite'
        createOption: 'FromImage'
      }
      dataDisks: [
        {
          name: '${dataDiskName}_DataDisk1'
          diskSizeGB: storageDiskSizeGB
          createOption: 'Empty'
          lun: 0
        }
      ]
    }
    networkProfile: {
      networkInterfaces: [
        {
          id: nicName.id
        }
      ]
    }
  }
  dependsOn: [
    storageAccountName
  ]
}
resource networkSecurityGroupName 'Microsoft.Network/networkSecurityGroups@2020-05-01' = {
  name: networkSecurityGroupName_var
  location: location
  properties: {
    securityRules: [
      {
        name: 'https_8443'
        properties: {
          description: 'https'
          protocol: '*'
          sourcePortRange: '*'
          destinationPortRange: '8443'
          sourceAddressPrefix: 'Internet'
          destinationAddressPrefix: '*'
          access: 'Allow'
          priority: 100
          direction: 'Inbound'
        }
      }
      {
        name: 'http_8080'
        properties: {
          description: 'http plain text'
          protocol: '*'
          sourcePortRange: '*'
          destinationPortRange: '8080'
          sourceAddressPrefix: 'Internet'
          destinationAddressPrefix: '*'
          access: 'Allow'
          priority: 101
          direction: 'Inbound'
        }
      }
      {
        name: 'ssh_port_122'
        properties: {
          description: 'Allow admin SSH'
          protocol: '*'
          sourcePortRange: '*'
          destinationPortRange: '122'
          sourceAddressPrefix: 'Internet'
          destinationAddressPrefix: '*'
          access: 'Allow'
          priority: 102
          direction: 'Inbound'
        }
      }
      {
        name: 'vpn_1194'
        properties: {
          description: 'Allow VPN'
          protocol: '*'
          sourcePortRange: '*'
          destinationPortRange: '1194'
          sourceAddressPrefix: 'Internet'
          destinationAddressPrefix: '*'
          access: 'Allow'
          priority: 103
          direction: 'Inbound'
        }
      }
      {
        name: 'snmp_161'
        properties: {
          description: 'Allow SNMP'
          protocol: '*'
          sourcePortRange: '*'
          destinationPortRange: '161'
          sourceAddressPrefix: 'Internet'
          destinationAddressPrefix: '*'
          access: 'Allow'
          priority: 104
          direction: 'Inbound'
        }
      }
      {
        name: 'https_443'
        properties: {
          description: 'Allow HTTPS'
          protocol: '*'
          sourcePortRange: '*'
          destinationPortRange: '443'
          sourceAddressPrefix: 'Internet'
          destinationAddressPrefix: '*'
          access: 'Allow'
          priority: 105
          direction: 'Inbound'
        }
      }
      {
        name: 'http_80'
        properties: {
          description: 'Allow HTTP'
          protocol: '*'
          sourcePortRange: '*'
          destinationPortRange: '80'
          sourceAddressPrefix: 'Internet'
          destinationAddressPrefix: '*'
          access: 'Allow'
          priority: 106
          direction: 'Inbound'
        }
      }
      {
        name: 'ssh_22'
        properties: {
          description: 'Allow Git SSH'
          protocol: '*'
          sourcePortRange: '*'
          destinationPortRange: '22'
          sourceAddressPrefix: 'Internet'
          destinationAddressPrefix: '*'
          access: 'Allow'
          priority: 107
          direction: 'Inbound'
        }
      }
      {
        name: 'git_9418'
        properties: {
          description: 'Allow Git'
          protocol: '*'
          sourcePortRange: '*'
          destinationPortRange: '9418'
          sourceAddressPrefix: 'Internet'
          destinationAddressPrefix: '*'
          access: 'Allow'
          priority: 108
          direction: 'Inbound'
        }
      }
      {
        name: 'smtp_25'
        properties: {
          description: 'Allow SMTP'
          protocol: '*'
          sourcePortRange: '*'
          destinationPortRange: '25'
          sourceAddressPrefix: 'Internet'
          destinationAddressPrefix: '*'
          access: 'Allow'
          priority: 109
          direction: 'Inbound'
        }
      }
    ]
  }
}

Наконец, мы передадим файл параметров.

5. Файл параметров.

Файл параметров будет содержать всего несколько параметров для имени ресурсов, размера диска и ключа SSH. Создайте этот новый файл и сохраните его как azuredeploy.parameters.json.

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
      "accountPrefix": {
        "value": "azinsider"
      },
      "vmSize": {
        "value": "Standard_E4s_v3"
      },
      "storageDiskSizeGB": {
        "value": 512
      },
      "adminUsername": {
        "value": "azureuser"
      },
      "adminPasswordOrKey": {
        "value": "ssh-rsa AAAAB3NzaC1yc2...== github-enterprise"
      }
    }
  }

Вот полный шаблон бицепса:

6. Развертывание Azure Bicep

В качестве наилучшей практики я рекомендую предварительно просмотреть развертывание с помощью флага -C. Мы будем использовать приведенную ниже команду, чтобы включить предварительный просмотр развертывания:

New-AzResourceGroupDeployment -Name $deploymentName -ResourceGroupName azinsider-ge -TemplateFile .\main.bicep -TemplateParameterFile .\azuredeploy.parameters.json -c

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

На изображении ниже показан предварительный просмотр развертывания:

Как только все будет правильно настроено, мы приступим к развертыванию. На рисунке ниже показан результат развертывания:

Вы также можете перейти на портал Azure и проверить все ресурсы, созданные из этого развертывания, как показано ниже:

Я надеюсь, что эта статья поможет вам в вашем путешествии с Bicep и в том, как вы можете использовать Bicep для развертывания GitHub Enterprise Server в Azure.

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

-Дэйв Р.