一种通过简易的、纯原生Shell脚本实现将常用软件统一推送到Linux电脑上的方法

1、真实项目场景

1.1、项目场景概述

前段时间,本人在项目上遇到了一个较为突发的情况——某应用厂商部署服务器上软件下发工具因为出现了兼容性问题而无法使用,导致项目实施计划中的常用办公软件统一推送这个步骤无法进行。因此我们面临人工为300多台Linux电脑安装常用办公软件这样费时且重复性的劳动,并且这300多台Linux电脑因为工期的原因必须立即下发安装,不能延后下发,因此我们需要另外写一个合适的自动化脚本来消除这样重复性的劳动。

1.2、项目场景分析

我们全面分析了项目中的场景,包括用户总体使用电脑的习惯和原本部署在服务器上推送工具的功能等,总结起来大致为以下几点:
1、用户所处的机构是较为敏感的机构,对于服务器和客户端上的软件安装有着非常严格的限制,因此像Ansible、expect这样的工具安装上去会有很长时间的审批流程要走,这个方法不太合适;
2、不同用户使用Linux电脑的时间不是统一的,因此我们在服务端统一推送软件时,会因为有的用户未使用电脑而无法推送;
3、原有的推送工具针对用户使用电脑时间不统一的问题,有这样的解决方式——推送行为发生后,用户第一次开启Linux电脑会有软件推送提示,要求用户点击“同意”以进行软件获取和安装。

1.3、解决思路

1、常规的自动化批量安装软件的思路,都是在服务器上做操作,然后一起推送下去,这样做的前提是客户端在这个时候必须保持开机且网络正常,并且这样做不可避免的要使用Ansible或者expect这样的额外工具,因此不满足上述1.2小节中的第1、2两点;
2、原有的推送软件针于用户使用电脑时间不统一问题,有推送提醒这样的解决方案,从技术的角度上来看,用户在点击“同意”之前,相关的安装包事实上是没有推送到客户端中的,所以从本质上来说,这样的行为并不是“服务器主动将安装包推给客户端”,而是“客户端主动找服务器要的安装包”,这也就解决了用户开机时间不统一的问题。除此之外,相较于服务器主动统一推送,客户端按需向服务端获取这种方式还避免了前者那样高的并发流量,也减轻了网络和服务器的处理负担;
3、如果按照第2点思路编写Shell,那么相关脚本的执行主要是在客户端上进行而不是服务端上

2、Shell脚本设计

在这里插入图片描述

3、脚本编码(以推送有道词典Linux版为例)

#!/bin/bash
#author:Yan Muhuan
#date:2021-2-28
#version:V1.0
#注意:本脚本使用前提是客户端和服务端之间已经设置好了免密登录

userPasswd="yanmuhuan1997114"

#查看服务器安装包是否推送到本地”~/推送文件“路径下,本程序只是以有道词典Linux版为例,如果实际环境下涉及到多个软件,可以在此基础上增加elif分支或使用文本操作
function checkDirFile(){
    mkdir ~/推送文件
    if [ ! -f "~/推送文件/youdao-dict_6.0.0-0-deepin_amd64.deb" ];then
        echo "有道词典安装包不存在,开始从服务器上获取!"
        scp yanmuhuan@192.168.2.199:~/file_auto_install/youdao-dict_6.0.0-0-deepin_amd64.deb ~/推送文件
    else
        echo "所有安装包存在!"
    fi
}

#安装相关软件
function installSoftware(){
    cd ~/推送文件
    echo "$userPasswd" | sudo -S dpkg -i *.deb
}

#查看相关软件是否已经安装
function checkSoftwareList(){
    touch ~/softwareList.txt
    dpkg --list | grep youdao >> ~/softwareList.txt
    tempSoftwareInstall=$(cat ~/softwareList.txt | grep youdao)
    if [ ! -n "$tempSoftwareInstall" ];then
        checkDirFile     #调用函数checkDirFile:检查推送文件目录下是否有安装包
        installSoftware  #调用函数installSoftware:安装推送文件目录下的所有安装包 
    else
        echo "相关软件已安装,无需重新安装!"
    fi
}

checkSoftwareList  #调用函数checkSoftwareList,程序开始执行

4、脚本执行

通常情况下,这一脚本的执行会经常被想到用开机自启动的方法自动执行,但这一方法有一个细节往往被忽略——即该脚本成功执行的前提条件是Linux客户端和服务器可以正常进行网络通信,而如果在开机过程中,该脚本在网络成功连接前抢先执行,那么该脚本将执行失败,相关软件也将不能获取或许有人认为可以更改启动顺序(优先级),但Linux设备网卡启动完成的标志是网卡处于up状态,并非联网成功,因此这一思路是不行的
针对于上述的问题,我们给出的解决方法是通过“crontab -e”命令来定时执行该脚本(循环执行几次可保证相关软件都可以安装上),虽然会导致脚本多出不必要的执行步骤,但这些步骤对于Linux客户端的资源消耗是完全可以承受的,并且因为是先检查本地软件,软件没安装才向服务器发起请求,因此对于网络和服务器资源的消耗也是最小的,如下图,这里设定为每30分钟执行一次,当然真实环境要按需求设定:
在这里插入图片描述
执行结果如下图所示:
在这里插入图片描述

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页