专栏首页Devops专栏Ansible批量执行shell脚本,检查服务器的磁盘使用情况

Ansible批量执行shell脚本,检查服务器的磁盘使用情况

实战ansible

前言

本次实战目的:

  • 批量管理200-300台机器,执行shell脚本任务等功能。
  • 检查服务器的磁盘使用情况
  • 在此,我们使用几台机器进行模拟即可。

配置ansible的host文件(/etc/ansible/hosts),设置需要执行的服务器IP地址

执行一个简单的shell命令,使用管道符号等

[root@server81 ansible]# ansible servers -m shell -a "df -h | grep dev"
172.16.5.193 | CHANGED | rc=0 >>
/dev/mapper/centos-root   37G   12G   26G  32% /
devtmpfs                 473M     0  473M   0% /dev
tmpfs                    489M     0  489M   0% /dev/shm
/dev/sda1               1014M  179M  836M  18% /boot
/dev/sr0                 4.3G  4.3G     0 100% /run/media/root/CentOS 7 x86_64

172.16.5.181 | CHANGED | rc=0 >>
/dev/mapper/centos-root   50G   22G   29G  43% /
devtmpfs                 901M     0  901M   0% /dev
tmpfs                    912M  124K  912M   1% /dev/shm
/dev/sda1               1014M  143M  872M  15% /boot
/dev/mapper/centos-home   37G  1.6G   36G   5% /home

[root@server81 ansible]# 

使用ansible的shell命令可以执行shell脚本以及命令(包含管道),下面来看看怎么执行shell脚本。

执行shell脚本

要执行shell脚本,首先需要三个步骤

  • 写好shell脚本
  • 批量拷贝shell脚本到各台服务器
  • 批量执行shell脚本

编写一个检查磁盘使用率的脚本

[root@server81 ansible]# vim check_disk.sh 

#!/bin/bash
basedir=$(cd `dirname $0`;pwd)

diskmax=10 # 磁盘的阈值

function check_max(){
   local disk_size=$1
   if [ $disk_size -ge $diskmax ]
   then
      echo "unhealth"
   else
      echo "health"
   fi
}

function check_disk_info(){
   df -h | grep -v /dev/loop0 | grep -v /dev/sr0 | awk 'NR > 1 {print $5}' | cut -d '%' -f 1 | while read disk_size
   do
        echo ""
        echo "disk_size=$disk_size%"
        check_max $disk_size
   done
}

check_disk_info

执行如下:

[root@server81 ansible]# ./check_disk.sh 

disk_size=43%
unhealth

disk_size=0%
health

disk_size=0%
health

disk_size=10%
unhealth

disk_size=0%
health

disk_size=15%
unhealth

disk_size=5%
health

disk_size=0%
health
[root@server81 ansible]# 

设置磁盘使用率的阈值是 10% ,这里只要判断打印出存在unhealth 非健康的磁盘即可。但是这篇主要是讲解ansible执行shell,暂时不继续深入研究这个脚本如何优化了。

拷贝脚本之前,先远程创建好准备拷贝过去的文件目录。

其中远程创建文件目录有两种方式,操作如下:

shell命令方式

[root@server81 work]# ansible servers -m shell -a "mkdir -p /work/ansible"
 [WARNING]: Consider using the file module with state=directory rather than running mkdir.  If you need to use command because file
is insufficient you can add warn=False to this command task or set command_warnings=False in ansible.cfg to get rid of this
message.

172.16.5.193 | CHANGED | rc=0 >>


172.16.5.181 | CHANGED | rc=0 >>


[root@server81 work]# ls
ansible  proxy  sh
[root@server81 work]# ls -ll
total 4
drwxr-xr-x  2 root root    6 Dec  4 11:31 ansible
drwxr-xr-x 11 root root 4096 Nov  1 14:52 proxy
drwxr-xr-x  2 root root   40 Nov 23 17:47 sh
[root@server81 work]# 

从上面看到server81的该目录下已经创建了/work/ansible的文件目录了,那么另一台服务器呢,我们来看看。

那么其实,现在已经可以开始拷贝脚本了,我个人是比较喜欢这种方式。但是也可以看到执行的时候出现了警告,最好使用file命令来执行。

file命令执行创建文件夹

ansible servers -m file -a "path=/work/file state=directory  mode=0644"

批量拷贝shell脚本到各台服务器

ansible 资产组 -m copy -a "src=拷贝文件路径 dest=拷贝目前文件路径 mode=0755

