zoukankan      html  css  js  c++  java
  • Linux批量部署工具Expect

      既然没有遇到过,做好准备总是好的。这是自己送给自己的话,现在运维做自动话越来越多,自己就学以下,记录笔记。目前主流的有puppet、Expect、pssh等等,今天就用Expect做自动部署和日常管理维护。

    一、Expect简介

          expect是一种能够按照脚本内容里面设定的方式与交互式程序进行“会话”的程序。根据脚本内容,Expect可以知道程序会提示或反馈什么内容以及什么是正确的应答。它是一种可以提供“分支和嵌套结构”来引导程序流程的解释型脚本语言。
         我们熟知的shell编程功能虽然很强大,但是不能实现有交互功能的多机器之前的操作,例如ssh和scp等。而expect可以帮助我们来实现。

    二、安装

    [root@Server ~]# yum -y install expect

    三、Expect使用

    这里使用Expect批量管理和部署服务器大致分为两个步骤,使用for循环读取服务器IP、密码列表并取值,远程执行命令。如下需求,在两台服务器上执行自己命令mkdir /tmp/`date +%Y%m%d`,看下面实现方法。

    首先定义一个expect登录脚本:

    1、login.exp,内容如下:

     1 [root@Server ~]# vi /data/sh/login.exp 
     2 
     3 #!/usr/bin/expect -f
     4 set ip [lindex $argv 0 ]#读取ip
     5 set passwd [lindex $argv 1 ]#读取密码
     6 set command [lindex $argv 2]#命令
     7 set timeout 10#登录后下次执行命令间隔
     8 spawn ssh root@$ip#spawn   意思是执行命令,expect内命令,shell中不存在
     9 expect {
    10 "yes/no" { send "yes
    ";exp_continue }#选择yes
    11 "password:" { send "$passwd
    " }#读取
    12 }
    13 expect "*#*" { send "$command
    " }#执行命令
    14 expect eof

    2、创建批量执行脚本auto_exec.sh

    [root@Server ~]# vi auto_exec.sh 
    
    #!/bin/sh
    CMD="$*"
    for i in `awk '{print $1}' passwd.txt`#fou循环读取ip
    do
        j=`awk -v I="$i" '{if(I==$1)print $2}' passwd.txt`#密码
        expect /data/sh/login.exp  $i  $j  "$CMD"#执行
    done

    3、建立批量IP、密码文件

    1 [root@Server ~]# vi passwd.txt 
    2 
    3 192.168.17.135  123456
    4 192.168.17.128  123456
    5 192.168.17.136  123456

    四、测试脚本

    直接执行:

    [root@Server ~]# /bin/sh auto_exec.sh "mkdir -p /tmp/`date +%Y%m%d`"

    登录三台服务器在/tmp下有日期文件

    五、SCP远程拷贝

    如果需要远程推送文件,重新建立文件login.scp相关参数和auto_exec.sh变量:

    1、login.scp内容如下:

    [root@Server ~]# vi login.scp 
    
    #!/usr/bin/expect -f
    set ip [lindex $argv 0 ]
    set passwd [lindex $argv 1 ]
    set src_file [lindex $argv 2]
    set des_dir [lindex $argv 3]
    set timeout 1
    spawn scp -r $src_file root@$ip:$des_dir
    expect {
    "yes/no" { send "yes
    ";exp_continue }
    "password:" { send "$passwd
    " }
    }
    expect "#*"
    expect eof

    2、auto_exec.sh脚本内容如下:

    [root@Server ~]# vi auto_exec.sh
    
    #!/bin/sh
    read -p "Please Enter insert Source File or DIR: " src_file
    echo ======================================================
    sleep 1
    read -p "Please Enter insert Destination DIR: " des_dir
    for i in `awk '{print $1}' passwd.txt`
    do
        j=`awk -v I="$i" '{if(I==$1)print $2}' passwd.txt`
        expect login.scp  $i  $j $src_file $des_dir
    done

    密码保持不变即可。

    [root@Server ~]# /bin/sh auto_exec.sh
    Please Enter insert Source File or DIR: login.scp#本地文件
    ======================================================
    Please Enter insert Destination DIR: /home
    spawn scp -r login.scp root@192.168.17.135:/home#发送到客户端的文件

    六、一键安装expect、scp批量auto_exec.sh脚本:

    #!/bin/sh 
    if
      [ ! -e /usr/bin/expect ];then
      yum  install expect -y 
    fi
    #Judge passwd.txt exist 
    if
      [ ! -e ./passwd.txt ];then
      echo -e "The passwd.txt is not exist......Please touch ./passwd.txt ,Content Example:
    192.168.1.11 passwd1
    192.168.1.12 passwd2"
      sleep 2 &&exit 0 
    fi
    #Auto Tuoch login.exp File 
    cat >login.exp <<EOF 
    #!/usr/bin/expect -f 
    set ip [lindex $argv 0 ] 
    set passwd [lindex $argv 1 ] 
    set src_file [lindex $argv 2] 
    set des_dir [lindex $argv 3] 
    set timeout 1 
    spawn scp -r $src_file root@$ip:$des_dir 
    expect { 
    "yes/no" { send "yes
    ";exp_continue } 
    "password:" { send "$passwd
    " } 
    } 
    expect "#*"
    expect eof 
    EOF 
    ##Auto exec shell scripts 
    read -p "Please Enter insert Source File or DIR: " src_file 
    echo ====================================================== 
    sleep 1 
    read -p "Please Enter insert Destination DIR: " des_dir 
    for i in `awk '{print $1}' passwd.txt` 
    do
        j=`awk -v I="$i" '{if(I==$1)print $2}' passwd.txt` 
        expect ./login.exp  $i  $j $src_file $des_dir 

    就是以上几个脚本的合成。

    以下是expect用法

    1. [#!/usr/bin/expect] 
    
    这一行告诉操作系统脚本里的代码使用那一个shell来执行。这里的expect其实和linux下的bash、windows下的cmd是一类东西。 
    
    注意:这一行需要在脚本的第一行。 
    
    2. [set timeout 30] 
    
    基本上认识英文的都知道这是设置超时时间的,现在你只要记住他的计时单位是:秒   。timeout -1 为永不超时
    
    3. [spawn ssh -l username 192.168.1.1] 
    
    spawn是进入expect环境后才可以执行的expect内部命令,如果没有装expect或者直接在默认的SHELL下执行是找不到spawn命令的。所以不要用 “which spawn“之类的命令去找spawn命令。好比windows里的dir就是一个内部命令,这个命令由shell自带,你无法找到一个dir.com 或 dir.exe 的可执行文件。 
    
    它主要的功能是给ssh运行进程加个壳,用来传递交互指令。 
    
    4. [expect "password:"] 
    
    这里的expect也是expect的一个内部命令,有点晕吧,expect的shell命令和内部命令是一样的,但不是一个功能,习惯就好了。这个命令的意思是判断上次输出结果里是否包含“password:”的字符串,如果有则立即返回,否则就等待一段时间后返回,这里等待时长就是前面设置的30秒 
    
    5. [send "ispass
    "] 
    
    这里就是执行交互动作,与手工输入密码的动作等效。 
    
    温馨提示: 命令字符串结尾别忘记加上“
    ”,如果出现异常等待的状态可以核查一下。 
    
    6. [interact] 
    
    执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远程终端上。如果你只是登录过去执行 
    
    7.$argv 参数数组
    
    expect脚本可以接受从bash传递过来的参数.可以使用[lindex $argv n]获得,n从0开始,分别表示第一个,第二个,第三个....参数

    参考来源:http://www.linuxidc.com/Linux/2013-08/88660.htm

  • 相关阅读:
    Flash 全局安全性设置面板
    响应式布局的一个例子mark
    移动平台WEB前端开发技巧汇总
    自定义事件机制——观察者模式
    学习之响应式Web设计:Media Queries和Viewports
    常用栅格布局方案
    观察者模式的一个例子
    二进制文件转换为文本工具
    C#面向对象名词比较(二)
    MSN消息提示类
  • 原文地址:https://www.cnblogs.com/wulaoer/p/5166810.html
Copyright © 2011-2022 走看看