Azure自動化部署運維淺談

    本次來談一談如何在Azure中實現一些簡單的自動化運維的需求,一般來講自動化運維我們通過很多第三方的工具平臺實現,比較流行的目前有很多,比如老牌的chef, puppet,新興的PowerShell DSC, ansible。這些應該都是耳熟能詳的了。

    

    那麼在Azure平臺,如何實現自動化部署和運維?

    方法其實很多,第一種方法比較傳統,即仍然使用Chef, Ansible等工具平臺進行自動化運維,仍然可以保持以往的體驗,無需學習任何新的技術

    在Azure中也對這種方式提供了很多的技術支持,在應用市場中也可以找到這種鏡像

image001.png


image002.png




    在VM的extension裏也可以找到很多相關的extension

image003.png




    

    這種方式對於已經很熟悉這些工具的人來說,應該是最容易的方式

 

    當然,除此之後還有一些其他的方法也可以實現一些簡單的自動化運維,部署的目的,如果是一些簡單的需求,也可以考慮使用這類方法,比如說多臺Windows VM想要加入同一個域裏,或者是多臺web服務器想要統一安裝某些軟件或者角色,這類較爲簡單的需求,則可以使用Azure自帶的Custom Script Extension來實現

 

    舉例來說,想要實現多臺VM加域,一般來講加域可以通過批量推送腳本,或者是手動的方式來實現,在Azure中,實際上我們不需要登錄到任何一臺VM中,只需要在外部網絡即可實現加域的效果,只要要加域的vm到DC之間的網絡是聯通的,並且DNS可以正常解析到域名即可。

 

    比如,現在我們有一臺DC,兩位web服務器,web01及web02,現在有兩個需求

1.      將兩臺服務器加入到域中

2.      對兩臺服務器安裝IIS角色


    第一個需求,我們可以通過Azure自帶的JsonADDomainExtension實現,只需要提供一個加域的cred,以及域名,即可將服務器加入到域中,命令也非常簡單


    

    直接在PowerShell中運行以下命令,將<>裏的內容替換爲實際的內容即可

Set-AzureRmVMADDomainExtension -DomainName <Domain name> -Credential <domain Cred> -Restart -ResourceGroupName <resource group name> -VMName <vm name> -Name <Extension Name> -TypeHandlerVersion "1.3" -JoinOption 3


    這裏又衍生出另一個問題,credential如果寫在腳本中,很有可能是以明文的形式,這樣肯定是不行的,如何能保證credential的安全呢?一種方法是可以通過Get-Credential實現,將賬戶密碼直接以加密形式保存在變量裏。但是這樣的話加域過程中,還需要一些人爲的參與。除此之外,其實還可以通過Azure的key vault服務,將賬戶密碼保存在key vault中,通過powershell進行調取


    Azure Key Vault 是一個用於安全地存儲和訪問機密的工具。 可以通過Azure Key Vault保存例如API 密鑰、密碼或證書等關鍵信息。舉例來說,我們可以把有權限加域的域賬戶賬戶名和密碼保存在key vault中,然後通過PowerShell獲取這些信息,作爲加域的credential進行加域操作

    

    創建key vault的方法很簡單,首先在Azure中選擇好Key Vault服務,點擊添加

image004.png



    這裏輸入一些基本信息,比如location, vault的名字等

image005.png


    創建完成後,因爲我們是要保護一些明文信息,所以只需要選擇secrets即可,如果是要保存證書,也可以選擇certificates,選擇generate secret

image006.png

    

    之後分別錄入domain username以及domain password

image007.png


    image008.png


    可以看到這些信息在key vault裏是以加密的形式存在的,之後可以通過PowerShell命令Get-AzureKeyVaultSecret獲取這些值

    運行Get-AzureKeyVaultSecret -VaultName mxytestvault -Name domainuser可以看到這個secret的相關信息

image009.png


    如果獲取這個secret的secretvalue,會看到這是一個加密的字符串

image010.png

    

    如果想獲取明文信息,可以獲取SecretValueText屬性

image011.png


    通過這種方式,即可實現無人蔘與的部署,同時又能保證信息的安全

    下邊來看下具體如何將key vault與vm extension結合在一起,實現自動化的部署操作


    假設要加域的VM都在一個資源組中,則可以通過以下腳本,直接將資源組中的VM添加到域中

    腳本內容如下:


param
(
    [parameter(Mandatory = $true)]
    [string]$RGName,#資源組名
    [parameter(Mandatory = $false)]
    [string]$vaultname = "mxytestvault",#Azure key vault 名稱
    [parameter(Mandatory = $false)]
    [string]$Domain = "mxyo365.com" #要加入的域名
)




