Azure Runbook powershell脚本可复制所有webapp设置

时间:2016-02-18 16:18:45

标签: powershell azure azure-automation

我正在尝试将以下脚本作为Runbook运行,将所有设置从一个webapp复制到另一个,但是我收到以下错误。

try
{   
    $acct = Get-AzureRmSubscription
}
catch
{
    Login-AzureRmAccount
}

$fromResourceGroup = 'resourceG1'
$fromSite = 'website1'
$toResourceGroup = 'resourceG2'
$toSite = 'website2'

$props = (Invoke-AzureRmResourceAction -ResourceGroupName $fromResourceGroup -ResourceType Microsoft.Web/sites/Config -Name $fromSite/appsettings -Action list -ApiVersion 2015-08-01 -Force).Properties

$hash = @{}
$props | Get-Member -MemberType NoteProperty | % { $hash[$_.Name] = $props.($_.Name) }

Set-AzureRMWebApp -ResourceGroupName $toResourceGroup
        -Name $toSite -AppSettings $hash

异常:

Get-Member : You must specify an object for the Get-Member cmdlet.
At line:18 char:10
+ $props | Get-Member -MemberType NoteProperty | % { $hash[$_.Name] = $ ...
+          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : CloseError: (:) [Get-Member], InvalidOperationException
    + FullyQualifiedErrorId : NoObjectInGetMember,Microsoft.PowerShell.Commands.GetMemberCommand

Set-AzureRMWebApp : The term 'Set-AzureRMWebApp' is not recognized as the name of a cmdlet, function, script file, or 
operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try 
again.
At line:20 char:1
+ Set-AzureRMWebApp -ResourceGroupName $toResourceGroup
+ ~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (Set-AzureRMWebApp:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

-Name : The term '-Name' is not recognized as the name of a cmdlet, function, script file, or operable program. Check 
the spelling of the name, or if a path was included, verify that the path is correct and try again.
At line:21 char:9
+         -Name $toSite -AppSettings $hash
+         ~~~~~
    + CategoryInfo          : ObjectNotFound: (-Name:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

2 个答案:

答案 0 :(得分:3)

Automation Runbook使用不同的登录策略,因此您不应该只将PowerShell脚本复制到Runbook,并期望它的运行方式与本地运行完全相同。

您会看到命令Login-AzureRmAccount将弹出一个窗口,询问用户名和密码。但是,在自动化Runbook中,它无法实现。因此,您需要做一些其他事情才能正确登录。

  1. 为您的自动化创建一个新的Active Direcotry用户。

    一个。登录Azure Classic Portal

    湾选择 Active Directory ,然后单击您的默认Active Directory。

    ℃。点击用户,然后点击添加用户。对于用户类型,请选择您单位中的新用户。它不能是具有现有Microsoft帐户的用户,因为它在尝试登录Runbook时会失败。

    d。在用户个人资料上,对于角色,服务管理员已经足够好了,但如果需要,您可以选择全局管理员。不要启用多重身份验证。如果这样做,再次尝试登录Runbook时会失败。

    即记下用户的全名和临时密码。

    F。返回经典门户网站,点击设置> 管理员> 添加即可。输入您上面的用户名,然后选择您的订阅。

    克。注销Azure,然后使用刚刚创建的帐户重新登录。系统将提示您更改用户密码。

    注意:如果您已经拥有"非Microsoft"和MFA禁用的用户帐户,您可以跳过此步骤。有关详细信息,请参阅Configuring Azure Automation

  2. 为Runbook创建PS凭据资产。

    一个。登录Azure Portal,然后选择自动化。

    湾在自动化帐户设置边栏中,点击资产>的凭证

    enter image description here

    ℃。点击添加凭据,输入名称,用户名和密码(您在上一步中创建的用户名和密码),然后点击创建

    enter image description here

  3. 您应该使用以下内容登录。

    ,而不是简单地使用Login-AzureRmAccount
    $cred = Get-AutomationPSCredential -Name "<your credential name>"
    Login-AzureRmAccount -Credential $cred
    

答案 1 :(得分:0)

此错误:

Get-Member : You must specify an object for the Get-Member cmdlet.

表示$ props为null,因为您将其传递给Get-Member。所以

$props = (Invoke-AzureRmResourceAction -ResourceGroupName $fromResourceGroup -ResourceType Microsoft.Web/sites/Config -Name $fromSite/appsettings -Action list -ApiVersion 2015-08-01 -Force).Properties

由于某种原因,

正在评估为null。

这可能是因为您没有正确地对Azure进行身份验证。有关详细信息,请参阅https://azure.microsoft.com/en-us/blog/azure-automation-authenticating-to-azure-using-azure-active-directory/https://azure.microsoft.com/en-us/blog/announcing-azure-resource-manager-support-azure-automation-runbooks/