你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

SAP 部署自动化框架入门

快速入门以使用 SAP 部署自动化框架

先决条件

若要开始使用 SAP 部署自动化框架,你需要:

  • Azure 订阅。 如果没有 Azure 订阅,可以创建一个免费帐户
  • 有权在 Azure 环境中下载 SAP 软件的 SAP 用户帐户。 有关 S-User 的详细信息,请参阅 SAP S-User
  • Azure CLI 安装。
  • 用户分配的标识 (MS) 或服务主体以用于控制平面部署。
  • 用户分配的标识 (MS) 或服务主体,用于工作负载区域部署。
  • 如果要使用 Azure DevOps 进行部署,则可以创建 Azure DevOps 项目。

某些必备组件可能已安装在部署环境中。 Azure Cloud Shell 和部署器都安装了 Terraform 和 Azure CLI。

创建用户分配的标识

SAP 自动化部署框架还可以使用用户分配的标识 (MSI) 进行部署。 运行创建标识的脚本时,请确保使用具有权限的帐户创建托管标识。

  1. 创建托管标识。

    export    ARM_SUBSCRIPTION_ID="<subscriptionId>"
    export control_plane_env_code="LAB"
    
    az identity create --name ${control_plane_env_code}-Deployment-Identity --resource-group <ExistingResourceGroup>
    

    查看输出。 例如:

       {
         "clientId": "<appId>",
         "id": "<armId>",
         "location": "<location>",
         "name": "${control_plane_env_code}-Deployment-Identity",
         "principalId": "<objectId>",
         "resourceGroup": "<ExistingResourceGroup>",
         "systemData": null,
         "tags": {},
         "tenantId": "<TenantId>",
         "type": "Microsoft.ManagedIdentity/userAssignedIdentities"
       }
    
  2. 复制输出详细信息。

    输出映射到以下参数。 可在后面的步骤中将这些参数与自动化命令一起使用。

    参数输入名称 输出名称
    app_id appId
    msi_id armId
    msi_objectid objectId
  3. 将参与者角色分配给标识。

    export appId="<appId>"
    
    az role assignment create --assignee $msi_objectid  --role "Contributor"  --scope /subscriptions/$ARM_SUBSCRIPTION_ID
    
  4. (可选)将“用户访问管理员”角色分配给标识。

    export appId="<appId>"
    
    az role assignment create --assignee $msi_objectid --role "User Access Administrator"  --scope /subscriptions/$ARM_SUBSCRIPTION_ID
    

重要

如果未将用户访问管理员角色分配给托管标识,则无法使用自动化框架来分配权限。

为 Web 应用程序创建应用程序注册

SAP 自动化部署框架可以利用 Azure 应用服务来配置 tfvars 参数文件。

  1. 创建应用程序注册。

       $ApplicationName="<App Registration Name>"
       $MSI_objectId="<msi_objectid>"
    
        Write-Host "Creating an App Registration for" $ApplicationName -ForegroundColor Green
    
        if (Test-Path $manifestPath) { Write-Host "Removing manifest.json" ; Remove-Item $manifestPath }
        Add-Content -Path manifest.json -Value '[{"resourceAppId":"00000003-0000-0000-c000-000000000000","resourceAccess":[{"id":"e1fe6dd8-ba31-4d61-89e7-88639da4683d","type":"Scope"}]}]'
    
        $APP_REGISTRATION_ID = $(az ad app create --display-name $ApplicationName --enable-id-token-issuance true --sign-in-audience AzureADMyOrg --required-resource-access $manifestPath --query "appId" --output tsv)
    
        Write-Host "App Registration created with App ID: $APP_REGISTRATION_ID"
    
        Write-Host "Waiting for the App Registration to be created" -ForegroundColor Green
        Start-Sleep -s 20
    
        $ExistingData = $(az ad app list --all --filter "startswith(displayName, '$ApplicationName')" --query  "[?displayName=='$ApplicationName']| [0]" --only-show-errors) | ConvertFrom-Json
    
        $APP_REGISTRATION_OBJECTID = $ExistingData.id
    
        if (Test-Path $manifestPath) { Write-Host "Removing manifest.json" ; Remove-Item $manifestPath }
    
        Write-Host "Configuring authentication for the App Registration" -ForegroundColor Green
        az rest --method POST --uri "https://graph.microsoft.com/beta/applications/$APP_REGISTRATION_OBJECTID/federatedIdentityCredentials\" --body "{'name': 'ManagedIdentityFederation', 'issuer': 'https://login.microsoftonline.com/$ARM_TENANT_ID/v2.0', 'subject': '$MSI_objectId', 'audiences': [ 'api://AzureADTokenExchange' ]}"
    
        $API_URL="https://portal.azure.com/#view/Microsoft_AAD_RegisteredApps/ApplicationMenuBlade/~/ProtectAnAPI/appId/$APP_REGISTRATION_ID/isMSAApp~/false"
    
        Write-Host "The browser will now open, Please Add a new scope, by clicking the '+ Add a new scope link', accept the default name and click 'Save and Continue'"
        Write-Host "In the Add a scope page enter the scope name 'user_impersonation'. Choose 'Admins and Users' in the who can consent section, next provide the Admin consent display name 'Access the SDAF web application' and 'Use SDAF' as the Admin consent description, accept the changes by clicking the 'Add scope' button"
    
        Start-Process $API_URL
        Read-Host -Prompt "Once you have created and validated the scope, Press any key to continue"
    
    
    

