【问题标题】:Issue in creating Azure HDInsight with Data lake using Template Deployment使用模板部署创建带有数据湖的 Azure HDInsight 时出现问题
【发布时间】:2017-04-28 11:09:37
【问题描述】:

我正在尝试使用模板部署创建 带有数据湖的 Azure HDInsight。但是我在执行模板时遇到了一个问题,因为我认为原因是“服务主体名称”与 azure 数据湖存储的集成。

错误:

"message": "DeploymentDocument 'AmbariConfiguration_1_7' 验证失败。错误:'获取数据湖存储帐户 demodls 访问权限时出错:从 AppPrincipalId XXXXXX-XXXXXXXXX-XXXXX-XXX 的 AAD 获取 OAuth 令牌时出错-XXXXX。

请在下面的屏幕截图中找到更多详细信息。

我已尝试创建 AD webapp 并为该应用分配了“所有者”角色。然后我将其分配给订阅的所有者。然后为该应用添加了“数据湖权限”。但我仍然认为我可能会失踪。

集群集成片段

"properties": {
                "clusterVersion": "[parameters('clusterVersion')]",
                "osType": "Linux",
                "tier": "standard",
                "clusterDefinition": {
                    "kind": "[parameters('clusterKind')]",
                    "configurations": {
                        "gateway": {
                            "restAuthCredential.isEnabled": true,
                            "restAuthCredential.username": "[parameters('clusterLoginUserName')]",
                            "restAuthCredential.password": "[parameters('clusterLoginPassword')]"
                        },
                        "core-site": {
                            "fs.defaultFS": "adl://home",
                            "dfs.adls.home.hostname": "demodls.azuredatalakestore.net",
                            "dfs.adls.home.mountpoint": "/clusters/democluster/"
                        },
                        "clusterIdentity": {
                            "clusterIdentity.applicationId": "XXXXX-XXXXX-XXXXX-XXXXX-XXXXX",
                            "clusterIdentity.certificate": "[parameters('identityCertificate')]",
                            "clusterIdentity.aadTenantId": "https://login.windows.net/XXXXXXXX-XXXX-XXXX-XXXXX-XXXXXXXXXX",
                            "clusterIdentity.resourceUri": "https://management.core.windows.net/",
                            "clusterIdentity.certificatePassword": "[parameters('identityCertificatePassword')]"
                        }
                    }
                },

在这里我有几个疑问

  1. “parameter.json”中的 clusterpassword、sshpassword 等“SecureString”值是否应该以明文形式提供,或者我必须将其转换为 Securestring 并为其提供安全字符串值?

  2. “identityCertificate”字段应该是“Certificate.pfx”文件内容的“base64”编码,否则我必须将其转换为 Base64 -> SecureString 并在 parameter.json 中提供?

帮助非常感谢!谢谢

问候

【问题讨论】:

    标签: azure azure-resource-manager azure-hdinsight azure-data-lake


    【解决方案1】:

    identityCertificate 应该是证书 .pfx 文件内容的 base64 编码字符串表示。它在 ARM 模板定义文件中被标记为类型 SecureString,因此当您获取未来的部署历史记录时,不会存储/返回纯文本。使用 SecureString 标记字段有助于确保密码和其他此类字段不会保留在您的部署历史记录中。

    解决如何创作集群创建 ARM 模板的一种简单方法是转到 Azure 门户,并按照您在模板中的需要创建集群。在“摘要”步骤中单击“创建”之前,下载 ARM 模板以查看正在部署的内容。 “创建”旁边有一个链接可以执行此操作。

    我希望您会注意到指定主 ADLS 帐户的方式有所不同。使用下载的 ARM 模板中的配置方式,您应该一切顺利。

    【讨论】:

      【解决方案2】:

      @马特 H

      我已经下载了我们创建 HDInsight 时在门户网站生成的模板,但它仍然无法工作。

      请在下面找到我的 powershell 脚本。

       //To Create Resources
       $resourceGroupName = "demoesprg"
       New-AzureRmResourceGroup -Name $resourceGroupName -Location "East US 2"
       $dataLakeStoreName = "demoespdls"
       New-AzureRmDataLakeStoreAccount -ResourceGroupName $resourceGroupName -Name $dataLakeStoreName -Location "East US 2"
       Test-AzureRmDataLakeStoreAccount -Name $dataLakeStoreName
       $myrootdir = "/"
       New-AzureRmDataLakeStoreItem -Folder -AccountName $dataLakeStoreName -Path $myrootdir/clusters/demoespcluster
      
       $templatefilepath = "C:\Azure-saml\template.json"
       $SSHpass = ConvertTo-SecureString -String "Demoesp1234$" -AsPlainText -Force
      
        //Create .pfx certificate
       $certFolder = "C:\Azure-saml\certs"
       $certFilePath = "$certFolder\demoespcert.pfx"
       $certStartDate = (Get-Date).Date
       $certStartDateStr = $certStartDate.ToString("MM/dd/yyyy")
       $certEndDate = $certStartDate.AddYears(1)
       $certEndDateStr = $certEndDate.ToString("MM/dd/yyyy")
       $certName = "demoespcert"
       $certPassword = "democert123$"
       $certPasswordSecureString = ConvertTo-SecureString $certPassword -AsPlainText -Force 
       $cert = New-SelfSignedCertificate -DnsName $certName -CertStoreLocation cert:\CurrentUser\My 
       $certThumbprint = $cert.Thumbprint
       $cert = (Get-ChildItem -Path cert:\CurrentUser\My\$certThumbprint) 
       Export-PfxCertificate -Cert $cert -FilePath $certFilePath -Password $certPasswordSecureString 
       $certificatePFX = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2($certFilePath, $certPasswordSecureString)
       $credential = [System.Convert]::ToBase64String($certificatePFX.GetRawCertData())
      
       //create ActiceDriectory Application
       $application = New-AzureRmADApplication `
           -DisplayName "ESPSPN" `
           -HomePage "https://demoespcluster.hdinsight.net" `
           -IdentifierUris "https://demoespcluster.hdinsight.net" `
           -CertValue $credential  `
           -StartDate $certificatePFX.NotBefore  `
           -EndDate $certificatePFX.NotAfter 
       Start-Sleep -Seconds 20
      
       //Create Service Principla
       $applicationId = $application.ApplicationId
       $servicePrincipal = New-AzureRmADServicePrincipal -ApplicationId $applicationId
       $objectId = $servicePrincipal.Id
      
       //Assign Permissions
       Set-AzureRmDataLakeStoreItemAclEntry -AccountName $dataLakeStoreName -Path / -AceType User -Id $objectId -Permissions All
       Set-AzureRmDataLakeStoreItemAclEntry -AccountName $dataLakeStoreName -Path /clusters -AceType User -Id $objectId -Permissions All
       Set-AzureRmDataLakeStoreItemAclEntry -AccountName $dataLakeStoreName -Path /clusters/demoespcluster -AceType User -Id $objectId -Permissions All
      
      
       //Execute Scripts
       $tenantID = (Get-AzureRmContext).Tenant.TenantId
       $secureCert = [System.Convert]::ToBase64String((Get-Content $certFilePath -Encoding Byte))
       //$dsecureCert = ConvertTo-SecureString $secureCert -AsPlainText -Force
      
       New-AzureRmResourceGroupDeployment `
          -ResourceGroupName $resourceGroupName `
          -TemplateFile $templatefilepath `
          -identityCertificate $secureCert `
          -identityCertificatePassword $certPasswordSecureString `
          -clusterName  $certName `
          -clusterLoginPassword $SSHpass `
          -sshPassword $SSHpass `
          -servicePrincipalApplicationId $applicationId
      

      错误:

      New-AzureRmResourceGroupDeployment:晚上 11:15:00 - DeploymentDocument “AmbariConfiguration_1_7”验证失败。错误:'错误同时 获取对数据湖存储帐户 demoespdls 的访问权限:访问 拒绝。

      我在这里错过了什么?

      更新: 脚本是正确的,但我的自签名证书有问题。一旦使用了有效的证书,我就能够成功地创建集群!!谢谢。

      【讨论】:

      • 嗨,卡西克。感谢您提供此信息。通过门户 UI 部署时部署是否成功?此外,对于 PowerShell 部署脚本,文件夹 /clusters/demoespcluster/ 是否为空?如果没有,您可能需要转到门户 UI 或 PowerShell 并递归地授予对应用程序的访问权限,然后再继续,因为可能存在集群在没有此类权限的情况下无法访问的文件。这是该过程的指南:1drv.ms/w/s!AvdZLquGMt47gz3ks4YwQRMXGi3j
      • 我能够通过门户创建它,但我只能从 powershell 中遇到这个问题。文件夹也是空的。
      • 我能够使用上述脚本成功创建带有 Datalake 存储的 HDInsight 群集。上面的脚本很好,但问题是我的自签名证书没有正确生成。我通过 Azure 门户下载证书时使用 Datalake 创建 HDInsight 并将其用于创建 AD 服务主体并且它有效!!。感谢您的帮助!
      猜你喜欢
      • 2018-11-13
      • 1970-01-01
      • 2021-07-06
      • 1970-01-01
      • 1970-01-01
      • 2021-10-23
      • 2021-11-20
      • 1970-01-01
      • 2021-04-10
      相关资源
      最近更新 更多