查看原文
其他

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

木讷大叔爱运维 木讷大叔爱运维 2022-07-13

点击上方蓝色字体,关注我们




读完需 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.ymlsoft_dir: /usr/local/src#filebeatfilebeat: filebeat-6.4.3-x86_64.rpm
#nginxnginx: tengine-2.3.2dependency: - libxslt - libxslt-devel - libxml2 - libxml2-devel - gd-devel - geoip-devel
#javajdk_path: /app/jdk1.8.0_40jdk_link_path: /app/jdk
#pythonpython: Python-3.7.0depend: - 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实现安装filebeatansible-playbook -b -e host_ip=10.10.2.10 -v sofware_install.yml -t filebeat#通过tag实现安装nginxansible-playbook -b -e host_ip=10.10.2.10 -v sofware_install.yml -t nginx#通过tag实现安装pythonansible-playbook -b -e host_ip=10.10.2.10 -v sofware_install.yml -t python#通过tag实现安装javaansible-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


总结

基础软件安装阶段相当依赖《目录管理规范》,正所谓“没有规矩,不成方圆”,我们希望的是团队每个成员在登录服务器前,就已经对基础环境了如执掌,这样才能在无形中提高我们的工作效率。


ansible自动化:操作系统初始化具体实现

ansible自动化:编译安装mysql

运维思索:目录管理规范的重要性

滴滴夜莺:从监控告警系统向运维平台演化

kubedog:解决K8S在CI/CD中无法持续追踪问题

filebeat收集K8S日志,写入自动创建的索引



你与世界

只差一个

公众号




您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存