ansible自动化:基础软件的自定义安装

《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,做到图形化的操控安装,敬请期待!
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/yanggd1987/article/details/119654131