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)化部署從入門到棄坑