创建服务主体

SAP 自动化部署框架可以使用服务主体进行部署。

在选择服务主体的名称时,请确保该名称在 Azure 租户中是唯一的。 运行脚本时,请确保使用具有服务主体创建权限的帐户。

  1. 创建具有参与者权限的服务主体。

    export    ARM_SUBSCRIPTION_ID="<subscriptionId>"
    export control_plane_env_code="LAB"
    
    az ad sp create-for-rbac --role="Contributor"  --scopes="/subscriptions/$ARM_SUBSCRIPTION_ID"   --name="$control_plane_env_code-Deployment-Account"
    

    查看输出。 例如:

    {
        "appId": "<AppId>",
        "displayName": "<environment>-Deployment-Account ",
        "name": "<AppId>",
        "password": "<AppSecret>",
        "tenant": "<TenantId>"
    }
    
  2. 复制输出详细信息。 确保保存 appIdpasswordTenant 的值。

    输出映射到以下参数。 可在后面的步骤中将这些参数与自动化命令一起使用。

    参数输入名称 输出名称
    spn_id appId
    spn_secret password
    tenant_id tenant
  3. (可选)将“用户访问管理员”角色分配给服务主体。

    export appId="<appId>"
    
    az role assignment create --assignee $appId --role "User Access Administrator"  --scope /subscriptions/$ARM_SUBSCRIPTION_ID
    

重要

如果未将用户访问管理员角色分配给服务主体,则无法使用自动化框架来分配权限。

外部测试版检查

可以使用以下脚本执行外部测试前检查。 该脚本将执行以下检查和测试:

  • 检查服务主体是否具有在订阅中创建资源的正确权限。
  • 检查服务主体是否具有用户访问管理员权限。
  • 创建 Azure 虚拟网络。
  • 创建具有专用终结点的 Azure 虚拟密钥保管库。
  • 创建 Azure 文件存储 NSF 共享。
  • 创建包含使用高级存储 v2 的数据磁盘的 Azure 虚拟机。
  • 使用已部署的虚拟机检查对所需 URL 的访问权限。

$sdaf_path = Get-Location
if ( $PSVersionTable.Platform -eq "Unix") {
    if ( -Not (Test-Path "SDAF") ) {
      $sdaf_path = New-Item -Path "SDAF" -Type Directory
    }
}
else {
    $sdaf_path = Join-Path -Path $Env:HOMEDRIVE -ChildPath "SDAF"
    if ( -not (Test-Path $sdaf_path)) {
        New-Item -Path $sdaf_path -Type Directory
    }
}

Set-Location -Path $sdaf_path

git clone https://github.com/Azure/sap-automation.git 

cd sap-automation
cd deploy
cd scripts

if ( $PSVersionTable.Platform -eq "Unix") {
./Test-SDAFReadiness.ps1
}
else {
.\Test-SDAFReadiness.ps1
}

从 Azure DevOps 服务使用 SAP 部署自动化框架

使用 Azure DevOps 简化部署过程。 Azure DevOps 提供可用于执行基础结构部署和配置和 SAP 安装活动的管道。

可以使用 Azure Repos 来存储配置文件。 Azure Pipelines 提供管道,可用于部署和配置基础结构和 SAP 应用程序。

注册 Azure DevOps 服务

若要使用 Azure DevOps 服务,则需要一个 Azure DevOps 组织。 组织用于连接相关项目组。 使用工作或学校帐户将组织自动连接到 Microsoft Entra ID。 若要创建帐户,打开 Azure DevOps 并登录或创建新帐户。

使用 Azure DevOps 创建 SAP 部署自动化框架环境

可以使用以下脚本为 SAP 部署自动化框架执行 Azure DevOps Services 的基本安装。