[root@server81 ansible]# ansible servers -m copy -a "src=/root/ansible/check_disk.sh dest=/work/file/check_disk.sh mode=0755"
172.16.5.193 | CHANGED => {
    "changed": true, 
    "checksum": "e11811d20235155ab1bcebc36d91e7c660204ab8", 
    "dest": "/work/file/check_disk.sh", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "597beadbc968775183a41dd14cd92460", 
    "mode": "0755", 
    "owner": "root", 
    "size": 472, 
    "src": "/root/.ansible/tmp/ansible-tmp-1543895195.8-77636350582289/source", 
    "state": "file", 
    "uid": 0
}
172.16.5.181 | CHANGED => {
    "changed": true, 
    "checksum": "e11811d20235155ab1bcebc36d91e7c660204ab8", 
    "dest": "/work/file/check_disk.sh", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "597beadbc968775183a41dd14cd92460", 
    "mode": "0755", 
    "owner": "root", 
    "size": 472, 
    "src": "/root/.ansible/tmp/ansible-tmp-1543895195.83-172748548893076/source", 
    "state": "file", 
    "uid": 0
}
[root@server81 ansible]# 

截图解析如下:

server181

server181

server193

那么如果重复执行这个拷贝文件的命令,会导致怎么样的结果呢?

批量执行shell脚本

ansible servers -m shell -a "/work/file/check_disk.sh"

[root@server81 ansible]# ansible servers -m shell -a "/work/file/check_disk.sh"
172.16.5.193 | CHANGED | rc=0 >>

disk_size=32%
unhealth

disk_size=0%
health

disk_size=0%
health

disk_size=11%
unhealth

disk_size=0%
health

disk_size=18%
unhealth

disk_size=1%
health

172.16.5.181 | CHANGED | rc=0 >>

disk_size=43%
unhealth

disk_size=0%
health

disk_size=1%
health

disk_size=11%
unhealth

disk_size=0%
health

disk_size=15%
unhealth

disk_size=5%
health

disk_size=0%
health

[root@server81 ansible]# 

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Ansible批量推送主机公钥至其他服务器

    如果手工一台台去配置服务器公钥的话,数量少人力还可以完成。但是如果达到数百台至上千台,人工是无法处理过来的,效率也低下。 那么下面用两台centos7的虚拟机...

    Devops海洋的渔夫
  • 实战 Centos7 \ Oracle Linux 7.5 离线安装ansible

    本次实战情况是因为服务器机房由于安全原因,处理无网络的网闸区域。在这样的情况下,就需要采用离线安装ansible的方式来进行安装了。

    Devops海洋的渔夫
  • JavaScript 函数传参、以及 返回值 return关键字

    Devops海洋的渔夫
  • 项目实战:如何构建知识图谱

    作者丨徐阿衡 学校丨卡耐基梅隆大学硕士 研究方向丨QA系统 实践了下怎么建一个简单的知识图谱,两个版本,一个从 0 开始(start from scratch)...

    小莹莹
  • 美团餐饮娱乐知识图谱——美团大脑揭秘

    “ I’m sorry. I can’t do that, Dave.” 这是经典科幻电影《2001: A Space Odyssey》里HAL 9000机器人...

    美团技术团队
  • 动手实现react Modal组件

    如上图所示,一个Modal组件可以分为mask、header、body和footer四部分,mask就不用说了,header主要是显示title和关闭按钮,bo...

    嘿嘿嘿
  • ESXI上的vm虚拟机文件被锁定无法POWER ON的问题处理

       一台生产业务的虚拟机假死,强行关机后无法POWER ON。在启动时报虚拟机文件被锁定,错误信息如下:

    孙杰
  • Python中@注解的用法

    在python中,@可以将python定义的函数“当做”属性访问,从而提供更加友好访问方式。

    用户2398817
  • python+C、C++混合编程的应用

    TIOBE每个月都会新鲜出炉一份流行编程语言排行榜,这里会列出最流行的20种语言。排序说明不了语言的好坏,反应的不过是某个软件开发领域的热门程度。语言的发展不是...

    用户2398817
  • python爬虫实战-爬取微信公众号所有历史文章 - (00) 概述

    最近几年随着人工智能和大数据的兴起,python也越来越火。一番工作中虽然从没直接要求用到python语言,但由于做linux相关,多多少少会接触一些s...

    efonfighting

扫码关注云+社区

领取腾讯云代金券