====================================================================================
=== Показать информацию об Azure Container Registry:
====================================================================================
#
az acr show -n rgnameacr
====================================================================================
=== Показать логи контейнера:
====================================================================================
#
az container logs --resource-group "rg_name" --name "container_name"
====================================================================================
=== Показать информацию о контейнере:
====================================================================================
#
az container show --resource-group "rg_name" --name "container_name"
====================================================================================
=== При создании контейнера с dns-именем и приватной сетью появляется ошибка "IP Address type can't be public when network profile is set". Мудилы не умеют корректно описывать причину ошибки:
====================================================================================
====================================================================================
=== При первой попытке создания контейнера с приватной сетью в West Europe вываливается:
====================================================================================
#
ERROR: The command failed with an unexpected error. Here is the traceback:
ERROR: 'NetworkProfile' object has no attribute 'result'
Traceback (most recent call last):
File "C:\Users\VSSADM~1\AppData\Local\Temp\pip-unpacked-wheel-taryuzhh\knack\cli.py", line 233, in invoke
File "C:\Users\VSSADM~1\AppData\Local\Temp\pip-unpacked-wheel-sc_lkrar\azure\cli\core\commands\__init__.py", line 660, in execute
File "C:\Users\VSSADM~1\AppData\Local\Temp\pip-unpacked-wheel-sc_lkrar\azure\cli\core\commands\__init__.py", line 723, in _run_jobs_serially
File "C:\Users\VSSADM~1\AppData\Local\Temp\pip-unpacked-wheel-sc_lkrar\azure\cli\core\commands\__init__.py", line 716, in _run_job
File "C:\Users\VSSADM~1\AppData\Local\Temp\pip-unpacked-wheel-l7ikczg1\six.py", line 703, in reraise
File "C:\Users\VSSADM~1\AppData\Local\Temp\pip-unpacked-wheel-sc_lkrar\azure\cli\core\commands\__init__.py", line 694, in _run_job
File "C:\Users\VSSADM~1\AppData\Local\Temp\pip-unpacked-wheel-sc_lkrar\azure\cli\core\commands\__init__.py", line 331, in __call__
File "C:\Users\VSSADM~1\AppData\Local\Temp\pip-unpacked-wheel-sc_lkrar\azure\cli\core\__init__.py", line 808, in default_command_handler
File "C:\Users\VSSADM~1\AppData\Local\Temp\pip-unpacked-wheel-ibh5mnup\azure\cli\command_modules\container\custom.py", line 190, in create_container
File "C:\Users\VSSADM~1\AppData\Local\Temp\pip-unpacked-wheel-ibh5mnup\azure\cli\command_modules\container\custom.py", line 348, in _get_vnet_network_profile
AttributeError: 'NetworkProfile' object has no attribute 'result'
To open an issue, please run: 'az feedback'
== При повторном запуске - всё ок ==
====================================================================================
=== Как логиниться в докер токеном из acr (пользователь именно с нулями):
====================================================================================
#
https://docs.microsoft.com/uk-ua/azure/container-registry/container-registry-authentication
$TOKEN = (az acr login --name $registry_username --expose-token --output tsv --query accessToken)
docker login $acr_loginserver -u 00000000-0000-0000-0000-000000000000 -p $TOKEN
====================================================================================
=== Как логиниться в azure с помощью service principal (пароль):
====================================================================================
#
az login --service-principal --username $app_id --password $client_secret --tenant $tenant_id
====================================================================================
=== Подготовить ключ и сертификат service principal для логина через az cli:
====================================================================================
#
cat key.pem cert.pem > full.pem
====================================================================================
=== Как логиниться в azure с помощью service principal (с ключом и сертификатом в файле pem):
====================================================================================
#
az login --service-principal --username $app_id --tenant $tenant_id --subscription $subscription_id --certificate "$PATH_TO_PEM"
====================================================================================
=== Как использовать service principal для работы с Databricks:
====================================================================================
#
0. Use "2ff814a6-3304-4ab8-85cb-cd0e6f879c1d" as resource_id - it's default id for Databricks.
1. Get admin's PAT in Databricks interface.
2. Create Service Principal for Databricks.
3. Add SP to Databricks IAM as Contributor.
4. Grant necessary permissions for SP in "API permissions" section (it should be "user_impersonation" permissions).
5. Manage "User consent" in "Enterprise applications" section.
6. Click "Grant admin consent for Default Directory" if you see necessary resources below.
7. **HERE SHOULD BE SOME CURL COMMAND**
====================================================================================
=== Как логиниться в докер из Windows Jenkins-ноды, которая подключена к мастеру через ssh (ssh в этом случае принципиален, потому что логин с локалхоста выполняется без проблем.):
====================================================================================
== После попытки логина из Jenkins с помощью (думаю, первый "az acr login" не нужен, но всё же): ==
#
$registry_username = $YOUR_AZURE_REGISTRY_NAME
$registry_secret = $YOUR_AZURE_REGISTRY_SECRET
$loginserver = "SOMETHING.azurecr.io"
az acr login -n $registry_username -u $registry_username -p $registry_secret
$token = (az acr login --name $registry_username --expose-token --output tsv --query accessToken)
docker login $loginserver -u 00000000-0000-0000-0000-000000000000 -p $token
появляется файл C:\Users\$YOUR_USER\.docker\config.json с примерно таким содержимым:
{
"auths": {
"testdockerregistry.azurecr.io": {}
},
"credsStore": "wincred"
}
== Если так и оставить, то Jenkins, при попытке залогиниться одной из своих нод, будет отваливаться с ошибкой:
"Error saving credentials: error storing credentials - err: exit status 1, out: `A specified logon session does not exist. It may already have been terminated.`"
Чтобы это починить, в config.json нужно заменить "wincred" на "". После этого запустить джобу повторно. В config.json должна появиться запись с полученным токеном. Всё должно быть хорошо по-крайней мере до следующей перезагрузки.
По-нормальному же это можно сделать, генерируя файл config.json с помощью Set-Content, заполняя его при сборке каждый раз заново. ==
====================================================================================
=== Обязательное экранирование кавычек при парсинге json в azure cli:
====================================================================================
#
$jv = '[{\"category\": \"AllMetrics\",\"enabled\": true,\"retentionPolicy\": {\"enabled\": false, \"days\": 0 }}]'
az monitor diagnostic-settings create -n "lalala" --resource "devkvpmtengine" -g " --resource-type "Microsoft.KeyVault/vaults" --workspace "devlgspaceapp" --metrics $jv
using-quotation-marks-in-values
Концепция вцелом (лень проверять, какой из вариантов валидный):
az version --query '\"azure-cli\"'
az version --query "\`"azure-cli\`""
az version --query "\""azure-cli\"""
az --% version --query "\"azure-cli\""
az --% version --query \"azure-cli\"
====================================================================================
=== Экспортировать содержимое таблицы CosmosDB в JSON:
====================================================================================
== На 20211029 нужно использовать "datamigrationtool". Ясная схема работы - указывается источник данных, его кастомный connection string (AccountEndpoint, AccountKey, Database) и название таблицы, а также получатель данных - расположение JSON, необязательные параметры для него.
Данные для Connection String берутся из соответствующего раздела CosmosDB в портале. Но, оказывается, есть нюанс - на портале endpoint выглядит как "https://testname.table.azure.com:443/", а должен быть "https://testname.documents.azure.com:443/" (это по состоянию на 20211029 и dt_v.1.8.3).
Пример строки экспорта: ==
#
./dt.exe /s:DocumentDB /s.ConnectionString:"AccountEndpoint=https://tablename.documents.azure.com:443/;AccountKey=somekey==;Database=db_name" /s.Collection:"collection_name" /t:JsonFile /t.File:"1.json" /ErrorDetails:All
====================================================================================
=== Если в Azure Webapp при попытке открыть *.json отдается 404, на файл находится в корректном каталоге, нужно редактировать web.config хотя бы до такого состояния:
====================================================================================
#
====================================================================================
=== The resource you are looking for has been removed had its name changed or is temporarily unavailable (Azure Webapp). Снова нужно редактировать web.config:
====================================================================================
#
====================================================================================
=== Дефолтный web.config для netcore приложения:
====================================================================================
#
====================================================================================
=== Экспортировать notebook из Azure Databricks Workspace:
====================================================================================
#
curl --netrc --request GET https://adb-11.11.azuredatabricks.net/api/2.0/workspace/export --header 'Authorization: Bearer token' --header 'Accept: application/json' --data '{ "path": "/Users/user@outlook.com/folder/notebook", "format": "SOURCE", "direct_download": true }' > filename
====================================================================================
=== Получить tenant_id и subscription_id через az cli:
====================================================================================
#
az login
====================================================================================
=== Создать service principal с правами "Owner" на уровень подписки:
====================================================================================
az ad sp create-for-rbac --display-name "subscription-manager" --role "Owner" --scopes "/subscriptions/SUBSCRIPTION_ID"
====================================================================================
=== Авторизоваться в Azure с помощью service principal:
====================================================================================
#
# Создать в терминале следующие переменные среды:
$Env:ARM_CLIENT_ID = $APP_ID
$Env:ARM_CLIENT_SECRET = $PASSWORD
$Env:ARM_SUBSCRIPTION_ID = $SUBSCRIPTION_ID
$Env:ARM_TENANT_ID = $TENANT_ID
====================================================================================
=== Получить object_id service principal (это не тот object_id, который отображается на странице Overview service principal):
====================================================================================
== Через консоль в Azure Portal:
#
$(Get-AzureADServicePrincipal -Filter "AppId eq '35e6b976-cb9d-408c-bc77-a60ddc8e30be'").ObjectId
====================================================================================
=== Страдания в попытках получить данные о потраченных на подписку деньгах. Зависит вроде как от версии api, но я так и не установил четкую корреляция (попытки конца 2021 года):
====================================================================================
#
https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.Consumption/usageDetails?$filter=properties%2FresourceGroup%20eq%20%27dev-project%27&$top=10&api-version=2021-01-01
GET https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.Billing/billingPeriods/${billingPeriod}/providers/Microsoft.Consumption/usageDetails?$filter=properties/usageEnd ge '20210807' AND properties/usageEnd le '20210810'
https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.Consumption/usageDetails?&api-version=2019-10-01
curl -X GET -H "Authorization: Bearer ...FP-YiNecsLhEFsdU4s0Ym7Dg.." -H "Content-Type: application/json" 'https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.Consumption/usageDetails?startDate=2021-11-05&endDate=2021-11-05&$top=100&api-version=2021-10-01'
GET https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.Consumption/usageDetails?startDate=2024-04-10&endDate=2024-04-10&$top=1000&api-version=2019-10-01
GET https://management.azure.com/{scope}/providers/Microsoft.Consumption/usageDetails?startDate=2020-08-01&endDate=2020-08-05&$top=1000&api-version=2019-10-01
GET https://management.azure.com/providers/Microsoft.Management/managementGroups/$SUBSCRIPTION_ID/providers/Microsoft.Consumption/aggregatedcost?api-version=2021-10-01
'/providers/Microsoft.Management/managementGroups/$SUBSCRIPTION_ID/settings/$SUBSCRIPTION_ID'
====================================================================================
=== Publish-AzWebApp: Deployment failed with status code Unauthorized:
====================================================================================
#
== Установить environment setting для вебаппа:
SCM_DO_BUILD_DURING_DEPLOYMENT true
====================================================================================
=== Создать app service plan для function и прилинковать function к этому asp:
====================================================================================
#
== Не забудь, что нельзя даунгрейдить премиум-план до бесплатного - можно только создать бесплатный и привязать function к новому плану, после чего удалять премиум.
az functionapp plan list
az functionapp plan create --name "dev-project-function-asp1" --resource-group "dev-project-rg1" --sku EP1 --min-instances 1 --max-burst 2
az functionapp update --plan "dev-project-function-asp1" -n "dev-project-worker" --resource-group "dev-project-rg1"
az functionapp plan list
az functionapp plan create --name "dev-project-function-asp1" --resource-group "dev-project-rg1" --sku Y1
az functionapp update --plan "dev-project-function-asp1" -n "dev-project-worker" --resource-group "dev-project-rg1"
====================================================================================
=== Получить суточный биллинг по подписке (цифры почти сходятся с тем, что выдает Azure Portal):
====================================================================================
#
GET subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.Consumption/usageDetails?startDate=2024-04-10&endDate=2024-04-10&$expand=MeterDetails,additionalInfo&api-version=2019-10-01&metric=actualcost
====================================================================================
=== Получить список файлов Azure Blob Storage:
====================================================================================
#
azcopy list $AZURE_CONTAINER | awk '{print $1}' | cut -d ";" -f 1 | awk -F"test" '{print $2}' | sed "s/^\///g" | sed '/^$/d'
====================================================================================
=== Работа с SAS token для Storage account:
====================================================================================
#
== Заебало в очередной раз перепроверять, для какой из тулзовин в каком формате нужно скармливать SAS token. Положняк на 20260604:
- создать сторедж;
- через Microsoft Azure Storage Explorer войти в сторедж с помощью Access Key;
- создать контейнер, нажать на нем ПКМ и выбрать Manage Stored Access Policies;
- после создания полиси нужно создать токен на базе этой полиси, нажав Get Shared Access Signature;
- сохранить полученные значения:
SAS URL:
https://storagename.blob.core.windows.net/tfstate?sv=2025-07-05&spr=https&sip=1.1.1.1&si=tfstate-2026-06-04-10%3A33%3A12.144&sr=c&sig=G%2...k%3D
SAS token:
?sv=2025-07-05&spr=https&sip=1.1.1.1&si=tfstate-2026-06-04-10%3A33%3A12.144&sr=c&sig=G%2...k%3D
Для того, чтобы просмотреть список блобов в контейнере через az cli нужно следующее (точно рабочих более вменяемых способов, в том числе и через переменные, я не нашел - всё так или иначе не работает) - со знаком вопроса:
az --% storage blob list --account-name storagename --container-name contname --sas-token "?sv=2025-07-05&spr=https&sip=1.1.1.1&si=tfstate-2026-06-04-10%3A33%3A12.144&sr=c&sig=G%2...k%3D"
Для open, блядь, tofu токен нужно передавать БЕЗ знака вопроса (для настроек бэкенда):
$Env:ARM_SAS_TOKEN = "sv=2025-07-05&spr=https&sip=1.1.1.1&si=tfstate-2026-06-04-10%3A33%3A12.144&sr=c&sig=G%2...k%3D"
tofu init
В настройках секции backend указать значения для следующих переменных: storage_account_name, container_name, key (это название блоба в контейнере).
====================================================================================
=== Quotas в Azure:
====================================================================================
#
== Квоты для создания App Service Plan описаны в секции App Service (Public preview) сервиса Quotas, НЕ COMPUTE!! Я ебал снова на эти грабли прыгать..
====================================================================================
=== Как дать доступ пользователю (devops_user) в Azure Artifacts для публикации и скачивания nuget-пакетов из приватного фида:
====================================================================================
#
1. Создать электронный ящик для пользователя devops_user.
# На следующих шагах используется учетная запись пользователя с правами owner:
1. Пригласить пользователя devops_user в Azure Active Directory (можно без выдачи каких-либо прав).
1.1. Дождаться принятия инвайта.
2. Прилинковать Azure Devops к AAD от имени пользователя с правами owner.
3. Добавить в Azure Devops свежесозданного пользователя из AAD в группу, например, Contibutors.
# На следующих шагах используется учетная запись пользователя devops_user:
1. Зайдя в почту, принять инвайт в директорию Azure.
2. Зайдя в почту, принять инвайт в Azure Devops.
3. Зайти на dev.azure.com своей учетной записью и переключиться в директорию проекта.
4. После переключения должны быть доступны ресурсы проекта.
5. Зайти в персональные настройки и создать Personal Access Token. Записать его.
# На следующих шагах описывается настройка окружения на сборочной машине:
0. Установить Credentials Provider для nuget (запускается от не-админа, https://github.com/Microsoft/artifacts-credprovider):
iex "& { $(irm https://aka.ms/install-artifacts-credprovider.ps1) } -AddNetfx"
1. nuget.exe sources add -name $YOUR_FEED_NAME -source https://pkgs.dev.azure.com/$YOUR_ORGANIZATION_NAME/$YOUR_PROJECT_NAME/_packaging/$YOUR_FEED_NAME/nuget/v3/index.json -username devops_user -password password
2. Проверить, добавилась ли в %appdata%/Nuget/Nuget.Config запись с этим source.
3. Если добавилась, то можно делать nuget restore и проверять, подтянутся ли пакеты из вашего приватного фида.
4. НЕ ЗАБЫТЬ ПОМЕНЯТЬ PAT ПО ИСТЕЧЕНИЕ ЕГО СРОКА ГОДНОСТИ.
# Как сохранить nuget-пакет из приватного фида, не прибегая к nuget-параше:
1. Install-Module -Name PowerShellGet -Force ### можно не устанавливать, а лишь убедиться, что версия не 1.0.0.1. Если будет проблема с поиском пакета через "Find-Module -name * -Repository $YOUR_RANDOM_REPO_NAME", то нужно обновить сначала это
2. cat .\token.txt | az devops login --organization https://dev.azure.com/$YOUR_ORGANIZATION_NAME --debug ### залогиниться в azure devops, используя PAT
3. Register-PSRepository -Name $YOUR_RANDOM_REPO_NAME -SourceLocation https://pkgs.dev.azure.com/$YOUR_ORGANIZATION_NAME/$YOUR_PROJECT_NAME/_packaging/$YOUR_FEED_NAME/nuget/v2 -InstallationPolicy Trusted
### следующее, скорее всего, необязательно
4. Register-PackageSource -Name $YOUR_RANDOM_REPO_NAME -Location https://pkgs.dev.azure.com/$YOUR_ORGANIZATION_NAME/$YOUR_PROJECT_NAME/_packaging/$YOUR_FEED_NAME/nuget/v2 -ProviderName NuGet -SkipValidate
5. Save-Package -Name $YOUR_PACKAGE_NAME -ProviderName Nuget -Path .
# Предыдущие два абзаца, возможно, не ок. Как я делал загрузку в Azure Artifacts сейчас, 28.06.2021:
1. Создал в репе nuget.config рядом с *.sln.
2. Написал там это:
3. В jenkins указал переменную AZURE_DEVOPS_EXT_PAT, в какой лежит PAT пользователя с нужными правами. Имя переменной должно быть ТОЛЬКО AZURE_DEVOPS_EXT_PAT.
4. После сборки пакета должна быть строка для его загрузки в Azure Artifacts:
nuget.exe push -Source "project_name-nupkg" -ApiKey az "$full_nupkg_name"