Azure自动化部署运维知识总结

Windows Windows 2个月前 (08-15) 5次浏览 未收录 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",#Azurekeyvault名称
[parameter(Mandatory=$false)]
[string]$Domain="mxyo365.com"#要加入的域名
)




functionJoin-Domain{
param(
[Parameter(Mandatory=$true)]
$RGName,
[Parameter(Mandatory=$true)]
$VMName,
[Parameter(Mandatory=$true)]
$Cred



)


#filterdcvms
if($VMName-notlike"*DC*"){

#GetAzurevm
$vm=Get-AzureRmVM-ResourceGroupName$RGName-Name$VMName-erroractionSilentlyContinue
if($vm-ne$null){
$ExtensionName=$VMName+(Get-Random-Minimum1-Maximum100)

try{

#joindomainwithAzuredommainextension
$Error.Clear()
Write-Output"Settingdomainjoinextensionforvm$VMName,extensionname:$ExtensionName"
Set-AzureRmVMADDomainExtension-DomainName$Domain-Credential$Cred-Restart-ResourceGroupName$RGName-VMName$VMName-Name$ExtensionName-TypeHandlerVersion"1.3"-JoinOption3

}
catch{
Write-Output$Error[0].Exception.Message
}

}
else{
Write-Output"VM$VMNamedoesnotexist."

}
}

}




#GetsecretwithPowerShell
$domainuname=(Get-AzureKeyVaultSecret-VaultName$vaultname-Namedomainuser).SecretValueText
Write-Output"Getusernamefromvault$vaultname"
$domainfulluname="$domainuname@$Domain"
$domainpwd=(Get-AzureKeyVaultSecret-VaultName$vaultname-Namedomainpassword).SecretValue
Write-Output"Getpasswordfromvault$vaultname"

#Createcredentialwithsecret
$DomainCred=New-ObjectSystem.Management.Automation.PSCredential($domainfulluname,$domainpwd)

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

foreach($VMin$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"StarttoinstallIISforvms"

}
process{
try{
$ExtensionName=$Name+"-IIS-"+(Get-Random-Minimum1-Maximum100)
Write-Output"Tryingtoinstalliisforvm$Name,extensionname:$ExtensionName"
$vm=Get-AzureRmVM-ResourceGroupName$ResourceGroupName-Name$Name-ErrorActionStop
Set-AzureRmVMExtension`
-ResourceGroupName$ResourceGroupName`
-ExtensionName$ExtensionName`
-VMName$Name`
-PublisherMicrosoft.Compute`
-ExtensionTypeCustomScriptExtension`
-TypeHandlerVersion1.4`
-SettingString'{"commandToExecute":"powershellAdd-WindowsFeatureWeb-Server;powershellAdd-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

Azure自动化部署运维知识总结

 

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

喜欢 (0)
[]
分享 (0)
关于作者:
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址