Ansible自動(dòng)化部署從入門到棄坑

0x00 @Before

上次Ansible自動(dòng)部署入門尉姨,最后寫了點(diǎn)playbook的項(xiàng)目庵朝,了解了一些如task,template又厉,vars等簡單的用法九府。但是真正的Ansible項(xiàng)目并不是通過主機(jī)來分Roles的,而是一個(gè)Ansible管理多臺(tái)主機(jī)覆致,用Roles來區(qū)分項(xiàng)目侄旬。
所以這一次,我?guī)砹瞬灰粯拥氖褂米藙荨?/p>

1x00 Playbook再介紹

playbook 是劇本煌妈,我在上片已經(jīng)介紹了點(diǎn)儡羔,總之入口是一個(gè)yml文件

- hosts: local
  remote_user: zing
  environment: 
    JAVA_HOME:  /application/jdk8/
    JRE_HOME: /application/jdk8/jre/
    M2_HOME: /application/maven/bin/
  tasks:
    - name: package project
      shell: mvn clean package
      remote_user: zing
    - name: deploy to maven service
      shell: mvn deploy
      sudo: yes
      ignore_errors: yes
  

如果項(xiàng)目簡單, 一個(gè)playbook.yml文件就可以搞定了

1x01 Handler

handler,用來執(zhí)行某些條件下的任務(wù)璧诵,比如當(dāng)配置文件發(fā)生變化的時(shí)候汰蜘,通過notify觸發(fā)handler去重啟服務(wù)器。如下面playbook之宿。

- hosts: local
  remote_user: zing
  tasks:
    - name: copy properties
      copy: src=/home/zing/project.properties dest=/home/java/pro/project.properties
    - name: 
      file: path=/home/java/pro/project.properties mode=600
      notify:
        - restart server
  handlers:
    - name: restart server
      service: name=tomcat state=restarted

還有一種條件判斷族操,可以直接寫在task里面,如下

- hosts: local
  remote_user: zing
  tasks:
    - name: copy properties
      copy: src=/home/zing/project.properties dest=/home/java/pro/project.properties
    - name: modify project property
      file: path=/home/java/pro/project.properties mode=600
    - name: restart server when server is zing
      service: name=tomcat state=restarted
      when: result|changed

when的用法還有很多比被,可以自己探索色难。不過一般用Handler會(huì)更加靈活一些。when的條件判斷需要了解很多Ansible變量等缀,想知道的話枷莉,可以自己參考官方文檔

1x02 循環(huán)迭代

上一篇文章已經(jīng)寫過迭代了,我怕寫的籠統(tǒng)尺迂,這里再拿出來講一下

- hosts: local
  remote_user: zing
  tasks:
    - name: transfom template
      template: src={{item.file_src}} dest={{item.target_file_path}}
      with_items:
        - {file_src: '/home/zing/template/application.j2', target_file_path: '/home/service/resources/application.properties'}
        - {file_src: '/home/zing/template/config.j2', target_file_path: '/home/service/resources/config.properties'}

使用with_items笤妙,將下面的參數(shù)迭代進(jìn)tasks里面冒掌,這樣每一個(gè)參數(shù)都按照變量名稱會(huì)放入{{ }}對(duì)應(yīng)的變量名稱中。直到item循環(huán)迭代介紹危喉,才會(huì)執(zhí)行下一個(gè)task

1x03 Tags

通過tag可以指定運(yùn)行的task宋渔,然而簡單的部署時(shí)tag并不常用,需要tag的時(shí)候一般可以直接使用ansible命令處理辜限,或者再寫新的playbook皇拣。只有在大型項(xiàng)目部署的時(shí)候,偶爾才會(huì)使用薄嫡。所以只簡單介紹一下tag的用法氧急。

  • 首先,在tasks內(nèi)的yml文件中毫深,對(duì)需要的task打上tag:
- name: yun install package 
  yum: name={{ item }} state=installed 
  with_items: 
     - httpd 
     - memcached 
  tags: 
     - packages 

 - name: configuration modity 
  template: src=templates/src.j2 dest=/etc/foo.conf 
  tags: 
      - configuration

  • 調(diào)用某個(gè)tag:
 ansible-playbook example.yml – tags “configuration,packages”

task可以打上任意多個(gè)tag吩坝。

1x04 變量

變量分好幾種,可以定義在playbook中哑蔫,也可以定義在hosts文件上钉寝,后面也可以寫在roles的vars文件夾中。
上面介紹循環(huán)迭代闸迷,{{item.file_src}}就是變量引用嵌纲,with_items下的就是變量值。變量可以放置在幾乎所有地方腥沽,除了關(guān)鍵字外逮走,其他地方都可以引用變量。Ansible自己也定義了好多自帶的變量今阳,有興趣的可以自己看看

hosts主機(jī)變量如下

# 針對(duì)主機(jī)的主機(jī)變量
127.0.0.1 my_name_is=zing

# 針對(duì)組的變量
[webServer]
domain1.example.com
domain2.example.com
[webServer:vars]
server_user_name_is="zing"
server_user_is="java_programer"

