《ansible自动化:操作系统初始化具体实现》一文实现了对操作系统的交付,接下来我们就需要根据研发、运维需求定制各种基础软件,用于日后的系统上线。在此我的实现方式是通过ansible playbook 进行基础软件的自定义安装,后续也可结合jenkins 进行按需持续集成
。
需求
基础软件的需求通常有以下场景:
- java项目
jdk、tomcat、应用日志目录、环境变量及其他订制需求; - python项目
python3、anaconda、supervisor、pip源等; - nginx
nginx 订制; - ELK 日志收集
filebeat 收集相关应用日志; - 数据库
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,做到图形化的操控安装,敬请期待!