ansible自動化:基礎軟件的自定義安裝

這是我參與8月更文挑戰的第10天。java

《ansible自動化:操做系統初始化具體實現》一文實現了對操做系統的交付,接下來咱們就須要根據研發、運維需求定製各類基礎軟件,用於往後的系統上線。在此個人實現方式是經過ansible playbook 進行基礎軟件的自定義安裝,後續也可結合jenkins 進行按需持續集成python

需求

基礎軟件的需求一般有如下場景:mysql

  • java項目

       jdk、tomcat、應用日誌目錄、環境變量及其餘訂製需求;nginx

  • python項目

       python三、anaconda、supervisor、pip源等;sql

  • nginx shell

    nginx 訂製;數據庫

  • ELK 日誌收集tomcat

    filebeat 收集相關應用日誌;服務器

  • 數據庫markdown

    MySQL 編譯安裝、主動同步等;

  • Web

       LAMP、Vue等環境配置;

以上都是咱們在運維過程當中可能遇到的,所以咱們須要嚴格按照《運維思索:目錄管理規範的重要性》中提到的目錄規範去自動化安裝,來規避人爲安裝過程當中的差別性。

規劃

經過playbook 的tag標籤,咱們能夠將各種需求進行分類,例如:

  • nginx

       實現nginx相關環境部署

  • java

       實現java 相關環境部署

  • python

       實現python相關環境部署

  • filebeat

       實現日誌收集功能

  • mysql

       實現mysql 相關環境部署

  • lamp

    實現lamp 相關環境部署

這樣咱們就能夠將繁雜的環境部署拆解爲一個個小模塊,化繁爲簡,逐個破解。

具體實現

在此咱們實現對filebeat、java、nginx、python的定製化安裝。

1.目錄結構

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
複製代碼

2.vars自定義變量

咱們將整個安裝過程當中每一個組件的安裝目錄、依賴等信息以變量的形式定義,可根據實際狀況裏靈活更改。

# 總體自定義變量
# 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
複製代碼

3.task任務

1.filebeat.yml

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
複製代碼

2.java.yml

安裝前咱們可提早判斷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
複製代碼

3.nginx.yml

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
複製代碼

4.python.yml

在此咱們直接編譯安裝,固然咱們也能夠安裝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
複製代碼

5.main.yml

此文件爲本次須要安裝的組件。

- include: filebeat.yml
- include: nginx.yml
- include: java.yml
- include: python.yml
複製代碼

4.handlers

handlers用於配置文件變動後,filebeat服務重啓,以便從新加載配置文件。

# handlers/main.yml
- name: restart filebeat
  service:
    name: filebeat
    state: restarted
複製代碼

5.files

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,作到圖形化的操控安裝,敬請期待!

25.png

相關文章
相關標籤/搜索