前言
Ansible 是大家非常熟悉的輕量級的自動化運維工具。在小規模的應用集羣中,使用ansbile來對集羣中的應用進行管理是一個非常高效的方法。
Ansible本身支持非常多的模塊,並且操作非常簡單學習容易。關於ansible的安裝以及各個模塊的使用,此處不再詳細的描述。
今天我們以一個詳細的案例,來介紹一下ansible的具體使用。同事,在github上也有很多ansible的具體事例,可以去參考。https://github.com/ansible/ansible-examples 本文就是參考示例中的ansible-tomcat-memcached來進行的實驗。
Tomcat/Memcached實現會話保持(SessionServer)
在實際的應用場景中,如果進行了負載均衡,那麼後端服務器對用戶的session記錄就是一個比較令人頭疼的問題。一般需要進行單獨的處理。現在已經有很多的成熟的解決方案。例如使用Tomcat+Memcached來實現用戶的會話保持。但是Memcached緩存是基於內存的,如果SessionServer宕機了,還是會影響系統的使用,所以又有另外一種解決方案,就是使用Tomcat+redis來實現會話的永久存儲。因爲redis可以對緩存進行持久化處理。但是本文還是以memcached爲例,來介紹使用Ansible自動化部署實現Tomcat會話保持。
具體的原理,就不再詳細介紹,如果對此還有不太瞭解的朋友可以移步我之前的博客詳細瞭解一下。http://blog.51cto.com/xiaoshuaigege/1979587 。
實驗拓撲結構
在開始這篇博文的時候,需要重新給大家介紹一下本次實驗的基本環境。
序號 | 擔任角色 | 主機名 | 地址 | 功能描述 | 對應軟件版本 |
---|---|---|---|---|---|
A | Nginx均衡調度器 | nginx | 192.168.0.20 | 利用Nginx的調度功能首先負載均衡 | Nginx-1.12.2 |
B | web服務器 | tomcat1 | 192.168.0.21 | 安裝tomcat,用來提供動態web服務 | tomcat-7.0.76-2.e17 |
C | web服務器 | tomcat2 | 192.168.0.22 | 安裝tomcat,用來提供動態的web服務 | tomcat-7.0.76-2.el7 |
D | SessionServer | memcached1 | 192.168.0.26 | 安裝memcached,提供Session存儲服務,同時充當SessionServer的主節點 | memcached-1.4.15 |
E | SessionServer | memcached2 | 192.168.0.27 | 安裝memcached,提供session存儲服務,同時充當SessionServer備用節點 | memcached-1.4.15 |
O | ansible主機 | ansible | 192.168.0.19 | 安裝ansible,通過Ansible對其他主機進行管控 | ansible-2.4.1 |
開始編寫Ansible任務
此次實例是基於github上的example進行的修改編寫。主要在下面貼出其中幾個比較重要的文件,整個編寫的ansible腳本可以在下面的鏈接中進行下載。
roles/lb-nginx/tasks/main.yml
---
- name: Install nginx
yum: name=nginx state=present
- name: Deliver main configuration file
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
notify: restart nginx
- name: Copy configuration file to nginx/sites-avaiable
template: src=default.conf.j2 dest=/etc/nginx/conf.d/default.conf
notify: restart nginx
- name: Make sure nginx start with boot
service: name=nginx state=started enabled=yes
roles/tomcat/tasks/main.yml
---
- name: Install OpenJDK
yum: name=java-1.8.0-openjdk state=present
- name: Install Tomcat
yum: name=tomcat state=present
- name: Deliver configuration files for tomcat
template: src={{ item.src }} dest={{ item.dest }} backup=yes
with_items:
- "{{ conf_items }}"
notify: restart tomcat
- name: Deliver libraries support memcached
get_url: url="{{ item }}" dest=/usr/share/tomcat/lib/
with_items:
- http://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager/2.1.1/memcached-session-manager-2.1.1.jar
- http://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager-tc7/2.1.1/memcached-session-manager-tc7-2.1.1.jar
- http://repo1.maven.org/maven2/net/spy/spymemcached/2.12.0/spymemcached-2.12.0.jar
- name: Deploy sample app
copy: src=msm-sample-webapp-1.0-SNAPSHOT.war dest=/var/lib/tomcat/webapps/ROOT.war owner=tomcat group=tomcat
- name: Start tomcat service
service: name=tomcat state=started enabled=yes
roles/memcached/tasks/main.yml
---
- name: Install memcached
yum: name=memcached state=present
- name: Deliver configuration file
template: src=memcached.conf.j2 dest=/etc/sysconfig/memcached backup=yes
notify: restart memcached
- name: Deliver init script
template: src=init.sh.j2 dest=/etc/init.d/memcached mode=0755
notify: restart memcached
- name: Start memcached service
service: name=memcached state=started enabled=yes
其餘的資料可以直接從上面的下載鏈接中去下載。
設置遠程主機免密登陸
ansible對遠程主機的管理是通過SSH來進行鏈接的,所以可以設置遠程主機免密登陸,使用shh-keygen 命令。
]# ssh-keygen
]# for i in 20 21 22 26 27;do ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected].$i; done
設置成功之後,使用SSH登陸遠程主機就可以不用再輸入密鑰了。
對遠程主機進行部署
在對遠程主機進行操作之前,要確保集羣內的所有主機的時間已經進行了同步,否則會有很多問題。因爲是個人實驗環境,同時關閉了selinux 和 iptables。
執行下面的腳本,對編寫的ansible主機進行檢查,並運行ansible-playbook.
#!/bin/bash
# 測試列舉任務
#ansible-playbook -i ./hosts site.yml -e target=lb_servers -e role=lb-nginx --list-tasks
#ansible-playbook -i ./hosts site.yml -e target=tomcat_servers -e role=tomcat --list-tasks
#ansible-playbook -i ./hosts site.yml -e target=memcached_servers -e role=memcached --list-tasks
# 實驗任務可行性
#ansible-playbook -C -i ./hosts site.yml -e target=lb_servers -e role=lb-nginx
#ansible-playbook -C -i ./hosts site.yml -e target=tomcat_servers -e role=tomcat
#ansible-playbook -C -i ./hosts site.yml -e target=memcached_servers -e role=memcached
# 執行任務
ansible-playbook -i ./hosts site.yml -e target=lb_servers -e role=lb-nginx
ansible-playbook -i ./hosts site.yml -e target=tomcat_servers -e role=tomcat
ansible-playbook -i ./hosts site.yml -e target=memcached_servers -e role=memcached
驗證實驗結果
playbook 腳本執行成功之後,再瀏覽器中輸入 http://192.168.0.20/ 就可以看到之前在tomcat 中部署的應用程序了。點擊刷新,會發現sessionid 並沒有發生變化。
總結
- 在搭建tomcat集羣的過程中,memcached只是其中一種實現方式,實際生產中,redis也是一種比較常用的實現方式,後面的文章中會介紹redis的使用方式。
- 自動化運維工具有很多,ansible只是其中一個。同時ansbile只適用於小規模的服務器集羣,如果規模不大的話可以考慮。還有其他的自動化運維工具如puppet和saltstack我們會在後面的文章中進行介紹。
個人博客地址:http://www.pojun.tech/ 歡迎訪問