Azure自动化部署运维浅谈
本次来谈一谈如何在Azure中实现一些简单的自动化运维的需求,一般来讲自动化运维我们通过很多第三方的工具平台实现,比较流行的目前有很多,比如老牌的chef, puppet,新兴的PowerShell DSC, ansible。这些应该都是耳熟能详的了。
那么在Azure平台,如何实现自动化部署和运维?
方法其实很多,第一种方法比较传统,即仍然使用Chef, Ansible等工具平台进行自动化运维,仍然可以保持以往的体验,无需学习任何新的技术
在Azure中也对这种方式提供了很多的技术支持,在应用市场中也可以找到这种镜像
在VM的extension里也可以找到很多相关的extension
这种方式对于已经很熟悉这些工具的人来说,应该是最容易的方式
当然,除此之后还有一些其他的方法也可以实现一些简单的自动化运维,部署的目的,如果是一些简单的需求,也可以考虑使用这类方法,比如说多台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服务,点击添加
这里输入一些基本信息,比如location, vault的名字等
创建完成后,因为我们是要保护一些明文信息,所以只需要选择secrets即可,如果是要保存证书,也可以选择certificates,选择generate secret
之后分别录入domain username以及domain password
可以看到这些信息在key vault里是以加密的形式存在的,之后可以通过PowerShell命令Get-AzureKeyVaultSecret获取这些值
运行Get-AzureKeyVaultSecret -VaultName mxytestvault -Name domainuser可以看到这个secret的相关信息
如果获取这个secret的secretvalue,会看到这是一个加密的字符串
如果想获取明文信息,可以获取SecretValueText属性
通过这种方式,即可实现无人参与的部署,同时又能保证信息的安全
下边来看下具体如何将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 SilentlyContinueif ($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 $RGNameforeach ($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
登录到VM后,可以看到WEB01和WEB02都已经加入到域中了
加域完成后,如果希望能安装一些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 StopSet-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.ps1
安装完成IIS后,脚本会在default页添加计算机名,访问计算机公网IP时,可以看到已经可以显示计算机的名称
实际上VM extension在运行时,会将命令的内容下载到VM内部运行,可以在C:\Package\Plugins里看到这些extension的目录
可以直接在文件夹里看到extension运行的状态
也可以在C:\WindowsAzure\Logs\Plugins\Microsoft.Compute.CustomScriptExtension\1.9.3找到对应的log等信息
基本上就是这样,当然这只是抛砖引玉,Azure VM的extension还是很好用的,可以做多一些尝试
转载于:https://blog.51cto.com/mxyit/2346350
相关文章:
NDK/JNI demo ( 五 ) ORB_SLAM2在Android上的移植过程
Android平台搭建和NDK环境配置 Android移植基础 NDK是集成的Android中调用C代码的工具包,核心是JNI(Java Native Interface)技术,具体这里略过不表。只说说NDK开发的基本步骤: 1. 编写Java代码:在Java中定义…

[Nancy On .Net Core Docker] 轻量级的web框架
.net core现在已经有了大的发展,虽然笔者现在已经从事python开发,但是一直在关注.net的发展,在逛博客园的时候,发现有大家都会提到Nancy这个框架,在简单的使用之后,发现竟然是如此的简单而优雅 public clas…

【算法】【ACM】深入理解Dijkstra算法(单源最短路径算法)
Dijkstra算法是用来求解从某个源点到其他各顶点的最短路径(单源最短路径)。 下面的Dijkstra算法的讲解都是基于这个有向图,在遇到其他问题可以类比。 算法的基本思想: 把图中的定点分成两组,第一组包括已确定最短路径…

智能POS常见问题整理
智能POS预警值为小于所设的数量,H5就会变为锁定状态 智能POS查看数据库方法: 商米D1:设置-存储设备和USB-内部存储设备-浏览-winboxcash tablet.db为智能POS数据库 Winbox文件夹内,为相应logcat文件,应用出现问题时&am…
解决安卓系统写入SD卡权限问题
1.需要用户手动赋予的权限( Dangerous Permissions) 所属权限组权限日历READ_CALENDAR日历WRITE_CALENDAR相机CAMERA联系人READ_CONTACTS联系人WRITE_CONTACTS联系人GET_ACCOUNTS位置ACCESS_FINE_LOCATION位置ACCESS_COARSE_LOCATION麦克风RECORD_AUDIO…

【ACM】【STL】stack应用
C Stacks(堆栈) C Stack(堆栈) 是一个容器类的改编,为程序员提供了堆栈的全部功能,——也就是说实现了一个先进后出(FILO)的数据结构。 操作比较和分配堆栈empty()堆栈为空则返回真…

CHUCK手把手带你搞定OPENSTACK
以下是原文链接:http://blog.oldboyedu.com/openstack/转载于:https://blog.51cto.com/bovin/1858198

JVM基础面试题及原理讲解
2019独角兽企业重金招聘Python工程师标准>>> 本文从 JVM 结构入手,介绍了 Java 内存管理、对象创建、常量池等基础知识,对面试中 JVM 相关的基础题目进行了讲解。 写在前面(常见面试题) 基本问题 介绍下 Java 内存区域…
SLAM前端 ---------特征提取之ORB(ORB与SIFT与SURF)
ORB 论文翻译: 一种特征匹配替代方法:对比SIFT或SURF 1.ORB特征简介 ORB是Oriented FAST and Rotated BRIEF(oFAST and rBRIEF)的简称,ORB的名字已经说明了其来源,其实ORB特征是采用FAST方法来检测提取特…

oracle 内存分配和调优 总结
一直都想总结一下oracle内存调整方面的知识,最近正好优化一个数据库内存参数,查找一些资料并且google很多下。现在记录下来,做下备份。 一、概述: oracle 的内存可以按照共享和私有的角度分为系统全局区…

【ACM】Doubly Linked List(STL list)
题目链接:https://vjudge.net/problem/Aizu-ALDS1_3_C 这一题一开始的时候想的是用vector,超时 #include <iostream> #include <stack> #include <cstdio> #include <cstring> #include <queue> #include <vector>…

IOS获取焦点页面上移问题
var u navigator.userAgent; var flag; var myFunction; var isIOS !!u.match(/(i1;( U;)? CPU.Mac OS X/); if (isIOS) { document.body.addEventListener(focusin, () > { //软键盘弹起事件flag true;clearTimeout(myFunction); }) document.body.addEventListener(f…
SLAM之特征匹配(二)————RANSAC--------翻译以及经典RANSAC以及其相关的改进的算法小结
本文翻译自维基百科,英文原文地址是:http://en.wikipedia.org/wiki/ransac RANSAC是“RANdom SAmple Consensus(随机抽样一致)”的缩写。它可以从一组包含“局外点”的观测数据集中,通过迭代方式估计数学模型的参数…

【ACM】树 小结
树是一种表达层级结构的数据结构,也是实现高效算法与数据结构的基础。 学习之前的基础:数组,循环处理,结构体,递归函数。 树:由结点(node)和连接结点的边(edge…

【cocos2d-js官方文档】九、cc.loader
概述 原来的cc.Loader被改造为一个单例cc.loader,采用了插件机制设计,让loader做更纯粹的事。 各种资源类型的loader可以在外部注册进来,而不是直接将所有的代码杂揉在cc.Loader中,更好的方便管理以及用户自定义loader的创建。 cc…

更换VC后DDC提示证书不可用
问题描述:客户环境由Windows VC更换成Linux VC后,DDC提示证书不可用问题原因:因为VC更换后,存储在DDC数据库HostingUnitServiceSchema.HypervisorConnectionSSLThumbprint表中证书指纹信息和新得VC证书指纹信息不匹配。解决方法&a…
尺度空间理论与图像金字塔
我们之所以决定使用卷积后的特征是因为图像具有一种“静态性”的属性。也就是说使用卷积就是为了提取显著特征,减少特征维数,减少计算量。 在对图像进行卷积操作后的只管现象:图像变得模糊了,可是我们依然能够分辨出是什么&#x…

【ACM】 multiset 的 一些应用
一、The kth great number 题目链接:https://vjudge.net/problem/HDU-4006 用set写超时 (在VJ里,用C显示Compilation Error,选择G,则是TLE) #include <iostream> #include <set> #include &…

apache2.2 做后端,增加真实ip到日志中
apache2.2使用mod_remoteip模块 一.安装 wget https://github.com/ttkzw/mod_remoteip-httpd22/raw/master/mod_remoteip.c/usr/local/apache/bin/apxs -i -c -n mod_remoteip.so mod_remoteip.c 二.添加Apache配置vi /usr/local/apache/conf/httpd.confInclude conf/extra/htt…

高可用方案系统架构
2019独角兽企业重金招聘Python工程师标准>>> 高可用方案 系统架构 转载于:https://my.oschina.net/qiongtaoli/blog/3007587
OpenCV3.2.0+VS2017在window10开发环境配置记录
本机环境:win10 64位 OpenCV3.2.0 Visual Studio 2017 最后结果,亲测可用OpenCV官方下载地址: http://opencv.org/releases.html#本人选择opencv3.2.0基于Windows平台。读者根据自己需要选择合适版本及平台下载。 选择window版本的opencv下载…

C++vector迭代器失效的问题
转载:http://blog.csdn.net/olanmomo/article/details/38420907 转载:http://blog.csdn.net/stpeace/article/details/46507451 转载:http://www.cnblogs.com/xkfz007/articles/2509433.html 转载:http://www.cnblogs.com/BeyondAnyTime/archive/2012/08/13/2636375.html 有这样…

【HDU】1251统计难题 (字典树:二维数组,结构体数组,链表,map)
使用二维数组或者结构体数组都可以,但是在计数的时候有一点点小区别 一、结构体数组 #include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #include <string> typedef long long ll; using namespace…

Jmeter干货 不常用却极其有用的几个地方
1. Jmeter测试计划下Run Thread Groups consecutively 表示序列化执行测试计划下所有线程组中的各个请求 如下图配置,新建的测试计划中,不默认勾选此项, 而享用Jmeter做接口自动化测试的同学们,会发现一个问题是,可能多…
图像滤波总结(面试经验总结)
目录 图像平滑处理,6种滤波总结的综合示例 【盒式滤波、均值滤波、高斯滤波、中值滤波、双边滤波导向滤波】 1-图像滤波 2-代码演示 3-显示结果 4-程序说明 5 角点检测(Harris,Fast,surf) 图像平滑处理,6种滤波总结的综合示…

【小贴士】DEV 多行注释
多行注释 Ctrl / 取消多行注释 Ctrl ,

JSP+Servlet基础一
2019独角兽企业重金招聘Python工程师标准>>> JSP中的指令: 格式:<%指令的名称(page,taglib,include...) 属性属性值%> 指令中的page:用于整个页面,定义与页面相关的属性。page属性一共有13个。 1、常…

Chameleon跨端框架——壹个理想主义团队的开源作品
文章较长,信息量很大,请耐心阅读,必然有收获。下面正文开始~背景解决方案原理久经考验生产应用举例易用性好多态协议学习成本低渐进式接入业内对比后期规划理想主义历经近20个月打磨,滴滴跨端方案chameleon终于开源了github.com/d…

尺度空间理论与图像金字塔(二)
SIFT简介 整理一下方便阅读,作者写的东西摘自论文,在此感谢xiaowei等的贡献 DoG尺度空间构造(Scale-space extrema detection)http://blog.csdn.net/xiaowei_cqu/article/details/8067881关键点搜索与定位(Keypoint l…

仿桌面通知pnotify插件
在做网站的时候,alert弹出框是非常常见的情形。但是,有些情况下,弹框对用户来说是并不友好的。调研了几个其他的提示插件了,发现pnotify比较好用,可配置性也高。 使用示例: <!DOCTYPE html> <html…