# 針對(duì)所有主機(jī)的所有變量
[all:vars]
user_name_is="zing"
user_is="java_programer"

使用變量只要在正確的位置加上變量引用{{ varable_name }}就好

- hosts: local
  remote_user: {{ user_name_is }}
  tasks:
    - name: copy properties
      copy: src=/home/zing/project.properties 

Ansible支持復(fù)雜變量师溅,我們的{{ item.src }}就是一個(gè)復(fù)雜型的,通過.來引用item下的src值盾舌。所以墓臭,變量名稱不要帶.

復(fù)雜變量也很簡單妖谴。不過一般定義在yaml文件里面窿锉,playbook中可以這么定義

- hosts: local
  remote_user: zing
  tasks:
    - name: start server {{ server1.name }}
      service: name=tomcat state=restarted
  vars:
    server1:
        name: "zing_service"
        type: "tomcat"

注意:
某些時(shí)候YAML冒號(hào)后面的值不能以{開頭,如果有要以{開頭窖维,必須加上引號(hào)榆综。解決方式如下妙痹。

- hosts: zing_servers
  vars:
       server_path: "{{ base_path }}/zing"

1x05 模板和變量搭配使用

所謂的模板就是以一個(gè)現(xiàn)成的文件為樣板铸史,向其中填充參數(shù),來生成我們需要的真實(shí)文件怯伊,這個(gè)無須多介紹琳轿,參考
https://micorochio.github.io/2017/06/05/ansible-learning-02/#0x03-yaml和playbook
下的 application.properties.j2 文件寫法,雙大括號(hào)里的參數(shù)會(huì)被定義的變量所替換,文件替換流程參考下面的寫法

- name: transfom template
  template: src={{item.template_file}} dest={{item.target_file}}
  with_items:
    - {template_file: 'template/application.j2', target_file: 'resources/application.properties'}
    - {template_file: 'template/config.j2', target_file: 'resources/config.properties'}

這段task的意思是:將item的模板template_file轉(zhuǎn)換成target_file崭篡。定義多個(gè)item 自動(dòng)迭代挪哄,將參數(shù)替換到task變量中

2x00 Roles

這是個(gè)新的概念,playbook只能管理一個(gè)項(xiàng)目的話琉闪,通過Roles可以用一個(gè)ansible工程迹炼,管理公司所有的工程。上一篇文章颠毙,我介紹的Roles是根據(jù)主機(jī)來分Roles(角色)的斯入,實(shí)際開發(fā)中,大多是根據(jù)項(xiàng)目名稱來分角色蛀蜜。這樣一套ansible刻两,就能hold住全部工程。

2x01 正確的ansible工程目錄

inventory/                   //hosts文件夾
    project_a_host           //工程a的hosts
    project_a_hosts          //工程b的hosts
project_a_playbook.yml       //參考上篇文章的side.yml
project_b_playbook.yml       //參考上篇文章的side.yml
roles/                       //roles文件夾滴某,第一級(jí)子文件夾就是就是role的名稱
   project_a/                //role,表示工程A
     files/                  //一般用來存放腳本磅摹,或者其他部署時(shí)需要使用的文件
     templates/              //存放模板
     tasks/                  //存放任務(wù)tasks
     handlers/               //存放Handler
     vars/                   //存放本角色可以使用的變量
     defaults/               //用來存放默認(rèn)變量的,如果其他地方不定義霎奢,會(huì)在這里找户誓,否則會(huì)使用其他地方定義的變量
     meta/                   //用于定義此角色的特殊設(shè)定及其依賴關(guān)系,我還沒用到這個(gè)
   project_b/
     files/
     templates/
     tasks/
     handlers/
     vars/
     defaults/
     meta/

2x02 一個(gè)開源的 tomcat 工程實(shí)例

這個(gè)例子的開源地址:https://github.com/ansible/ansible-examples/tree/master/tomcat-memcached-failover
這個(gè)例子很好的展示了Tomcat服務(wù)的自動(dòng)化部署的Ansible工程寫法

3x00部署一個(gè)Maven版的java項(xiàng)目

只是簡單介紹一下從0開始到部署的一個(gè)流程,具體的例子椰憋,可以到https://github.com/ansible/ansible-examples 上隨意查找厅克,里面應(yīng)有盡有。

流程如下:

  • 所有主機(jī)安裝Java (首次執(zhí)行)
  • Ansible主機(jī)安裝Maven(首次執(zhí)行)
  • Ansible主機(jī)安裝git (首次執(zhí)行)
  • 使用Ansible shell模塊清理殘余代碼(首次無須執(zhí)行)
  • Ansible主機(jī)使用git 獲取Java項(xiàng)目源碼
  • Ansible Template替換新源碼
  • 使用shell模塊橙依,執(zhí)行mvn package打出jar包或者war包
  • 服務(wù)主機(jī)安裝服務(wù)軟件Tomcat Nginx Mysql等(首次執(zhí)行)
  • 關(guān)閉服務(wù)(如果是熱更新证舟,無須關(guān)閉)
  • 將jar包或者war包使用copy模塊,傳輸?shù)椒?wù)主機(jī)
  • 修改服務(wù)軟件配置等主機(jī)環(huán)境
  • 啟動(dòng)服務(wù)