function Join-Domain {
    param (
        [Parameter(Mandatory = $true)]
        $RGName,
        [Parameter(Mandatory = $true)]
        $VMName,
        [Parameter(Mandatory = $true)]
        $Cred
        
        
        
    )
    
    
    #filter dc vms 
    if ($VMName -notlike "*DC*") {

        #Get Azure vm
        $vm = Get-AzureRmVM -ResourceGroupName $RGName -Name $VMName -erroraction SilentlyContinue
        if ($vm -ne $null) {
            $ExtensionName = $VMName + (Get-Random -Minimum 1 -Maximum 100)
            
            try {

                #join domain with Azure dommain extension
                $Error.Clear()
                Write-Output "Setting domain join extension for vm $VMName, extension name:$ExtensionName"
                Set-AzureRmVMADDomainExtension -DomainName $Domain -Credential $Cred -Restart -ResourceGroupName $RGName -VMName $VMName -Name $ExtensionName -TypeHandlerVersion "1.3" -JoinOption 3
    
            }
            catch {
                Write-Output $Error[0].Exception.Message
            }

        }
        else {
            Write-Output "VM $VMName does not exist."
            
        }
    }
    
}




#Get secret with PowerShell
$domainuname = (Get-AzureKeyVaultSecret -VaultName $vaultname -Name domainuser).SecretValueText
Write-Output "Get username from vault $vaultname"
$domainfulluname = "$domainuname@$Domain"
$domainpwd = (Get-AzureKeyVaultSecret -VaultName $vaultname -Name domainpassword).SecretValue
Write-Output "Get password from vault $vaultname"

#Create credential with secret 
$DomainCred = New-Object System.Management.Automation.PSCredential($domainfulluname, $domainpwd)

#Get VMs
$VMS = Get-AzureRmVM -ResourceGroupName $RGName

foreach ($VM in $VMS) {
    Join-Domain -RGName $RGName -VMName $VM.Name -Cred $DomainCred
}

    


腳本運行時,只需要指定資源組名,vault名稱,要加入的域名即可


.\RGJoinDomain.ps1 -RGNAME test -vaultname mxytestvault -Domain mxyo365.com

通過提示可以看到,Web01和web02已經成功安裝extension

image012.png


登錄到VM後,可以看到WEB01和WEB02都已經加入到域中了

image013.png


image014.png


  加域完成後,如果希望能安裝一些IIS等功能角色,或者是軟件,可通過Azure VM extension實現,方法很簡單,以下是通過extension安裝IIS角色的腳本

param(
    [Parameter(Mandatory = $true, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
    [Alias('VMName')]
    [string]$Name,
    [Parameter(Mandatory = $true, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
    [string]$ResourceGroupName
)
begin {
    
    Write-Output "Start to install IIS for vms"

}
process {
    try {
        $ExtensionName = $Name + "-IIS-" + (Get-Random -Minimum 1 -Maximum 100)
        Write-Output "Trying to install iis for vm $Name, extension name:$ExtensionName"     
        $vm=Get-AzureRmVM -ResourceGroupName $ResourceGroupName -Name $Name -ErrorAction Stop
        Set-AzureRmVMExtension `
            -ResourceGroupName $ResourceGroupName `
            -ExtensionName $ExtensionName `
            -VMName $Name `
            -Publisher Microsoft.Compute `
            -ExtensionType CustomScriptExtension `
            -TypeHandlerVersion 1.4 `
            -SettingString '{"commandToExecute":"powershell Add-WindowsFeature Web-Server; powershell Add-Content -Path \"C:\\inetpub\\wwwroot\\Default.htm\" -Value $($env:computername)"}' `
            -Location $vm.Location
        
    }
    catch {
        Write-Warning $_
    }
}
end { }


    這個腳本是支持管道操作的,運行起來非常方便,比如想給包含web名稱的服務器安裝IIS,可以首先篩選出來這些服務器,然後通過管道將值傳給install-iis腳本,即可通過extension進行安裝


    Get-AzureRMVM -ResourceGroupName test|?{$_.name -like *web*}|install-iis.ps1image015.png

    安裝完成IIS後,腳本會在default頁添加計算機名,訪問計算機公網IP時,可以看到已經可以顯示計算機的名稱

    image017.png




    

    

image018.png

    實際上VM extension在運行時,會將命令的內容下載到VM內部運行,可以在C:\Package\Plugins裏看到這些extension的目錄

image016.png


    可以直接在文件夾裏看到extension運行的狀態

微信截圖_20190124172845.png



    也可以在C:\WindowsAzure\Logs\Plugins\Microsoft.Compute.CustomScriptExtension\1.9.3找到對應的log等信息

    微信截圖_20190124173025.png


    基本上就是這樣,當然這只是拋磚引玉,Azure VM的extension還是很好用的,可以做多一些嘗試

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章