Condividi tramite


Distribuire il piano di controllo

Il piano di controllo è l'infrastruttura di distribuzione per SAP Deployment Automation Framework (SDAF). Fornisce gli agenti di distribuzione, l'archiviazione dello stato e la gestione delle credenziali necessaria al framework per effettuare il provisioning e la configurazione degli ambienti SAP su Azure.

Senza un piano di controllo, non è possibile eseguire i flussi di lavoro Terraform e Ansible che distribuiscono sistemi e zone di carico di lavoro SAP. La configurazione del piano di controllo è il primo passaggio di distribuzione nel framework.

In questo articolo si preparano le credenziali di distribuzione, si configurano i componenti di distribuzione e di libreria SAP ed si eseguono gli script che creano le risorse del piano di controllo nella sottoscrizione di Azure.

Diagramma che mostra il piano di controllo per SAP Deployment Automation Framework.

Prerequisiti

  • Una sottoscrizione di Azure. Se non hai una sottoscrizione di Azure, crea un account gratuito.
  • Autorizzazioni per creare entità servizio o identità gestite per la sottoscrizione.
  • Azure CLI installata su una workstation Linux o accesso ad Azure DevOps.

Preparare le credenziali di distribuzione

SDAF usa identità gestite (scelta consigliata) o entità servizio per le distribuzioni.

  1. Creare le credenziali di autenticazione per la distribuzione del piano di controllo. Usare un account con autorizzazioni per creare entità servizio.

    Per creare un'entità servizio:

    az ad sp create-for-rbac --role="Contributor" --scopes="/subscriptions/<subscriptionID>" --name="<environment>-Deployment-Account"
    

    Per creare un'identità gestita:

    az identity create --name "<environment>-Deployment-Identity" --resource-group $ResourceGroupName --location $Location --query "{id:id, principalId:principalId, clientId:clientId}"
    
    az role assignment create --assignee-object-id <principalId> --role "Contributor" --scope /subscriptions/<subscriptionID>
    

    Importante

    Il nome del principale del servizio deve essere univoco.

    Registrare i valori di output dal comando :

    • ID dell'app
    • parola d’ordine
    • tenant
  2. Facoltativamente, assegnare il ruolo Amministratore accesso utenti all'entità servizio o all'identità gestita:

    az role assignment create --assignee <appId> --role "User Access Administrator" --scope /subscriptions/<subscriptionID>
    

    Per definire l'ambito del ruolo a un gruppo di risorse specifico, usare invece il comando seguente:

    az role assignment create --assignee <appId> --role "User Access Administrator" --scope /subscriptions/<subscriptionID>/resourceGroups/<resourceGroupName>
    

Eseguire la distribuzione del piano di controllo

Tutti gli artefatti necessari per distribuire il piano di controllo si trovano nei repository GitHub. Clonare i repository per preparare la distribuzione del piano di controllo:

mkdir -p ~/Azure_SAP_Automated_Deployment; cd $_

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

git clone https://github.com/Azure/sap-automation-samples.git samples
  • Il file MGMT-WEEU-DEP00-INFRASTRUCTURE.tfvars di configurazione del deployer di esempio si trova nella ~/Azure_SAP_Automated_Deployment/samples/Terraform/WORKSPACES/DEPLOYER/MGMT-WEEU-DEP00-INFRASTRUCTURE cartella .

  • Il file MGMT-WEEU-SAP_LIBRARY.tfvars di configurazione della libreria SAP di esempio si trova nella ~/Azure_SAP_Automated_Deployment/samples/Terraform/WORKSPACES/LIBRARY/MGMT-WEEU-SAP_LIBRARY cartella .

È possibile copiare i file di configurazione di esempio per avviare il test del framework.

Un file Terraform minimo per DEPLOYER potrebbe essere simile al seguente esempio:

# The environment value is a mandatory field, it is used for partitioning the environments.
environment = "MGMT"
# The location/region value is a mandatory field, it is used to control where the resources are deployed
location = "westeurope"

# management_network_address_space is the address space for management virtual network
management_network_address_space = "10.10.20.0/25"
# management_subnet_address_prefix is the address prefix for the management subnet
management_subnet_address_prefix = "10.10.20.64/28"

# management_firewall_subnet_address_prefix is the address prefix for the firewall subnet
management_firewall_subnet_address_prefix = "10.10.20.0/26"
firewall_deployment = true

# management_bastion_subnet_address_prefix is the address prefix for the bastion subnet
management_bastion_subnet_address_prefix = "10.10.20.128/26"
bastion_deployment = true

