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

相关文章
相关标签/搜索