ansible自动化:基础软件的自定义安装
点击上方蓝色字体,关注我们
读完需 8 分钟
速读需 4 分钟
《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.目录结构
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是否存在,若存在则不安装
- 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
#拷贝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
- 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
- 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/main.yml
- name: restart filebeat
service:
name: filebeat
state: restarted
5.files
files目录中都是各组件安装所需要的源目录,用于同步到远程安装目录,具体请查看目录结构。
执行
#安装全部软件
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
总结
基础软件安装阶段相当依赖《目录管理规范》,正所谓“没有规矩,不成方圆”,我们希望的是团队每个成员在登录服务器前,就已经对基础环境了如执掌,这样才能在无形中提高我们的工作效率。
你与世界
只差一个
公众号