В конвейере AzureDevops используются команды terraform и local-exe c az. - PullRequest
0 голосов
/ 17 апреля 2020

Поскольку провайдер Terraform Azurerm не поддерживает azure ограничения доступа к веб-приложению ( см. Выпуск github ). Мы используем null_resource с local-exec для применения ограничения доступа:


  provisioner "local-exec" {
    command = <<COMMAND
      az webapp config access-restriction add --subscription ${self.triggers.subscription_id} --resource-group ${self.triggers.resource_group} \
        --name ${self.triggers.web_app_name} --rule-name 'allow application gateway' --action Allow --vnet-name ${self.triggers.vnet_name} \
        --subnet ${self.triggers.subnet_name} --priority 100
    COMMAND
  }

Затем наш код terraform затем запускается azure DevOps Pipeline, который использует Service Connection (с Service Principal) аутентифицироваться с Azure. Следующая задача пытается применить ресурсы terraform:

  - task: TerraformCLI@0
    displayName: "Terraform apply"
    inputs:
      command: 'apply'
      commandOptions: '--var-file="./environments/${{ parameters.environment }}.tfvars"'
      workingDirectory: '$(System.DefaultWorkingDirectory)/${{ parameters.projectFolder }}'
      environmentServiceName: 'shared-${{ parameters.environment }}-001'

, что приводит к следующей ошибке:

Error: Error running command '      az webapp config access-restriction remove --subscription shared-staging-001 --resource-group rg-hub-network-staging \
        --name landing-webapp-hub --rule-name 'allow application gateway'
': exit status 1. Output: Subscription 'shared-staging-001' not recognized.
Command group 'webapp config access-restriction' is in preview. It may be changed/removed in a future release.
Please run 'az login' to setup account.

Нет, мы пытались заменить задачу TerraformCLI@0 простой Сценарий bash или задача AzureCLI@2.

Нам не удалось заставить z-логин работать в обычном сценарии bash из-за отсутствия информации. Описанный подход здесь также не работает.

Выполнение команд terraform внутри AzureCLI@2 Задача выглядит многообещающе, но вызывает некоторые странные ошибки, связанные с входом в систему субъекта службы:

  - task: AzureCLI@2
    displayName: "Terraform init"
    inputs:
      azureSubscription: shared-${{ parameters.environment }}-001
      scriptType: bash
      scriptLocation: inlineScript
      inlineScript: |
        terraform init --backend-config="./environments/${{ parameters.environment }}_backend.tfvars"

Это вызывает следующую ошибку:

Initializing modules...
- app-gateway in modules/app-gateway
- dummy1 in modules/BRZ365-AppService
- dummy2 in modules/BRZ365-AppService
- hub-network in modules/hub-network
- landing_zone_app in modules/BRZ365-AppService
- squad-area in modules/squad-area

Initializing the backend...

Error: Error building ARM Config: Authenticating using the Azure CLI is only supported as a User (not a Service Principal).

To authenticate to Azure using a Service Principal, you can use the separate 'Authenticate using a Service Principal'
auth method - instructions for which can be found here: 

Alternatively you can authenticate using the Azure CLI by using a User Account.

Ответы [ 2 ]

2 голосов
/ 18 апреля 2020

Я справился с этим с помощью local-exec.

provisioner "local-exec" {
    command = <<COMMAND
      az login --service-principal --username #{APP_ID}# --password #{SP_PASSWORD}# --tenant #{TENANT_ID}#
      az webapp config access-restriction add --resource-group ${azurerm_resource_group.example.name} --name ${azurerm_app_service.example.name} --rule-name developers --action Allow --ip-address 130.220.0.0/27 --priority 200
    COMMAND

    interpreter = ["PowerShell", "-Command"]
  }

К сожалению, для этой цели мне пришлось создать другого участника службы, поскольку я не хотел сбрасывать тот, который используется Azure DevOps (но Вы можете попробовать и повторно использовать этот).

Я использовал эти команды:

az ad sp create-for-rbac --name sp-for-cli

az role assignment create --assignee APP_ID --role Contributor

В качестве следующего я объявил переменные APP_ID, SP_PASSWORD и TENANT_ID в моем конвейере выпуска со значениями, данными командой выше.

Как последний шаг Я добавил маркер замены шаг :

steps:
- task: qetza.replacetokens.replacetokens-task.replacetokens@3
  displayName: 'Replace tokens in main.tf'
  inputs:
    rootDirectory: '$(System.DefaultWorkingDirectory)/terraform/drop'
    targetFiles: main.tf

Теперь, когда я запускаю az webapp config access-restriction show --resource-group example-resources --name example-app-service-for-cli, я получаю:

"ipSecurityRestrictions": [
    {
      "action": "Allow",
      "additional_properties": {},
      "description": null,
      "ip_address": "130.220.0.0/27",
      "name": "developers",
      "priority": 200,
      "subnet_mask": null,
      "subnet_traffic_tag": null,
      "tag": "Default",
      "vnet_subnet_resource_id": null,
      "vnet_traffic_tag": null
    },

Весь код вы можете найти здесь .

0 голосов
/ 21 апреля 2020

Я наконец-то начал работать с подходом AzureCLI, который я описал в первом посте. Я использую addSpnToEnvironment (он добавляет учетные данные поставщика услуг в среду, как описано в документации ), и задаю необходимые параметры, как описано с помощью terraform .

      - task: AzureCLI@2
        displayName: "Terraform"
        inputs:
          azureSubscription:  shared-${{ parameters.environment }}-001
          scriptType: bash
          addSpnToEnvironment: true
          scriptLocation: inlineScript
          inlineScript: |
            export ARM_CLIENT_ID=$servicePrincipalId
            export ARM_CLIENT_SECRET=$servicePrincipalKey
            export ARM_TENANT_ID=$tenantId

            terraform init .....


...