上周给各位小伙伴扒了扒Azure Resource Template的使用,大家应该已经通过模板方式交付基础架构有了一些体会。今天我们的就来在深入一些,经过上一篇介绍Resource Template的部署文章,我们仅仅是向Infrastructure As Code迈出了第一步,为什么这么讲?因为我们在谈论交付的时候可以有不同的界面,比如把界面划定在IaaS,PaaS,SaaS等,最理想的场景是我们通过一键部署我们就可以拿到可以访问的应用,我们在上次的模板部署中只是交付了一个满足业务要求的基础架构环境,界面在基础设施这一层,后续需要把环境中的虚拟机实例交付给应用部门进行应用开发和部署。那我们来想象一个共有云经典场景,应对业务突发访问弹性扩展,该场景下在业务突发时,我们仅仅通过弹性扩展交付到基础架构这一层是不够的,我们还需要通过快速自动的方式将业务应用部署到实例上才可以,如果这些通过手工干预,在业务突发场景下是无法做到快速响应的。那么应该如何来做呢?假设我们希望在Azure上通过IaaS自动化交付一个Apache Web服务,那么基本逻辑步骤如下,创建虚拟机实例,配置实例的环境参数,安装Apache服务,配置Apache服务。那么从自动化交付的逻辑抽象角度可以分为三个平面:基础架构交付、操作系统环境基础参数交付,应用交付。在各个平面交付上其实业内都有很多成熟的工具和方法,今天我们以Azure公有云平台为例来给大家举例介绍。
通过上一篇文章,大家应该已经有所了解可以通过Azure Resource Template实现基础架构交付,那么操作系统环境基础参数交付及应用交付如何在基础架构交付的环境上进行自动化部署呢,这里面其实主要涉及就是在操作系统上来完成相关环境参数及应用的配置安装。业内已经有很多成熟的工具如Ansible,Puppet,Chef这种都可以做OS平面的配置交付和管理。如下图可以帮助大家理解交付界面的划分。这里问题又来了,这些OS的平面的配置交付管理工具怎么安装到虚拟机实例上呢(比如Puppet Agent,Chef Agent)? 在Azure中以Linux虚拟实例为例,为用户开放了Customer Script Extension以及Azure Ubuntu/CoreOS实例对于Cloud-init的支持,通过这些接口我们可以Day0初次部署实例的同时将自定义的系统参数及配置带入到虚拟实例内。Customer Script Extention方式是将用户与配置的脚本在部署虚拟示例时作为参数输入,当实例创建后会自动执行该脚本,从而实现操作系统的参数配置,以及如安装Puppet/Chef等配置管理工具,然后在通过配置管理工具进行应用交付。Cloud-init方式略有不同,它通过DSL语言对用户常见的配置及参数进行抽象,用户可以通过KEY-VALUE式的描述配置文件实现对于参数及配置的表达,当实例创建时该配置文件作为参数输入并执行。后者Cloud-init的方式更贴近现在主流的工具方式,通过DSL语言使得工具更简单易用。目前Azure平台上Ubuntu和CoreOS的镜像已经支持Cloud-init,Cloud-init作为Ubuntu发起的实例自定义标准,目前已被各大主流Linux操作系统接受,相信后续Azure上其他几个Linux OS Provider的镜像也会得到支持。
上面已经对最终应用交付为目标的交付界面以及方法工具做了简单的介绍,下面我们举例帮大家更好的理解,下面我们目标交付一个Apache Web服务,通过创建一个Linux Ubuntu实例,然后通过cloud-init配置基础OS参数并安装Ansible,最后通过Ansible部署Apache服务。这里选择Ansible Pull的方式是因为通过从Git上拉playbook文件的自执行方式,可以摆脱传统Provisioning工具集中部署的限制。
第一步创建cloud-init配置文件,其中package部分定义了在系统创建后安装Git,ansible,在runcmd部分进行ansible hosts inventory文件的基础配置,当ansible执行环境就绪后,通过ansible-pull从Git-hub Repo获取已经定义好的Ansible playbook并执行。所有执行输出日志保留在/var/log/cloud-init-output.log
#cloud-config
apt_sources:
- source: "ppa:ansible/ansible"
apt_update: true
packages:
- software-properties-common
- git
- wget
- unzip
- python2.7
- ansible
runcmd:
- mkdir -p /home/azureuser/playbooks
- echo "127.0.0.1 ansible_connection=local" >> /etc/ansible/hosts
- ansible --version
- ansible-pull -U git://github.com/nonokangwei/ansible-playbooks.git -d /home/azureuser/playbooks apache.yml
output : { all : '| tee -a /var/log/cloud-init-output.log' }
第二步创建准备Ansible Playbook,其定义安装apache2服务并配置启动
apache.yml文件保存在Github中,
---
- hosts: localhost
sudo: yes
tasks:
- name: install apache2
apt: name=apache2 update_cache=yes state=latest
- name: enabled mod_rewrite
apache2_module: name=rewrite state=present
notify:
- restart apache2
handlers:
- name: restart apache2
service: name=apache2 state=restarted
第三部创建虚拟机指定Cloud-init配置文件作为参数输入,本例以Azure Cli为例,大家也可以采用上一篇介绍的template方式
azure vm quick-create -g TSP-KW --admin-username azureuser --image-urn Canonical:UbuntuServer:14.04.4-LTS:14.04.201610200 --storage-account-name tspkw --ssh-publickey-file ~/.ssh/id_rsa.pub --custom-data ~/cloudinit/cloudinit.txt -n Cloudinit -l chinanorth
虚拟机创建完毕让我们检验一下:
通过公网访问Apache Web服务地址,发现虚拟机创建完毕后Apache服务已经配置完毕可直接访问
登入创建好的虚拟机,进入/var/log/目录查看cloud-init-output执行日志,可以看到整个cloud-init的执行记录。
好了先到这里吧,老规矩最后是给大家的一些彩蛋,本文主要帮助大家介绍思路和方法并举例,并不着重介绍cloud-init,ansible语法,我把相关一下资源给大家梳理出来,大家可以自行学习然后定制自己的流程。另外就是Cloud-init目前在Azure上支持的Linux为Ubuntu和CoreOS(https://docs.microsoft.com/zh-cn/azure/virtual-machines/linux/using-cloud-init),上述思路也可以通过Custom Script Extension来实现。
Azure Cloud-init使用方法(带示例):https://azure.microsoft.com/zh-cn/blog/custom-data-and-cloud-init-on-windows-azure/
Cloud-init Cookbook帮助语法学习:http://cloudinit.readthedocs.io/en/latest/
Ansible Cookbook帮助语法学习:http://docs.ansible.com/ansible/intro.html
Azure Custom Script Extension介绍:https://docs.microsoft.com/zh-cn/azure/virtual-machines/linux/extensions-customscript