Если вы используете Terraporm для обеспечения инзаструктуры Azure, вы, скорее всего, используете Azure Storage Backend Type Для вашего государственного файла.
При выполнении плана и применения, Terraform приобретает блокировку в состоянии состояния для управления параллелизмом (т. Е. Это, чтобы несколько развертываний не мешают друг другу), а иногда, если трубопровод резко завершится, вы оставляете резко, вы остались резко, вы оставляете резко, вы остались резко, вы оставляете резко, вы остались с блокировкой на Государственный файл.
В следующий раз, когда вы запустите трубопровод, вы получите что-то вроде
Error locking state: Error acquiring the state lock: state blob is already locked
Сетевая сеть ограничена наши учетные записи хранения и используются набор шкалы VM, связанный с подсетью для нашего Azure DevOps Builds. Подсеть разрешена перечислена на ограничения сети учетной записи хранилища, а контейнеры, удерживающие файл состояния, также являются RBAC ограничивается SPN, связанным с сервисным подключением DEVOPS. Это значит, Только наши трубопроводы DevOps могут взаимодействовать с нашим государством террафора И поэтому нам нужен лазурный трубопровод для выполнения разблокировки для нас — так что мы можем аутентифицироваться и выполнять в соответствии с правильным контекстом безопасности.
Это довольно просто, единственное требование здесь состоит в том, чтобы нарушить аренду на блоколе состояния файла, которое может быть достигнуто с помощью задачи AzureCli. Используя этот тип задач, аутентификация выполняется через указанное сервисное соединение, которое выполняет управление токеном и позволяет получить доступ к RBAC ограниченный контейнер Отказ
parameters: - name : TerraformStateFile displayName: Terraform State File (e.g. whatever.statefile.tfstate) type: string - name: ServiceConnectionName default: YourServiceConnectionDefault displayName: The name of the service connection that gives access to the storage account for the state file type: string - name: StorageAccountName default: YourStorageDefault displayName: The name of the storage account that holds the Terraform state files type: string trigger: none steps: - task: AzureCLI@2 displayName: "Break lease on terraform state" name: BreakLease inputs: azureSubscription: ${{ parameters.ServiceConnectionName }} scriptType: "pscore" scriptLocation: "inlineScript" inlineScript: "az storage blob lease break --container-name 'terraform' --blob-name '${{ parameters.TerraformStateFile }}' --account-name '${{ parameters.StorageAccountName }}'"
NB: Имя контейнера жесткодируется на «Терраформ»
В этом примере вы можете параметризировать или установить для вас, по умолчанию?
Теперь любая члена команды могут запускать трубопровод для сброса состояния, не требуя никого прямого доступа к учетной записи хранилища.
Оригинал: «https://dev.to/dylanmorley/azure-devops-secure-reset-of-terraform-state-3p0f»