Автоматизация Azure — как разделить общие функции

#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;». Мне нужно будет посмотреть, в чем разница между ними…