這是我參與8月更文挑戰的第10天。java
《ansible自動化:操做系統初始化具體實現》一文實現了對操做系統的交付,接下來咱們就須要根據研發、運維需求定製各類基礎軟件,用於往後的系統上線。在此個人實現方式是經過ansible playbook 進行基礎軟件的自定義安裝,後續也可結合jenkins 進行按需持續集成
。python
基礎軟件的需求一般有如下場景:mysql
jdk、tomcat、應用日誌目錄、環境變量及其餘訂製需求;nginx
python三、anaconda、supervisor、pip源等;sql
nginx shell
nginx 訂製;數據庫
ELK 日誌收集tomcat
filebeat 收集相關應用日誌;服務器
數據庫markdown
MySQL 編譯安裝、主動同步等;
Web
LAMP、Vue等環境配置;
以上都是咱們在運維過程當中可能遇到的,所以咱們須要嚴格按照《運維思索:目錄管理規範的重要性》中提到的目錄規範
去自動化安裝,來規避人爲安裝過程當中的差別性。
經過playbook 的tag標籤,咱們能夠將各種需求進行分類,例如:
實現nginx相關環境部署
實現java 相關環境部署
實現python相關環境部署
實現日誌收集功能
實現mysql 相關環境部署
lamp
實現lamp 相關環境部署
這樣咱們就能夠將繁雜的環境部署拆解爲一個個小模塊,化繁爲簡,逐個破解。
在此咱們實現對filebeat、java、nginx、python的定製化安裝。
ansible playbook按如下目錄結構存放yml文件。
roles/software_install/
├── files
│ ├── filebeat
│ │ ├── filebeat-6.4.3-x86_64.rpm
│ │ └── filebeat.yml
│ ├── java
│ │ ├── app.tar.gz
│ │ ├── app.zip
│ │ ├── data.zip
│ │ └── jdk1.8.0_40.zip
│ ├── nginx
│ │ ├── echo-nginx-module-master.zip
│ │ ├── nginx-module-vts-master.zip
│ │ ├── nginx_upstream_check_module-master.zip
│ │ └── tengine-2.3.2.tar.gz
│ └── python
│ └── Python-3.7.0.tgz
├── handlers
│ └── main.yml
├── tasks
│ ├── filebeat.yml
│ ├── java.yml
│ ├── main.yml
│ ├── nginx.yml
│ ├── python.yml
│ └── python.yml.bak
└── vars
└── main.yml
複製代碼
咱們將整個安裝過程當中每一個組件的安裝目錄、依賴等信息以變量的形式定義,可根據實際狀況裏靈活更改。
# 總體自定義變量
# var/main.yml
soft_dir: /usr/local/src
#filebeat
filebeat: filebeat-6.4.3-x86_64.rpm
#nginx
nginx: tengine-2.3.2
dependency:
- libxslt
- libxslt-devel
- libxml2
- libxml2-devel
- gd-devel
- geoip-devel
#java
jdk_path: /app/jdk1.8.0_40
jdk_link_path: /app/jdk
#python
python: Python-3.7.0
depend:
- libffi-devel
- zlib-devel
- bzip2-devel
- openssl-devel
- ncurses-devel
- sqlite-devel
- readline-devel
- tk-devel
- gdbm-devel
- db4-devel
- libpcap-devel
- xz-devel
- zlib
- zlib-devel
複製代碼
filebeat收集的日誌目錄及格式應該都是提早按規範定義的,所以此階段只進行安裝收集。
# 判斷filebeat是否存在,若存在則不安裝
- name: test filebeat exist
shell: which filebeat
register: result
ignore_errors: yes
tags: filebeat
- name: copy filebeat to dest
copy:
src: "filebeat/{{ filebeat }}"
dest: "{{ soft_dir }}"
when: result.rc != 0
tags: filebeat
- name: install filebeat
yum:
name: "{{ soft_dir}}/{{ filebeat }}"
state: present
when: result.rc != 0
tags: filebeat
- name: config filebeat
copy:
src: "filebeat/filebeat.yml"
dest: "/etc/filebeat/filebeat.yml"
backup: True
notify:
- restart filebeat
when: result.rc != 0
tags: filebeat
- name: filebeat enable
service:
name: filebeat
enabled: true
when: result.rc != 0
tags: filebeat
複製代碼
安裝前咱們可提早判斷java是否已安裝,避免重複安裝,提升效率。
#拷貝jdk及標準目錄到/app
- name: copy jdk to /app
unarchive:
src: "{{ item.src }}"
dest: "{{ item.dest }}"
owner: hcuser
group: wheel
with_items:
- { src: "java/app.zip", dest: "/" }
- { src: "java/data.zip", dest: "/" }
- { src: "java/jdk1.8.0_40.zip", dest: "/app" }
tags: java
#判斷java 是否安裝
- name: test jdk exist
shell: source /etc/profile && which java
register: result
ignore_errors: yes
tags: java
#java 不存在,則設置軟鏈
- name: Create a symbolic link
file:
src: "{{ jdk_path }}"
dest: "{{ jdk_link_path }}"
state: link
when: result.rc != 0
tags: java
#java 不存在,則設置java環境變量
- name: set java profile
lineinfile:
path: /etc/profile
line: "{{ item }}"
with_items:
- "#java"
- "export JAVA_HOME={{ jdk_link_path }}"
- "export JRE_HOME=$JAVA_HOME/jre"
- "export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:./"
- "export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH"
when: result.rc != 0
tags: java
複製代碼
nginx的插件咱們都已經提早準備完畢,編譯安裝的方式比yum更方便後續需求的擴展。
- name: copy nginx to dest
unarchive:
src: "{{ item }}"
dest: "{{ soft_dir }}"
with_items:
- "nginx/echo-nginx-module-master.zip"
- "nginx/nginx-module-vts-master.zip"
- "nginx/nginx_upstream_check_module-master.zip"
- "nginx/{{ nginx }}.tar.gz"
tags: nginx
- name: install dependency
yum:
name: "{{ dependency }}"
state: present
tags: nginx
- name: install nginx
shell: |
cd "{{ soft_dir }}/{{ nginx }}"
./configure --prefix=/app/nginx --add-module={{ soft_dir }}/nginx_upstream_check_module-master --add-module={{ soft_dir }}/nginx-module-vts-master/ --add-dynamic-module={{ soft_dir }}/echo-nginx-module-master --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_xslt_module=dynamic --with-http_image_filter_module --with-http_image_filter_module=dynamic --with-http_geoip_module --with-http_geoip_module=dynamic --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_slice_module --with-http_stub_status_module --with-stream --with-stream=dynamic --with-stream_ssl_module --with-stream_realip_module --with-stream_geoip_module --with-stream_geoip_module=dynamic --with-stream_ssl_preread_module --with-stream_sni
make
make install
tags: nginx
複製代碼
在此咱們直接編譯安裝,固然咱們也能夠安裝miniconda,更方便後續python多環境的需求。
- name: copy python to dest
unarchive:
src: "{{ item }}"
dest: "{{ soft_dir }}"
with_items:
- "python/Python-3.7.0.tgz"
tags: python
- name: install depend
yum:
name: "{{ depend }}"
state: present
tags: python
- name: install python
shell: |
cd "{{ soft_dir }}/{{ python }}"
./configure --prefix=/usr/local/python3; make;make install
tags: python
複製代碼
此文件爲本次須要安裝的組件。
- include: filebeat.yml
- include: nginx.yml
- include: java.yml
- include: python.yml
複製代碼
handlers用於配置文件變動後,filebeat服務重啓,以便從新加載配置文件。
# handlers/main.yml
- name: restart filebeat
service:
name: filebeat
state: restarted
複製代碼
files目錄中都是各組件安裝所須要的源目錄,用於同步到遠程安裝目錄,具體請查看目錄結構。
經過tag咱們能夠靈活的按需安裝組件,固然也能夠對多臺服務批量安裝。
#安裝所有軟件
ansible-playbook -b -e host_ip=10.10.2.10 -v sofware_install.yml
#經過tag實現安裝filebeat
ansible-playbook -b -e host_ip=10.10.2.10 -v sofware_install.yml -t filebeat
#經過tag實現安裝nginx
ansible-playbook -b -e host_ip=10.10.2.10 -v sofware_install.yml -t nginx
#經過tag實現安裝python
ansible-playbook -b -e host_ip=10.10.2.10 -v sofware_install.yml -t python
#經過tag實現安裝java
ansible-playbook -b -e host_ip=10.10.2.10 -v sofware_install.yml -t java
#多臺服務器同時安裝所有軟件
ansible-playbook -b -e host_ip=10.10.2.10,10.10.2.11 -v sofware_install.yml
複製代碼
基礎軟件安裝階段至關依賴《目錄管理規範》,正所謂「沒有規矩,不成方圓」,咱們但願的是團隊每一個成員在登陸服務器前,就已經對基礎環境瞭如執掌,這樣才能在無形中提升咱們的工做效率。
你覺得咱們的基礎軟件的安裝到此爲止了嗎?接下來咱們將會繼續接入jenkins,作到圖形化的操控安裝,敬請期待!