Introdução ao SAP Deployment Automation Framework

Comece rapidamente com o SAP Deployment Automation Framework.

Pré-requisitos

Para começar a usar o SAP Deployment Automation Framework, você precisa:

  • Uma subscrição do Azure. Se não tiver uma subscrição do Azure, pode criar uma conta gratuita.
  • Uma conta de usuário SAP com permissões para baixar o software SAP em seu ambiente do Azure. Para obter mais informações sobre S-User, consulte SAP S-User.
  • Uma instalação da CLI do Azure.
  • Uma Identidade Atribuída (MS) do usuário ou uma entidade de serviço a ser usada para a implantação do plano de controle.
  • Uma Identidade Atribuída (MS) de usuário ou uma entidade de serviço a ser usada para a implantação da zona de carga de trabalho.
  • Uma capacidade de criar um projeto do Azure DevOps se você quiser usar o Azure DevOps para implantação.

Alguns dos pré-requisitos podem já estar instalados em seu ambiente de implantação. O Azure Cloud Shell e o implantador vêm com o Terraform e a CLI do Azure instalados.

Criar uma Identidade atribuída ao usuário

A estrutura de implantação de automação SAP também pode usar uma identidade atribuída ao usuário (MSI) para a implantação. Certifique-se de usar uma conta com permissões para criar identidades gerenciadas ao executar o script que cria a identidade.

  1. Crie a identidade gerenciada.

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

    Reveja a saída. Por exemplo:

       {
         "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. Copie os detalhes da saída.

    A saída é mapeada para os seguintes parâmetros. Você usa esses parâmetros em etapas posteriores, com comandos de automação.

    Nome de entrada do parâmetro Nome da saída
    app_id appId
    msi_id armId
    msi_objectid objectId
  3. Atribua a função de Colaborador à identidade.

    export appId="<appId>"
    
    az role assignment create --assignee $msi_objectid  --role "Contributor"  --scope /subscriptions/$ARM_SUBSCRIPTION_ID
    
  4. Opcionalmente, atribua a função de Administrador de Acesso de Usuário à identidade.

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

Importante

Se você não atribuir a função de Administrador de Acesso de Usuário à identidade gerenciada, não poderá atribuir permissões usando a estrutura de automação.

Criar um registro de aplicativo para o aplicativo Web

A estrutura de implantação de automação SAP pode aproveitar um Serviço de Aplicativo do Azure para configurar os arquivos de parâmetro tfvars.

  1. Crie o registro do aplicativo.

       $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"
    
    
    

Criar um principal de serviço

A estrutura de implantação de automação SAP pode usar entidades de serviço para implantação.

Ao escolher um nome para sua entidade de serviço, verifique se o nome é exclusivo em seu locatário do Azure. Certifique-se de usar uma conta com permissões de criação de entidades de serviço ao executar o script.

  1. Crie a entidade de serviço com permissões de Colaborador.

    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"
    

    Reveja a saída. Por exemplo:

    {
        "appId": "<AppId>",
        "displayName": "<environment>-Deployment-Account ",
        "name": "<AppId>",
        "password": "<AppSecret>",
        "tenant": "<TenantId>"
    }
    
  2. Copie os detalhes da saída. Certifique-se de salvar os valores de appId, passworde Tenant.

    A saída é mapeada para os seguintes parâmetros. Você usa esses parâmetros em etapas posteriores, com comandos de automação.

    Nome de entrada do parâmetro Nome da saída
    spn_id appId
    spn_secret password
    tenant_id tenant
  3. Opcionalmente, atribua a função de Administrador de Acesso de Usuário à entidade de serviço.

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

Importante

Se você não atribuir a função de Administrador de Acesso de Usuário à entidade de serviço, não poderá atribuir permissões usando a estrutura de automação.

Verificações antes do voo

Você pode usar o script a seguir para executar verificações antes do voo. O script executa as seguintes verificações e testes:

  • Verifica se a entidade de serviço tem as permissões corretas para criar recursos na assinatura.
  • Verifica se a entidade de serviço tem permissões de Administrador de Acesso do usuário.
  • Crie uma Rede Virtual do Azure.
  • Crie um Cofre de Chave Virtual do Azure com ponto de extremidade privado.
  • Crie um compartilhamento NSF do Azure Files.
  • Crie uma Máquina Virtual do Azure com disco de dados usando o Armazenamento Premium v2.
  • Verifique o acesso às URLs necessárias usando a máquina virtual implantada.

$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
}

Usar o SAP Deployment Automation Framework dos Serviços de DevOps do Azure

Usar o Azure DevOps simplifica o processo de implantação. O Azure DevOps fornece pipelines que você pode executar para executar a implantação da infraestrutura e as atividades de configuração e instalação do SAP.

Você pode usar o Azure Repos para armazenar seus arquivos de configuração. O Azure Pipelines fornece pipelines, que podem ser usados para implantar e configurar a infraestrutura e o aplicativo SAP.

Inscreva-se nos Serviços de DevOps do Azure

Para usar os Serviços de DevOps do Azure, você precisa de uma organização de DevOps do Azure. Uma organização é usada para conectar grupos de projetos relacionados. Utilize a sua conta escolar ou profissional para ligar automaticamente a sua organização à sua ID do Microsoft Entra. Para criar uma conta, abra o Azure DevOps e entre ou crie uma nova conta.

Criar o ambiente do SAP Deployment Automation Framework com o Azure DevOps

Você pode usar o script a seguir para fazer uma instalação básica do Azure DevOps Services for SAP Deployment Automation Framework.

Abra o ISE do PowerShell, copie o script a seguir e atualize os parâmetros para corresponder ao seu ambiente.

    $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

Execute o script e siga as instruções. O script abre janelas do navegador para autenticação e execução de tarefas no projeto Azure DevOps.

Você pode optar por executar o código diretamente do GitHub ou pode importar uma cópia do código para seu projeto de DevOps do Azure.

Para confirmar que o projeto foi criado, vá para o portal do Azure DevOps e selecione o projeto. Certifique-se de que o repositório foi preenchido e que os pipelines foram criados.

Importante

Execute os seguintes passos na estação de trabalho local. Certifique-se também de ter a CLI do Azure mais recente instalada executando o az upgrade comando.

Para obter mais informações sobre como configurar o Azure DevOps for SAP Deployment Automation Framework, consulte Configure Azure DevOps for SAP Deployment Automation Framework.

Criar o ambiente do SAP Deployment Automation Framework sem o Azure DevOps

Você pode executar o SAP Deployment Automation Framework a partir de uma máquina virtual no Azure. As etapas a seguir descrevem como criar o ambiente.

Importante

Verifique se a máquina virtual está usando uma identidade atribuída pelo sistema ou pelo usuário com permissões na assinatura para criar recursos.

Verifique se a máquina virtual tem os seguintes pré-requisitos instalados:

  • git
  • JQ
  • descompactar
  • virtualenv (se estiver rodando no Ubuntu)

Você pode instalar os pré-requisitos em uma máquina virtual Ubuntu usando o seguinte comando:

sudo apt-get install -y git jq unzip virtualenv

Em seguida, você pode instalar os componentes do deployer usando os seguintes comandos:


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

Exemplos

A ~/Azure_SAP_Automated_Deployment/samples pasta contém um conjunto de arquivos de configuração de exemplo para começar a testar a estrutura de automação de implantação. Você pode copiá-los usando os seguintes comandos:

cd ~/Azure_SAP_Automated_Deployment

cp -Rp samples/Terraform/WORKSPACES ~/Azure_SAP_Automated_Deployment

Próximo passo