#powershell #azure-automation
Вопрос:
Мне интересно, есть ли способ определить общие функции в отдельном модуле runbook в Azure Automation? Например, у меня есть функция ведения журнала, которая помечает сообщения и завершает работу при ошибках, которые я использую в нескольких книгах runbook. Я хотел бы определить его один раз, а затем вызвать его из других runbook. И если я изменю его в будущем, мне придется изменить его только в одном месте.
Я знаю, что могу определить родительские / дочерние runbook и вызвать их встроенными, что заставило меня задуматься, могу ли я, например, разделить определение функции, а затем вызвать этот runbook из другого runbook, чтобы «импортировать» функцию в текущий runbook. Так, например, у меня есть runbook под названием «Определение тестовой функции» со следующим кодом:
function Test-FunctionDefintion() {
param (
[String] $TestParam
)
Write-Output "Output from test function: $TestParam"
}
Я хотел бы иметь возможность вызывать его встроенным из другого модуля runbook, подобного этому, чтобы определить функцию, а затем иметь возможность использовать эту функцию:
amp; .Test-FunctionDefinition.ps1
Test-FunctionDefinition -TestParam "Test String"
Я попытался создать два модуля runbook, но, хотя он, похоже, вызывает модуль runbook «Test-FunctionDefiniton» в строке 1, впоследствии вызов функции в строке 3 завершается ошибкой с:
Определение функции-теста : Термин «Определение функции-теста» не распознается в качестве имени командлета, функции, файла сценария или действующей программы.
Возможно ли то, что я пытаюсь сделать? Я понимаю , что мог бы просто изменить свой модуль runbook и позвонить amp; .Test-FunctionDefinition.ps1 -TestParam "Test String"
, но предпочел бы сделать это другим способом, если возможно.
Ответ №1:
Похоже, это должно быть возможно — Создавать модульные runbook в автоматизации
У вас есть два варианта:
- Встроенные дочерние книги выполнения выполняются в том же задании, что и родительские.
- Командлет — Для дочернего модуля runbook создается отдельное задание.
Для powershell runbook это должно быть просто, как это
$vm = Get-AzVM -ResourceGroupName "LabRG" -Name "MyVM"
$output = .PS-ChildRunbook.ps1 -VM $vm -RepeatCount 2 -Restart $true
Комментарии:
1. Да, я сказал, что знаю, что могу запустить другой встроенный runbook, используя <имя runbook>.ps1, и что я пробовал это, но функция, определенная внутри, была недоступна после вызова другого runbook. И ваш вариант 2, запускающий его как командлет, означает, что он порождает другое задание; функция не будет прочитана в текущем задании. В идеале я хотел бы определить несколько функций в runbook, а затем вызвать этот runbook из другого и иметь возможность использовать эти функции. Это может оказаться невозможным; способ, который вы описываете, может быть моим лучшим вариантом, и мне придется разделить каждую функцию на отдельный модуль runbook. Но я надеюсь, что нет.
Ответ №2:
Я провел еще несколько тестов, чтобы убедиться, что мое первоначальное предположение (определение функции в одном сценарии и вызов ее в другом) сработало так, как я ожидал, и я получил ту же ошибку. Похоже, что вам нужно использовать точечный источник, а не использовать amp;. Это работало как в консоли PowerShell, так и в автоматизации Azure:
. .Test-FunctionDefinition.ps1
Test-FunctionDefinition -TestParam "Test String"
Обратите внимание на начальную букву». «вместо»amp;». Мне нужно будет посмотреть, в чем разница между ними…