【问题标题】:Azure Automation - how to split out common functionsAzure 自动化 - 如何拆分常用功能
【发布时间】:2021-11-14 16:40:23
【问题描述】:

我想知道是否有一种方法可以在 Azure 自动化的单独运行手册中定义常用函数?例如,我有一个日志记录功能,可以为消息添加时间戳,并在我在多个运行手册中使用的错误时退出。我想定义一次,然后从其他运行手册中调用它。如果我以后改变它,我只需要在一个地方改变它。

我知道我可以定义父/子 Runbook 并将它们内联调用,这让我想知道是否可以拆分出一个函数定义,例如,然后从另一个 Runbook 调用该 Runbook 以将函数“导入”到当前运行手册。例如,我有一个名为“Test-FunctionDefinition”的运行手册,其中包含以下代码:

function Test-FunctionDefintion() {
  param (
    [String] $TestParam
  )
  Write-Output "Output from test function: $TestParam"
}

我希望能够像这样从另一个运行手册内联调用它来定义函数,然后能够使用该函数:

& .\Test-FunctionDefinition.ps1

Test-FunctionDefinition -TestParam "Test String"

我尝试创建两个 Runbook,但它似乎在第 1 行调用 Runbook“Test-FunctionDefiniton”很好,随后在第 3 行调用该函数失败:

Test-FunctionDefinition:术语“Test-FunctionDefinition”未被识别为 cmdlet、函数、脚本文件或可运行程序的名称。

我正在尝试做的事情可能吗?我意识到我可以修改我的运行手册并致电& .\Test-FunctionDefinition.ps1 -TestParam "Test String",但如果可能的话,我更愿意以其他方式进行。

【问题讨论】:

    标签: powershell azure-automation


    【解决方案1】:

    看起来应该可以 - Create modular runbooks in Automation

    你有两个选择:

    • 内联 - 子 Runbook 与父 Runbook 在同一作业中运行。
    • Cmdlet - 为子 Runbook 创建单独的作业。

    对于 powershell runbook 应该很简单

    $vm = Get-AzVM -ResourceGroupName "LabRG" -Name "MyVM"
    $output = .\PS-ChildRunbook.ps1 -VM $vm -RepeatCount 2 -Restart $true
    

    【讨论】:

    • 是的,我说我知道我可以使用 .ps1 运行另一个 Runbook Inline,并且我已经尝试过,但是在调用另一个 Runbook 后,其中定义的函数不可用.而您的选项 2,将其作为 cmdlet 运行,意味着它会产生另一个工作;该函数不会被读入当前作业。理想情况下,我想在运行手册中定义一些函数,然后从另一个运行手册调用该运行手册,并能够使用这些函数。这可能是不可能的;您描述的方式可能是我最好的选择,我必须将每个函数拆分为单独的运行手册。但我希望不会。
    【解决方案2】:

    我做了更多测试以确保我最初的假设(在一个脚本中定义一个函数并在另一个脚本中调用它)按预期工作,但我得到了同样的错误。看来您需要点源而不是使用 &。这在 PowerShell 控制台和 Azure 自动化中都有效:

    . .\Test-FunctionDefinition.ps1
    
    Test-FunctionDefinition -TestParam "Test String"
    

    注意开头的 '.'代替 '&'。我需要看看它们之间有什么区别......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-08
      • 2019-03-26
      • 2020-07-31
      • 2016-02-26
      • 1970-01-01
      • 1970-01-01
      • 2012-07-19
      相关资源
      最近更新 更多