
0x00 @Before
上次Ansible自動部署入門,最后寫了點playbook的項目,了解了一些如task,template,vars等簡單的用法。但是真正的Ansible項目并不是通過主機(jī)來分Roles的,而是一個Ansible管理多臺主機(jī),用Roles來區(qū)分項目。
所以這一次,我?guī)砹瞬灰粯拥氖褂米藙荨?/p>
1x00 Playbook再介紹
playbook 是劇本,我在上片已經(jīng)介紹了點,總之入口是一個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
如果項目簡單, 一個playbook.yml文件就可以搞定了
1x01 Handler
handler,用來執(zhí)行某些條件下的任務(wù),比如當(dāng)配置文件發(fā)生變化的時候,通過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會更加靈活一些。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里面,這樣每一個參數(shù)都按照變量名稱會放入{{ }}對應(yīng)的變量名稱中。直到item循環(huán)迭代介紹,才會執(zhí)行下一個task
1x03 Tags
通過tag可以指定運(yùn)行的task,然而簡單的部署時tag并不常用,需要tag的時候一般可以直接使用ansible命令處理,或者再寫新的playbook。只有在大型項目部署的時候,偶爾才會使用。所以只簡單介紹一下tag的用法。
- 首先,在tasks內(nèi)的yml文件中,對需要的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)用某個tag:
ansible-playbook example.yml – tags “configuration,packages”
task可以打上任意多個tag。
1x04 變量
變量分好幾種,可以定義在playbook中,也可以定義在hosts文件上,后面也可以寫在roles的vars文件夾中。
上面介紹循環(huán)迭代,{{item.file_src}}就是變量引用,with_items下的就是變量值。變量可以放置在幾乎所有地方,除了關(guān)鍵字外,其他地方都可以引用變量。Ansible自己也定義了好多自帶的變量,有興趣的可以自己看看
hosts主機(jī)變量如下
# 針對主機(jī)的主機(jī)變量
127.0.0.1 my_name_is=zing
# 針對組的變量
[webServer]
domain1.example.com
domain2.example.com
[webServer:vars]
server_user_name_is="zing"
server_user_is="java_programer"
# 針對所有主機(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 }}就是一個復(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"
注意:
某些時候YAML冒號后面的值不能以{開頭,如果有要以{開頭,必須加上引號。解決方式如下。
- hosts: zing_servers
vars:
server_path: "{{ base_path }}/zing"
1x05 模板和變量搭配使用
所謂的模板就是以一個現(xiàn)成的文件為樣板,向其中填充參數(shù),來生成我們需要的真實文件,這個無須多介紹,參考
https://micorochio.github.io/2017/06/05/ansible-learning-02/#0x03-yaml和playbook
下的 application.properties.j2 文件寫法,雙大括號里的參數(shù)會被定義的變量所替換,文件替換流程參考下面的寫法
- 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。定義多個item 自動迭代,將參數(shù)替換到task變量中
2x00 Roles
這是個新的概念,playbook只能管理一個項目的話,通過Roles可以用一個ansible工程,管理公司所有的工程。上一篇文章,我介紹的Roles是根據(jù)主機(jī)來分Roles(角色)的,實際開發(fā)中,大多是根據(jù)項目名稱來分角色。這樣一套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文件夾,第一級子文件夾就是就是role的名稱
project_a/ //role,表示工程A
files/ //一般用來存放腳本,或者其他部署時需要使用的文件
templates/ //存放模板
tasks/ //存放任務(wù)tasks
handlers/ //存放Handler
vars/ //存放本角色可以使用的變量
defaults/ //用來存放默認(rèn)變量的,如果其他地方不定義,會在這里找,否則會使用其他地方定義的變量
meta/ //用于定義此角色的特殊設(shè)定及其依賴關(guān)系,我還沒用到這個
project_b/
files/
templates/
tasks/
handlers/
vars/
defaults/
meta/
2x02 一個開源的 tomcat 工程實例
這個例子的開源地址:https://github.com/ansible/ansible-examples/tree/master/tomcat-memcached-failover
這個例子很好的展示了Tomcat服務(wù)的自動化部署的Ansible工程寫法

3x00部署一個Maven版的java項目
只是簡單介紹一下從0開始到部署的一個流程,具體的例子,可以到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項目源碼
- 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)境
- 啟動服務(wù)
如果是多項目部署,最好是:
- 每個項目都有自己的role name,
- 運(yùn)維負(fù)責(zé)在當(dāng)前role使用的inventory文件中修改配置,
- 將這些配置通過模板的方式,覆蓋到代碼的各個配置文件中,
- 最后打成運(yùn)行包,傳輸?shù)匠休d軟件的服務(wù)器上,啟動即可。
這樣不會出現(xiàn)不同環(huán)境切換,程序員自己手動改配置,出現(xiàn):在生產(chǎn)上使用了測試的數(shù)據(jù)庫。生產(chǎn)服務(wù)連接測試的 redis,打爆了測試用的redis服務(wù)器還造成了嚴(yán)重的數(shù)據(jù)丟失。
4x00Ansible和Jenkins一鍵部署
其實很簡單,安裝Jinkens,用Jinkens 執(zhí)行
ansible-playbook project-playbool.yml -i inventory-file
下面的東西就交給Ansible了,不再需要用繁瑣的Shell腳本來寫Jenkins部署腳本了。并且,每個項目都是一鍵發(fā)布,而且不用維護(hù)用于項目發(fā)布的部署shell,十分輕量,尤其是對微服務(wù),批量擴(kuò)展和修改很方便。
寫到這里就出坑了,畢竟不是專業(yè)的運(yùn)維,多謝觀看
5x00 @After
參考:
極力推薦=》https://github.com/ansible/ansible-examples
轉(zhuǎn)載請注明出處: Ansible自動化部署從入門到棄坑