# deployer_enable_public_ip controls if the deployer virtual machines will have Public IPs
deployer_enable_public_ip = false

# deployer_count defines how many deployer VMs will be deployed
deployer_count = 1

# use_service_endpoint defines that the management subnets have service endpoints enabled
use_service_endpoint = true

# use_private_endpoint defines that the storage accounts and key vaults have private endpoints enabled
use_private_endpoint = true

# enable_firewall_for_keyvaults_and_storage defines that the storage accounts and key vaults have firewall enabled
enable_firewall_for_keyvaults_and_storage = false

# public_network_access_enabled controls if storage account and key vaults have public network access enabled
public_network_access_enabled = false

Si notino i percorsi dei file delle variabili Terraform per le modifiche future durante la distribuzione.

Un file Terraform minimo per LIBRARY potrebbe essere simile al seguente esempio:

# The environment value is a mandatory field, it is used for partitioning the environments, for example, PROD and NP.
environment = "MGMT"
# The location/region value is a mandatory field, it is used to control where the resources are deployed
location = "westeurope"

#Defines the DNS suffix for the resources
dns_label = "azure.contoso.net"

# use_private_endpoint defines that the storage accounts and key vaults have private endpoints enabled
use_private_endpoint = true

Si notino i percorsi dei file delle variabili Terraform per le modifiche future durante la distribuzione.

Eseguire il comando seguente per creare il deployer e la libreria SAP. Il comando aggiunge i dettagli dell'entità servizio all'insieme di credenziali delle chiavi di distribuzione.

Impostare le variabili di ambiente per l'identità gestita:

export ARM_SUBSCRIPTION_ID="<subscriptionId>"
export       ARM_CLIENT_ID="<managedIdentityAppId>"
export       ARM_TENANT_ID="<tenantId>"

Impostare le variabili di ambiente per l'entità servizio:

export ARM_SUBSCRIPTION_ID="<subscriptionId>"
export       ARM_CLIENT_ID="<appId>"
export   ARM_CLIENT_SECRET="<password>"
export       ARM_TENANT_ID="<tenantId>"

Eseguire il comando seguente per distribuire il piano di controllo:

export            env_code="MGMT"
export         region_code="WEEU"
export           vnet_code="DEP00"

export DEPLOYMENT_REPO_PATH="${HOME}/Azure_SAP_Automated_Deployment/sap-automation"
export CONFIG_REPO_PATH="${HOME}/Azure_SAP_Automated_Deployment/WORKSPACES"
export SAP_AUTOMATION_REPO_PATH="${HOME}/Azure_SAP_Automated_Deployment/sap-automation"

az logout
az login --identity --client-id "${ARM_CLIENT_ID}"

# Uncomment next line for service principal based login
# az login --service-principal -u "${ARM_CLIENT_ID}" -p="${ARM_CLIENT_SECRET}" --tenant "${ARM_TENANT_ID}"

cd ~/Azure_SAP_Automated_Deployment/WORKSPACES

deployer_parameter_file="${CONFIG_REPO_PATH}/DEPLOYER/${env_code}-${region_code}-${vnet_code}-INFRASTRUCTURE/${env_code}-${region_code}-${vnet_code}-INFRASTRUCTURE.tfvars"
library_parameter_file="${CONFIG_REPO_PATH}/LIBRARY/${env_code}-${region_code}-SAP_LIBRARY/${env_code}-${region_code}-SAP_LIBRARY.tfvars"

#When using managed identity use:
${SAP_AUTOMATION_REPO_PATH}/deploy/scripts/deploy_controlplane.sh  \
    --deployer_parameter_file "${deployer_parameter_file}"         \
    --library_parameter_file "${library_parameter_file}"            \
    --subscription "${ARM_SUBSCRIPTION_ID}"                        \
    --msi

#When using a service principal use:
${SAP_AUTOMATION_REPO_PATH}/deploy/scripts/deploy_controlplane.sh  \
    --deployer_parameter_file "${deployer_parameter_file}"         \
    --library_parameter_file "${library_parameter_file}"            \
    --subscription "${ARM_SUBSCRIPTION_ID}"                        \
    --spn_id "${ARM_CLIENT_ID}"                                    \
    --spn_secret "${ARM_CLIENT_SECRET}"                            \
    --tenant_id "${ARM_TENANT_ID}"

Configurare manualmente una macchina virtuale

