这是我参与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,作到图形化的操控安装,敬请期待!