打开 PowerShell ISE 并复制以下脚本,并更新参数以匹配你的环境。

    $Env:SDAF_ADO_ORGANIZATION = "https://dev.azure.com/ORGANIZATIONNAME"
    $Env:SDAF_ADO_PROJECT = "SAP Deployment Automation Framework"
    $Env:SDAF_CONTROL_PLANE_CODE = "MGMT"
    $Env:SDAF_WORKLOAD_ZONE_CODE = "DEV"
    $Env:SDAF_ControlPlaneSubscriptionID = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
    $Env:SDAF_WorkloadZoneSubscriptionID = "yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy"
    $Env:ARM_TENANT_ID="zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz"

    $UniqueIdentifier = Read-Host "Please provide an identifier that makes the service principal names unique, for instance a project code"

    $confirmation = Read-Host "Do you want to create a new Application registration (needed for the Web Application) y/n?"
    if ($confirmation -eq 'y') {
        $Env:SDAF_APP_NAME = $UniqueIdentifier + " SDAF Control Plane"
    }

    else {
      $Env:SDAF_APP_NAME = Read-Host "Please provide the Application registration name"
    }

    $confirmation = Read-Host "Do you want to create a new Service Principal for the Control plane y/n?"
    if ($confirmation -eq 'y') {
        $Env:SDAF_MGMT_SPN_NAME = $UniqueIdentifier + " SDAF " + $Env:SDAF_CONTROL_PLANE_CODE + " SPN"
    }
        else {
      $Env:SDAF_MGMT_SPN_NAME = Read-Host "Please provide the Control Plane Service Principal Name"
    }

    $confirmation = Read-Host "Do you want to create a new Service Principal for the Workload zone y/n?"
    if ($confirmation -eq 'y') {
        $Env:SDAF_WorkloadZone_SPN_NAME = $UniqueIdentifier + " SDAF " + $Env:SDAF_WORKLOAD_ZONE_CODE + " SPN"
    }
        else {
      $Env:SDAF_WorkloadZone_SPN_NAME = Read-Host "Please provide the Workload Zone Service Principal Name"
    }

    if ( $PSVersionTable.Platform -eq "Unix") {
        if ( Test-Path "SDAF") {
        }
        else {
            $sdaf_path = New-Item -Path "SDAF" -Type Directory
        }
    }
    else {
        $sdaf_path = Join-Path -Path $Env:HOMEDRIVE -ChildPath "SDAF"
        if ( Test-Path $sdaf_path) {
        }
        else {
            New-Item -Path $sdaf_path -Type Directory
        }
    }

    Set-Location -Path $sdaf_path

    if ( Test-Path "New-SDAFDevopsProject.ps1") {
        remove-item .\New-SDAFDevopsProject.ps1
    }

    Invoke-WebRequest -Uri https://raw.githubusercontent.com/Azure/sap-automation/main/deploy/scripts/New-SDAFDevopsProject.ps1 -OutFile .\New-SDAFDevopsProject.ps1 ; .\New-SDAFDevopsProject.ps1

运行该脚本并按照说明操作。 该脚本将打开浏览器窗口以进行身份验证,并在 Azure DevOps 项目中执行任务。

可以选择直接从 GitHub 运行代码,也可以将代码的副本导入 Azure DevOps 项目。

若要确认项目已创建,请转到 Azure DevOps 门户并选择该项目。 确保已填充存储库,并创建管道。

重要

在本地工作站上运行以下步骤。 另请运行 az upgrade 命令,确保已安装最新的 Azure CLI。

有关如何为 SAP 部署自动化框架配置 Azure DevOps 的详细信息,请参阅为 SAP 部署自动化框架配置 Azure DevOps

不使用 Azure DevOps 创建 SAP 部署自动化框架环境

可以从 Azure 中的虚拟机运行 SAP 部署自动化框架。 下面逐步介绍了如何创建该环境。

重要

确保虚拟机使用系统分配的标识或用户分配的标识,并具有订阅创建资源的权限。

确保虚拟机已安装以下先决条件:

  • git
  • jq
  • unzip
  • virtualenv (如果在 Ubuntu 上运行)

可以使用以下命令在 Ubuntu 虚拟机上安装必备组件:

sudo apt-get install -y git jq unzip virtualenv

然后,可以使用以下命令安装部署程序组件:


wget https://raw.githubusercontent.com/Azure/sap-automation/main/deploy/scripts/configure_deployer.sh -O configure_deployer.sh
chmod +x ./configure_deployer.sh
./configure_deployer.sh

# Source the new variables

. /etc/profile.d/deploy_server.sh

示例

~/Azure_SAP_Automated_Deployment/samples 包含一组示例配置文件,用于开始测试部署自动化框架。 可以使用以下命令复制它们:

cd ~/Azure_SAP_Automated_Deployment

cp -Rp samples/Terraform/WORKSPACES ~/Azure_SAP_Automated_Deployment

后续步骤