Azure自动化部署运维浅谈
admin
2023-04-08 22:03:24
0

    本次来谈一谈如何在Azure中实现一些简单的自动化运维的需求,一般来讲自动化运维我们通过很多第三方的工具平台实现,比较流行的目前有很多,比如老牌的chef, puppet,新兴的PowerShell DSC, ansible。这些应该都是耳熟能详的了。

    

    那么在Azure平台,如何实现自动化部署和运维?

    方法其实很多,第一种方法比较传统,即仍然使用Chef, Ansible等工具平台进行自动化运维,仍然可以保持以往的体验,无需学习任何新的技术

    在Azure中也对这种方式提供了很多的技术支持,在应用市场中也可以找到这种镜像

Azure自动化部署运维浅谈


Azure自动化部署运维浅谈




    在VM的extension里也可以找到很多相关的extension

Azure自动化部署运维浅谈




    

    这种方式对于已经很熟悉这些工具的人来说,应该是最容易的方式

 

    当然,除此之后还有一些其他的方法也可以实现一些简单的自动化运维,部署的目的,如果是一些简单的需求,也可以考虑使用这类方法,比如说多台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 -Credential -Restart -ResourceGroupName -VMName -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服务,点击添加

Azure自动化部署运维浅谈



    这里输入一些基本信息,比如location, vault的名字等

Azure自动化部署运维浅谈


    创建完成后,因为我们是要保护一些明文信息,所以只需要选择secrets即可,如果是要保存证书,也可以选择certificates,选择generate secret

Azure自动化部署运维浅谈

    

    之后分别录入domain username以及domain password

Azure自动化部署运维浅谈


    Azure自动化部署运维浅谈


    可以看到这些信息在key vault里是以加密的形式存在的,之后可以通过PowerShell命令Get-AzureKeyVaultSecret获取这些值

    运行Get-AzureKeyVaultSecret -VaultName mxytestvault -Name domainuser可以看到这个secret的相关信息

Azure自动化部署运维浅谈


    如果获取这个secret的secretvalue,会看到这是一个加密的字符串

Azure自动化部署运维浅谈

    

    如果想获取明文信息,可以获取SecretValueText属性

Azure自动化部署运维浅谈


    通过这种方式,即可实现无人参与的部署,同时又能保证信息的安全

    下边来看下具体如何将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

Azure自动化部署运维浅谈


登录到VM后,可以看到WEB01和WEB02都已经加入到域中了

Azure自动化部署运维浅谈


Azure自动化部署运维浅谈


  加域完成后,如果希望能安装一些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.ps1Azure自动化部署运维浅谈

    安装完成IIS后,脚本会在default页添加计算机名,访问计算机公网IP时,可以看到已经可以显示计算机的名称

    Azure自动化部署运维浅谈




    

    

Azure自动化部署运维浅谈

    实际上VM extension在运行时,会将命令的内容下载到VM内部运行,可以在C:\Package\Plugins里看到这些extension的目录

Azure自动化部署运维浅谈


    可以直接在文件夹里看到extension运行的状态

Azure自动化部署运维浅谈



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

    Azure自动化部署运维浅谈


    基本上就是这样,当然这只是抛砖引玉,Azure VM的extension还是很好用的,可以做多一些尝试

上一篇:文件共享:NFS

下一篇:TOSCA是什么?

相关内容

热门资讯

徐巧芯剖析赖清德:最怕自己丢掉... 海峡导报综合报道 大罢免投票一周年纪念活动26日举行,台北市长蒋万安出席并怒轰,民进党一年过后仍没有...
中国红十字会总会紧急向广东调拨... 记者从中国红十字会总会了解到,针对台风“红霞”给广东造成的灾情,中国红十字会总会启动四级应急响应,紧...
这些少年,正被“毒蛋”围猎 李梦抽了几口电子烟,吐出了白色的烟雾,有一股浓烈的水果香味。随后,她看着自己握电子烟的手,跟身边人说...
蒋万安号召“倒阁”,卢秀燕认为... 海峡导报综合报道 台北市长蒋万安27日抛出震撼议题,表示多名民代向他提议推动“倒阁”,要求台行政机构...
特朗普将在白宫会见两位重要客人 俄乌战争仍未结束,美伊冲突又有升级风险。在此背景下,美国总统特朗普将在白宫接见乌克兰和以色列领导人。...
新租客打扫卧室柜子上掉落4万元... 近日,莲前西路某小区内,张倩签下一套房子的租赁合同。当天上午,她带着12岁的大女儿周馨怡和11岁的小...
六部门通告:禁止涉军队退役报废... 关于禁止涉军队退役报废装备销售活动的通告近年来,部分经营者在线上线下公开销售涉及我军退役报废装备(指...
九寨沟景区发生泥石流,部分道路... 7月26日,九寨沟风景名胜区管理局发布泥石流灾害通报:2026年7月26日15时50分,九寨沟景区局...
空调26度不凉是什么原因 从空调内部元器件来说,不凉的原因有可能是温度传感器出现故障了,也有可能是空调压缩机或者铜管出现问题,...
鲸鸿动能携手香港国际机场、鸿蒙...   2026 年 7 月 25 日,十余位鸿蒙车主组成的车队从珠海出发,经港珠澳大桥通关抵达香港国际...