如果是多項(xiàng)目部署窗骑,最好是:

  • 每個(gè)項(xiàng)目都有自己的role name女责,
  • 運(yùn)維負(fù)責(zé)在當(dāng)前role使用的inventory文件中修改配置,
  • 將這些配置通過模板的方式创译,覆蓋到代碼的各個(gè)配置文件中抵知,
  • 最后打成運(yùn)行包,傳輸?shù)匠休d軟件的服務(wù)器上软族,啟動(dòng)即可刷喜。

這樣不會(huì)出現(xiàn)不同環(huán)境切換,程序員自己手動(dòng)改配置立砸,出現(xiàn):在生產(chǎn)上使用了測試的數(shù)據(jù)庫掖疮。生產(chǎn)服務(wù)連接測試的 redis,打爆了測試用的redis服務(wù)器還造成了嚴(yán)重的數(shù)據(jù)丟失颗祝。

4x00Ansible和Jenkins一鍵部署

其實(shí)很簡單浊闪,安裝Jinkens恼布,用Jinkens 執(zhí)行

ansible-playbook project-playbool.yml -i inventory-file

下面的東西就交給Ansible了,不再需要用繁瑣的Shell腳本來寫Jenkins部署腳本了搁宾。并且折汞,每個(gè)項(xiàng)目都是一鍵發(fā)布,而且不用維護(hù)用于項(xiàng)目發(fā)布的部署shell盖腿,十分輕量爽待,尤其是對(duì)微服務(wù),批量擴(kuò)展和修改很方便翩腐。

寫到這里就出坑了堕伪,畢竟不是專業(yè)的運(yùn)維,多謝觀看

5x00 @After

參考:
極力推薦=》https://github.com/ansible/ansible-examples

轉(zhuǎn)載請(qǐng)注明出處: Ansible自動(dòng)化部署從入門到棄坑

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末栗菜,一起剝皮案震驚了整個(gè)濱河市欠雌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌疙筹,老刑警劉巖富俄,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異而咆,居然都是意外死亡霍比,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門暴备,熙熙樓的掌柜王于貴愁眉苦臉地迎上來悠瞬,“玉大人,你說我怎么就攤上這事涯捻∏匙保” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵障癌,是天一觀的道長凌外。 經(jīng)常有香客問我,道長涛浙,這世上最難降的妖魔是什么康辑? 我笑而不...
    開封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮轿亮,結(jié)果婚禮上疮薇,老公的妹妹穿的比我還像新娘。我一直安慰自己我注,他們只是感情好按咒,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著仓手,像睡著了一般胖齐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嗽冒,一...
    開封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天呀伙,我揣著相機(jī)與錄音,去河邊找鬼添坊。 笑死剿另,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的贬蛙。 我是一名探鬼主播雨女,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼阳准!你這毒婦竟也來了氛堕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤野蝇,失蹤者是張志新(化名)和其女友劉穎讼稚,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绕沈,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡锐想,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了乍狐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赠摇。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖浅蚪,靈堂內(nèi)的尸體忽然破棺而出藕帜,到底是詐尸還是另有隱情,我是刑警寧澤惜傲,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布耘戚,位于F島的核電站,受9級(jí)特大地震影響操漠,放射性物質(zhì)發(fā)生泄漏收津。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一浊伙、第九天 我趴在偏房一處隱蔽的房頂上張望撞秋。 院中可真熱鬧,春花似錦嚣鄙、人聲如沸吻贿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽舅列。三九已至肌割,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間帐要,已是汗流浹背把敞。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留榨惠,地道東北人奋早。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像赠橙,于是被迫代替她去往敵國和親耽装。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 安裝ansible 1.yum安裝:RHEL(Centos)7版本: 2.Apt(Ubuntu)安裝方式: 3.h...
    愛吃土豆的程序猿閱讀 11,140評(píng)論 0 12
  • 本文主要內(nèi)容均收集于網(wǎng)絡(luò)上的博文資料期揪,僅以此文作為學(xué)習(xí)總結(jié)掉奄。BTW,目前Ansible對(duì)python3的支持還不是...
    qiuyi943閱讀 18,232評(píng)論 1 15
  • ansible介紹ansible常用模塊使用playbooktemplates凤薛,模板條件測試和循環(huán)迭代roles挥萌,...
    哈嘍別樣閱讀 1,408評(píng)論 0 3
  • ansible-playbook playbook簡介 playbook是ansible用于配置,部署枉侧,和管理被控...
    bdslinux閱讀 10,888評(píng)論 1 12
  • 作為背鍋俠運(yùn)維工作的基本流程 運(yùn)維工具的分類 : ansible的模塊化: ansible密鑰登陸 ansible...
    二郎5閱讀 4,155評(píng)論 0 10