Infrastructure Auto Depolyment on Azure

上週給各位小夥伴扒了扒Azure Resource Template的使用,你們應該已經經過模板方式交付基礎架構有了一些體會。今天咱們的就來在深刻一些,通過上一篇介紹Resource Template的部署文章,咱們僅僅是向Infrastructure As Code邁出了第一步,爲何這麼講?由於咱們在談論交付的時候能夠有不一樣的界面,好比把界面劃定在IaaS,PaaS,SaaS等,最理想的場景是咱們經過一鍵部署咱們就能夠拿到能夠訪問的應用,咱們在上次的模板部署中只是交付了一個知足業務要求的基礎架構環境,界面在基礎設施這一層,後續須要把環境中的虛擬機實例交付給應用部門進行應用開發和部署。那咱們來想象一個共有云經典場景,應對業務突發訪問彈性擴展,該場景下在業務突發時,咱們僅僅經過彈性擴展交付到基礎架構這一層是不夠的,咱們還須要經過快速自動的方式將業務應用部署到實例上才能夠,若是這些經過手工干預,在業務突發場景下是沒法作到快速響應的。那麼應該如何來作呢?假設咱們但願在Azure上經過IaaS自動化交付一個Apache Web服務,那麼基本邏輯步驟以下,建立虛擬機實例,配置實例的環境參數,安裝Apache服務,配置Apache服務。那麼從自動化交付的邏輯抽象角度能夠分爲三個平面:基礎架構交付、操做系統環境基礎參數交付,應用交付。在各個平面交付上其實業內都有不少成熟的工具和方法,今天咱們以Azure公有云平臺爲例來給你們舉例介紹。html

經過上一篇文章,你們應該已經有所瞭解能夠經過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的鏡像也會獲得支持。python

上面已經對最終應用交付爲目標的交付界面以及方法工具作了簡單的介紹,下面咱們舉例幫你們更好的理解,下面咱們目標交付一個Apache Web服務,經過建立一個Linux Ubuntu實例,而後經過cloud-init配置基礎OS參數並安裝Ansible,最後經過Ansible部署Apache服務。這裏選擇Ansible Pull的方式是由於經過從Git上拉playbook文件的自執行方式,能夠擺脫傳統Provisioning工具集中部署的限制。linux

第一步建立cloud-init配置文件,其中package部分定義了在系統建立後安裝Git,ansible,在runcmd部分進行ansible hosts inventory文件的基礎配置,當ansible執行環境就緒後,經過ansible-pull從Git-hub Repo獲取已經定義好的Ansible playbook並執行。全部執行輸出日誌保留在/var/log/cloud-init-output.loggit

#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' }github

第二步建立準備Ansible Playbook,其定義安裝apache2服務並配置啓動apache

apache.yml文件保存在Github中,windows

---
- 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 apache2python2.7

  handlers:
    - name: restart apache2
      service: name=apache2 state=restartedssh

第三部建立虛擬機指定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

相關文章
相關標籤/搜索