Wdrażanie płaszczyzny sterowania

Płaszczyzna sterowania to infrastruktura wdrażania platformy SAP Deployment Automation Framework (SDAF). Zapewnia agentów wdrażania, magazyn stanów i zarządzanie poświadczeniami, które struktura musi mieć do aprowizacji i konfiguracji środowisk SAP na platformie Azure.

Bez płaszczyzny sterowania nie można uruchamiać przepływów pracy programu Terraform i rozwiązania Ansible, które wdrażają strefy obciążeń i systemy SAP. Skonfigurowanie płaszczyzny sterowania jest pierwszym krokiem wdrażania w strukturze.

W tym artykule przygotujesz poświadczenia wdrożenia, skonfigurujesz składniki modułu wdrażania i biblioteki SAP oraz uruchomisz skrypty, które tworzą zasoby płaszczyzny sterowania w ramach subskrypcji platformy Azure.

Diagram przedstawiający płaszczyznę sterowania dla platformy SAP Deployment Automation Framework.

Wymagania wstępne

Przygotowywanie poświadczeń wdrożenia

SDAF używa tożsamości zarządzanych (zalecanych) lub podmiotów zabezpieczeń usługi na potrzeby wdrożeń.

  1. Utwórz poświadczenia uwierzytelniania dla wdrożenia płaszczyzny sterowania. Użyj konta, które ma uprawnienia do tworzenia głównych usług.

    Aby utworzyć jednostkę usługi:

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

    Aby utworzyć tożsamość zarządzaną:

    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>
    

    Ważne

    Nazwa jednostki usługi musi być unikatowa.

    Zapisz wartości wyjściowe z polecenia :

    • Identyfikator aplikacji
    • hasło
    • dzierżawa
  2. Opcjonalnie przypisz rolę administratora dostępu użytkowników do jednostki usługi lub tożsamości zarządzanej:

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

    Aby ograniczyć zakres roli do określonej grupy zasobów, użyj następującego polecenia:

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

Uruchom wdrożenie płaszczyzny sterowania

Wszystkie artefakty wymagane do wdrożenia płaszczyzny sterowania znajdują się w repozytoriach GitHub. Sklonuj repozytoria, aby przygotować się do wdrożenia płaszczyzny sterowania:

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
  • Przykładowy plik MGMT-WEEU-DEP00-INFRASTRUCTURE.tfvars konfiguracji narzędzia wdrażania znajduje się w folderze ~/Azure_SAP_Automated_Deployment/samples/Terraform/WORKSPACES/DEPLOYER/MGMT-WEEU-DEP00-INFRASTRUCTURE .

  • Przykładowy plik MGMT-WEEU-SAP_LIBRARY.tfvars konfiguracji biblioteki SAP znajduje się w folderze ~/Azure_SAP_Automated_Deployment/samples/Terraform/WORKSPACES/LIBRARY/MGMT-WEEU-SAP_LIBRARY .

Możesz skopiować przykładowe pliki konfiguracji, aby rozpocząć testowanie struktury.

Minimalny plik Terraform dla DEPLOYER tego pliku może wyglądać następująco:

# 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

Zanotuj lokalizacje plików zmiennych programu Terraform na potrzeby przyszłych edycji podczas wdrażania.

Minimalny plik Terraform dla LIBRARY tego pliku może wyglądać następująco:

# 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

Zanotuj lokalizacje plików zmiennych programu Terraform na potrzeby przyszłych edycji podczas wdrażania.

Uruchom następujące polecenie, aby utworzyć narzędzie wdrażania i bibliotekę SAP. Polecenie dodaje szczegóły obiektu zabezpieczeń usługi do magazynu kluczy związanego z wdrażaniem.

Ustaw zmienne środowiskowe dla tożsamości zarządzanej:

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

Ustaw zmienne środowiskowe dla jednostki usługi:

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

Uruchom następujące polecenie, aby wdrożyć płaszczyznę sterowania:

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

Ręczne konfigurowanie maszyny wirtualnej

Aby nawiązać połączenie z modułem wdrażania:

  1. Zaloguj się do portalu Azure.

  2. Przejdź do grupy zasobów zawierającej maszynę wirtualną "deployer".

  3. Nawiąż połączenie z maszyną wirtualną przy użyciu usługi Azure Bastion. Domyślna nazwa użytkownika to azureadm.

  4. Wybierz pozycję Klucz prywatny SSH z usługi Azure Key Vault.

  5. Wybierz subskrypcję zawierającą płaszczyznę sterowania.

  6. Wybierz magazyn kluczy dla wdrożeniowca.

  7. Z listy sekretów wybierz sekret kończący się na -sshkey.

  8. Nawiąż połączenie z maszyną wirtualną.

Aby skonfigurować narzędzie do wdrażania, uruchom następujący skrypt:

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

Skrypt instaluje program Terraform i rozwiązanie Ansible oraz konfiguruje program deployer.

Zabezpieczanie płaszczyzny sterowania

Płaszczyzna sterowania jest najbardziej krytyczną częścią SDAF. Jeśli płaszczyzna sterowania została utworzona przy użyciu zewnętrznej maszyny wirtualnej lub usługi Cloud Shell, zabezpiecz ją, implementując prywatne punkty końcowe dla kont magazynu i magazynów kluczy.

  1. Zaloguj się do maszyny wirtualnej narzędzia wdrażającego i skopiuj pliki konfiguracji płaszczyzny sterowania przy użyciu skryptu sync_deployer.sh :

    cd ~/Azure_SAP_Automated_Deployment/WORKSPACES
    
    ../sap-automation/deploy/scripts/sync_deployer.sh --storageaccountname mgtneweeutfstate### --state_subscription xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
    
  2. Ustaw zmienną use_private_endpoint na true w plikach konfiguracji DEPLOYER i LIBRARY. Ustaw również wartość public_network_access_enabled na false w plikach DEPLOYER konfiguracji:

    # 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. Uruchom ponownie wdrożenie płaszczyzny kontrolnej, aby włączyć prywatne punkty końcowe dla kont magazynu i skrytek kluczy.

    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
    

Przygotowywanie aplikacji internetowej

Ten krok jest opcjonalny. Jeśli chcesz, aby interfejs użytkownika oparty na przeglądarce pomógł skonfigurować strefy obciążeń i systemy SAP, przed wdrożeniem płaszczyzny sterowania uruchom następujące polecenia.

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

Następny krok