2025, Dec 17 06:02
Python на Hybrid Runbook Worker: учетные данные Azure Automation без automationassets
Учетные данные Azure Automation в Python на Hybrid Runbook Worker: Get-AutomationPSCredential в PowerShell и переменные окружения — безопасно для запуска.
Запуск Python на Hybrid Runbook Worker — отличный способ перенести существующую автоматизацию в собственную инфраструктуру, но есть нюанс: знакомый модуль automationassets, который предоставляет в Python эквиваленты Get-AutomationPSCredential, работает только в облачной песочнице Azure Automation. Когда тот же код запускается на Hybrid Runbook Worker, получить учетные данные не удается — и возникает вопрос, как безопасно «пробросить» ресурсы Automation в Python.
Проблема
Следующий фрагмент Python спокойно работает в облачных runbook'ах, но падает на Hybrid Runbook Worker:
#!/usr/bin/env python3
import automationassets
print("hello world")
auth_obj = automationassets.get_automation_credential("TestCredentials")
print(auth_obj["username"])
print(auth_obj["password"])
print("---DONE---")
На Hybrid Runbook Worker он выдает ошибку:
AttributeError: 'dict' object has no attribute 'iteritems'
Попытка импортировать тип исключения из того же модуля тоже не помогает:
import automationassets
from automationassets import AutomationAssetNotFound
В результате:
ImportError: cannot import name 'AutomationAssetNotFound' from 'automationassets'
Почему это происходит
Модуль automationassets опирается на локальные ресурсы Automation, которые существуют только внутри облачной песочницы Azure Automation. На Hybrid Runbook Worker прямого доступа к этим ресурсам нет, поэтому вызовы вроде automationassets.get_automation_credential() не работают. По сути, Hybrid Runbook Worker ведет себя как обычная машина Windows или Linux, которая может запускать ваши скрипты, но не предоставляет специальную «проводку» ресурсов песочницы.
Руководство Microsoft по запуску runbook'ов на Hybrid Runbook Worker: Run runbooks on a Hybrid Runbook Worker.
Решение
Используйте runbook на PowerShell, чтобы получить учетные данные через Get-AutomationPSCredential на Hybrid Runbook Worker и передать их вашему процессу Python через переменные окружения. Такой подход задействует штатный механизм получения учетных данных Azure Automation, который работает на Hybrid Runbook Worker, а затем передает имя пользователя и пароль в Python, не выставляя их как входные параметры runbook'а.
Ниже пример PowerShell, который извлекает сохраненные учетные данные и запускает ваш Python-скрипт с установленными переменными окружения:
$creds = Get-AutomationPSCredential -Name "TestCredentials"
$env:RB_USER = $creds.UserName
$env:RB_PASS = $creds.GetNetworkCredential().Password
$pyFile = "C:\scripts\run_task.py"
python $pyFile
И соответствующий скрипт на Python, считывающий эти значения:
import os
user_val = os.getenv("RB_USER")
pass_val = os.getenv("RB_PASS")
print(f"Username: {user_val}")
print(f"Password: {pass_val}")
print("---DONE---")
Такой подход не допускает попадания секретов во входные параметры runbook'а. Передача паролей как input в Start-AzAutomationRunbook может показать их в открытом виде в разделе Input у runbook'а, поэтому так делать не стоит.
Если вы развиваете инфраструктуру Hybrid Runbook Worker, может пригодиться и это руководство: Migrate to extension-based Hybrid Runbook Workers.
Почему это важно
Hybrid Runbook Worker не копирует систему ресурсов песочницы Azure Automation, поэтому код, написанный для облачных runbook'ов, не может рассчитывать на наличие или одинаковое поведение automationassets. «Проброс» учетных данных через обертку на PowerShell с использованием переменных окружения дает простой и повторяемый способ безопасно запускать Python на ваших машинах под управлением Automation.
Некоторые команды предпочитают централизовать секреты вне ресурсов Automation. Использование Azure Key Vault из Python вместе с azure-identity и azure-keyvault-secrets — рабочий вариант, который полностью оставляет получение секретов в коде Python. В других ситуациях разработчики выбирают модуль keyring для локального хранения секретов. Выбирайте то, что соответствует вашим операционным и регуляторным требованиям.
Итоги и практические советы
Если вам нужны учетные данные Azure Automation внутри Python на Hybrid Runbook Worker, не полагайтесь на automationassets. Получайте учетные данные через Get-AutomationPSCredential в PowerShell и передавайте их в Python через переменные окружения, выставленные непосредственно перед запуском процесса. Избегайте передачи паролей через входные параметры runbook'а, чтобы не допустить их случайной засветки в логах. Для более широкой секрет-менеджмент стратегии рассмотрите Azure Key Vault, чтобы вовсе убрать чувствительные данные из обертки runbook'а. С таким подходом вы получите надежную передачу учетных данных на Hybrid Runbook Worker без зависимости от модулей, доступных только в облаке.