Per connettersi al deployer:

  1. Accedi al portale di Azure.

  2. Passare al gruppo di risorse che contiene la macchina virtuale del deployer.

  3. Connettersi alla macchina virtuale usando Azure Bastion. Il nome utente predefinito è azureadm.

  4. Selezionare Chiave privata SSH da Azure Key Vault.

  5. Selezionare la sottoscrizione che contiene il piano di controllo.

  6. Selezionare il vault delle chiavi del distributore.

  7. Nell'elenco dei segreti scegliere il segreto che termina con -sshkey.

  8. Connettersi alla VM.

Per configurare il deployer, eseguire lo script seguente:

mkdir -p ~/Azure_SAP_Automated_Deployment; cd $_

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

Lo script installa Terraform e Ansible e configura il deployer.

Proteggere il piano di controllo

Il piano di controllo è la parte più critica di SDAF. Se hai creato il piano di controllo usando una macchina virtuale esterna o Cloud Shell, proteggilo implementando endpoint privati per gli account di archiviazione e i Key Vault.

  1. Accedere alla macchina virtuale deployer e copiare i file di configurazione del piano di controllo usando lo sync_deployer.sh script :

    cd ~/Azure_SAP_Automated_Deployment/WORKSPACES
    
    ../sap-automation/deploy/scripts/sync_deployer.sh --storageaccountname mgtneweeutfstate### --state_subscription xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
    
  2. Impostare la variabile use_private_endpoint su true nei file di configurazione DEPLOYER e LIBRARY. Imposta anche public_network_access_enabled a false nei file di configurazione DEPLOYER:

    # Defines that the storage accounts and key vaults have private endpoints enabled
    use_private_endpoint = true
    
    # Controls if storage account and key vaults have public network access enabled
    public_network_access_enabled = false
    
  3. Rieseguire la distribuzione del piano di controllo per abilitare gli endpoint privati per gli account di archiviazione e gli insiemi di credenziali delle chiavi:

    export            env_code="MGMT"
    export         region_code="WEEU"
    export           vnet_code="DEP00"
    export  storageaccountname=<storageaccountname>
    
    export DEPLOYMENT_REPO_PATH="${HOME}/Azure_SAP_Automated_Deployment/sap-automation"
    export CONFIG_REPO_PATH="${HOME}/Azure_SAP_Automated_Deployment/WORKSPACES"
    export SAP_AUTOMATION_REPO_PATH="${HOME}/Azure_SAP_Automated_Deployment/sap-automation"
    
    az logout
    az login --service-principal -u "${ARM_CLIENT_ID}" -p="${ARM_CLIENT_SECRET}" --tenant "${ARM_TENANT_ID}"
    
    cd ~/Azure_SAP_Automated_Deployment/WORKSPACES
    
    deployer_parameter_file="${CONFIG_REPO_PATH}/DEPLOYER/${env_code}-${region_code}-${vnet_code}-INFRASTRUCTURE/${env_code}-${region_code}-${vnet_code}-INFRASTRUCTURE.tfvars"
    library_parameter_file="${CONFIG_REPO_PATH}/LIBRARY/${env_code}-${region_code}-SAP_LIBRARY/${env_code}-${region_code}-SAP_LIBRARY.tfvars"
    
    ${SAP_AUTOMATION_REPO_PATH}/deploy/scripts/deploy_controlplane.sh  \
        --deployer_parameter_file "${deployer_parameter_file}"         \
        --library_parameter_file "${library_parameter_file}"            \
        --subscription "${ARM_SUBSCRIPTION_ID}"                        \
        --spn_id "${ARM_CLIENT_ID}"                                    \
        --spn_secret "${ARM_CLIENT_SECRET}"                            \
        --tenant_id "${ARM_TENANT_ID}"                                 \
        --storageaccountname "${storageaccountname}"                   \
        --recover
    

Preparare l'app Web

Questo passaggio è facoltativo. Se si vuole che un'interfaccia utente basata su browser consenta di configurare le zone e i sistemi del carico di lavoro SAP, eseguire i comandi seguenti prima di distribuire il piano di controllo.

echo '[{"resourceAppId":"00000003-0000-0000-c000-000000000000","resourceAccess":[{"id":"e1fe6dd8-ba31-4d61-89e7-88639da4683d","type":"Scope"}]}]' >> manifest.json

region_code=WEEU

export TF_VAR_app_registration_app_id=$(az ad app create \
    --display-name ${region_code}-webapp-registration \
    --enable-id-token-issuance true \
    --sign-in-audience AzureADMyOrg \
    --required-resource-access @manifest.json \
    --query "appId" | tr -d '"')

export TF_VAR_webapp_client_secret=$(az ad app credential reset \
    --id $TF_VAR_app_registration_app_id --append               \
    --query "password" | tr -d '"')

export TF_VAR_use_webapp=true
rm manifest.json

Passo successivo