Implementación del plano de control

El plano de control es la infraestructura de implementación para SAP Deployment Automation Framework (SDAF). Proporciona los agentes de implementación, el almacenamiento de estado y la administración de credenciales que el marco debe aprovisionar y configurar entornos de SAP en Azure.

Sin un plano de control, no se pueden ejecutar los flujos de trabajo de Terraform y Ansible que implementan sistemas y zonas de carga de trabajo de SAP. La configuración del plano de control es el primer paso de implementación del marco.

En este artículo, preparará las credenciales de implementación, configurará el implementador y los componentes de la biblioteca de SAP y ejecutará los scripts que crean los recursos del plano de control en la suscripción de Azure.

Diagrama que muestra el plano de control para SAP Deployment Automation Framework.

Prerrequisitos

  • Una suscripción a Azure. Si no tiene una suscripción a Azure, cree una cuenta gratuita.
  • Permisos para crear entidades de servicio o identidades administradas para la suscripción.
  • CLI de Azure instalada en una estación de trabajo linux o acceso a Azure DevOps.

Preparación de las credenciales de implementación

SDAF usa identidades administradas por el sistema (recomendadas) o principales de servicio para implementaciones.

  1. Cree credenciales de autenticación para la implementación del plano de control. Use una cuenta que tenga permisos para crear entidades de servicio.

    Para crear un principal de servicio:

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

    Para crear una identidad administrada:

    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

    El nombre de la entidad de servicio debe ser único.

    Registre los valores de salida del comando:

    • ID de la aplicación
    • contraseña
    • tenant
  2. Opcionalmente, asigne el rol de Administrador de acceso de usuarios a la entidad de servicio o a la identidad administrada:

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

    Para limitar el ámbito del rol a un grupo de recursos específico, use el siguiente comando en su lugar:

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

Ejecutar la implementación del plano de control

Todos los artefactos necesarios para implementar el plano de control se encuentran en repositorios de GitHub. Clone los repositorios para preparar la implementación del plano de control.

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
  • El archivo MGMT-WEEU-DEP00-INFRASTRUCTURE.tfvars de configuración del implementador de ejemplo está en la ~/Azure_SAP_Automated_Deployment/samples/Terraform/WORKSPACES/DEPLOYER/MGMT-WEEU-DEP00-INFRASTRUCTURE carpeta .

  • El archivo MGMT-WEEU-SAP_LIBRARY.tfvars de configuración de la biblioteca SAP de ejemplo está en la ~/Azure_SAP_Automated_Deployment/samples/Terraform/WORKSPACES/LIBRARY/MGMT-WEEU-SAP_LIBRARY carpeta .

Puede copiar los archivos de configuración de ejemplo para empezar a probar el marco.

Un archivo de Terraform mínimo para el DEPLOYER podría tener un aspecto similar al de este ejemplo:

# 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

Tenga en cuenta las ubicaciones de los archivos de variables de Terraform para futuras modificaciones durante la implementación.

Un archivo de Terraform mínimo para el LIBRARY podría tener un aspecto similar al de este ejemplo:

# 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

Tenga en cuenta las ubicaciones de los archivos de variables de Terraform para futuras modificaciones durante la implementación.

Ejecute el siguiente comando para crear el implementador y la biblioteca de SAP. El comando agrega los detalles de la entidad de servicio al almacén de claves de la implementación.

Establezca las variables de entorno para la identidad administrada:

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

Establezca las variables de entorno para la entidad de servicio:

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

Ejecute el siguiente comando para implementar el plano de control:

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

Configuración manual de una máquina virtual

Para conectarse al implementador:

  1. Inicie sesión en Azure Portal.

  2. Vaya al grupo de recursos que contiene la máquina virtual (VM) del implementador.

  3. Conéctese a la máquina virtual mediante Azure Bastion. El nombre de usuario predeterminado es azureadm.

  4. Seleccione Ssh Private Key (Clave privada SSH) en Azure Key Vault.

  5. Seleccione la suscripción que contiene el plano de control.

  6. Seleccione el almacén de claves del implementador.

  7. En la lista de secretos, elija el secreto que termina con -sshkey.

  8. Conecte a la máquina virtual.

Para configurar el implementador, ejecute el siguiente script:

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

El script instala Terraform y Ansible y configura el implementador.

Proteger el plano de control

El plano de control es la parte más crítica de SDAF. Si ha creado el plano de control mediante una máquina virtual externa o Cloud Shell, puede protegerlo mediante la implementación de puntos de conexión privados para las cuentas de almacenamiento y los almacenes de claves.

  1. Inicie sesión en la máquina virtual del implementador y copie los archivos de configuración del plano de control mediante el 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. Establezca la variable use_private_endpoint en true en los archivos de configuración DEPLOYER y LIBRARY. También configure public_network_access_enabled a false en los archivos de configuración 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. Vuelva a ejecutar la implementación de la plataforma de control para habilitar puntos de conexión privados para las cuentas de almacenamiento y las bóvedas de claves.

    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
    

Preparación de la aplicación web

Este paso es opcional. Si desea que una interfaz de usuario basada en explorador le ayude a configurar sistemas y zonas de carga de trabajo de SAP, ejecute los siguientes comandos antes de implementar el plano de control.

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

Paso siguiente