运维(23)- shell自动化部署

简介: 运维(23)- shell自动化部署

pexpect

Pexpect 是 Don Libes 的 Expect 语言的一个 Python 实现,是一个用来启动子程序,并使用正则表达式对程序输出做出特定响应,以此实现与其自动交互的 Python 模块。 Pexpect 的使用范围很广,可以用来实现与 ssh、ftp 、telnet 等程序的自动交互;可以用来自动复制软件安装包并在不同机器自动安装;还可以用来实现软件测试中与命令行交互的自动化。

import pexpect
import sys
child = pexpect.spawn('ssh std20@123.57.211.212')
child.logfile = sys.stdout
#fout = file('mylog.txt', 'w')
#child.logfile = fout
child.expect('password:')
child.sendline('std20')
child.expect('std20.*')
child.sendline('ls /')
child.expect('std20.*')
child.sendline('exit')
#coding=utf_8
from pexpect import pxssh
import sys
s = pxssh.pxssh()
s.logfile = sys.stdout
hostname = '123.57.211.212'
username = 'std20'
password = 'std20'
s.login(hostname, username, password)
s.sendline('ls /')
s.prompt()  #匹配系统提示符
s.sendline('whoami')
s.prompt()  
s.logout()

fabric

项目发布和运维的工作相当机械,频率还蛮高,导致时间浪费在敲大量重复的命令上。

修复bug什么的,测试,提交版本库(2分钟),ssh到测试环境pull部署(2分钟),rsync到线上机器A,B,C,D,E(1分钟),分别ssh到ABCDE五台机器,逐一重启(8-10分钟) = 13-15分钟

其中郁闷的是,每次操作都是相同的,命令一样,要命的是在多个机器上,很难在本机一个脚本搞定,主要时间都浪费在ssh,敲命令上了,写成脚本,完全可以一键执行,花两分钟看下执行结果。

安装
pip install fabric
入门示例
#fabfile.py
from fabric.api import run
def host_type():
    run('uname -s')

启动

itcast@ubuntu:~/tmp/fab$ fab -H 127.0.0.1 host_type
[127.0.0.1] Executing task 'host_type'
[127.0.0.1] run: uname -s
[127.0.0.1] Login password for 'itcast': 
[127.0.0.1] out: Linux
[127.0.0.1] out: 
Done.
Disconnecting from 127.0.0.1... done.
itcast@ubuntu:~/tmp/fab$ fab -H 127.0.0.1 host_type
[127.0.0.1] Executing task 'host_type'
[127.0.0.1] run: uname -s
[127.0.0.1] Login password for 'itcast': 
[127.0.0.1] out: Linux
[127.0.0.1] out: 
fabric常用参数
-l : 显示定义好的任务函数名
-f : 指定fab入口文件,默认入口文件名为fabfile.py
-H : 指定目标主机,多台主机用","号分割
fabric常用API
local : 执行本地命令,如:local('uname -s')
lcd : 切换本地目录,如:lcd('/home')
cd : 切换远程目录,如:cd('/etc')
run : 执行远程命令,如:run('free -m')
sudo : sudo方式执行远程命令,如:sudo('touch /abc')
put : 上传本地文件到远程主机,如:put('/hello', '/home/itcast/hello')
get : 从远程主机下载文件到本地,如:get('/home/python/world', '/home/itcast/world')
reboot : 重启远程主机,如:reboot()
@task : 函数装饰器,标识的函数为fab可调用的,非标记的对fab不可见,纯业务逻辑
@runs_once : 函数装饰器,标识的函数只会执行一次,不受多台主机影响
fabric全局属性设定
env.host : 定义目标主机,如:env.host=['192.168.17.192', '192.168.17.193']
env.user : 定义用户名,如:env.user="root"
env.port : 定义目标主机端口,默认为22,如:env.port="22"
env.password : 定义密码,如:env.password="chuanzhi"
env.passwords : 不同的主机不同的密码,如:env.passwords={'itcast@192.168.17.192:22':'chuanzhi', 'itcast@192.168.17.193:22':'python'}

示例1:动态获取远程目录列表

from fabric.api import *
env.hosts=['192.168.17.192', '192.168.17.193']
#env.password='python'
env.passwords = {
    'itcast@192.168.17.192:22':'python',
    'itcast@192.168.17.193:22':'python',
}
@runs_once
def input_raw():
    return prompt("please input directory name:", default="/home")
def workask(dirname):
    run('ls -l ' + dirname)
@task
def go():
    print('start ...')
    getdirname = input_raw()
    workask(getdirname)
    print('end ...')

示例2:上传文件并执行

from fabric.api import *
env.user = 'itcast'
env.hosts = ['192.168.17.192', '192.168.17.193']
env.password = 'python'
@task
@runs_once
def tar_task():
    with lcd('/home/itcast/testdemo'):
        local('tar zcvf demo.tar.gz demo.py')
@task
def put_task():
    run('mkdir -p /home/itcast/testdemo')
    with cd('/home/itcast/testdemo'):
        put('/home/itcast/testdemo/demo.tar.gz', '/home/itcast/testdemo/demo.tar.gz')
@task
def check_task():
    lmd5 = local('md5sum /home/itcast/testdemo/demo.tar.gz', capture=True).split(' ')[0]
    rmd5 = run('md5sum /home/itcast/testdemo/demo.tar.gz').split(' ')[0]
    if lmd5 == rmd5:
        print('OK ...')
    else:
        print('ERROR ...')
@task
def run_task():
    with cd('/home/itcast/testdemo'):
        run('tar zxvf demo.tar.gz')
        run('python demo.py')
@task
def go():
    tar_task()
    put_task()
    check_task()
    run_task()

代码自动化部署

from fabric.api import *
env.user = 'itcast'
env.hosts = ['192.168.17.192', '192.168.17.193']
env.password = 'python'
@runs_once
@task
def local_update():
    with lcd("/home/itcast/tmp/itcasthello"):
        local("git add -A")
        local("git commit -m 'update'")
        local("git pull origin master")
        local("git push origin master")
@task
def remote_update():
    with cd("/home/itcast/tmp/itcasthello"):
        run("git checkout master")
        run("git pull origin master")
@task
def deploy():
    local_update()
    remote_update()
目录
相关文章
|
27天前
|
运维 监控
现代运维中的自动化技术应用与挑战
现代运维工作中,自动化技术的应用已成为提高效率、降低成本的重要手段。本文探讨了自动化技术在运维领域的应用现状和挑战,包括自动化工具的选择、实施过程中的注意事项以及未来发展趋势。通过深入分析,帮助读者更好地理解和应用自动化技术,提升运维工作效率。
13 2
|
1月前
|
人工智能 运维 监控
现代运维中的自动化趋势与挑战
随着信息技术的快速发展,现代运维领域也面临着越来越多的挑战与机遇。本文将探讨当前运维中自动化的趋势以及相关的挑战,分析自动化在提高效率、降低成本等方面的重要性,并讨论未来运维领域的发展方向。
28 2
|
3月前
|
监控 安全 Shell
Shell脚本实现企业电脑屏幕监控的自动化部署与维护
企业信息安全一直是重要的议题,而屏幕监控是一种有效的手段之一。本文将介绍如何使用Shell脚本实现企业电脑屏幕监控的自动化部署与维护,并在结尾部分说明如何将监控到的数据自动提交到指定网站。
213 1
|
4月前
|
弹性计算 运维 安全
带你读《云上自动化运维宝典》——万字长文带你了解 CloudOps自动化运维的奥秘,助力云上业务高效稳定运行(1)
带你读《云上自动化运维宝典》——万字长文带你了解 CloudOps自动化运维的奥秘,助力云上业务高效稳定运行(1)
376 1
|
4月前
|
弹性计算 运维 监控
带你读《云上自动化运维宝典》——如何使用OOS有效进行云上自动化运维(1)
带你读《云上自动化运维宝典》——如何使用OOS有效进行云上自动化运维(1)
253 0
|
4月前
|
弹性计算 运维 安全
带你读《云上自动化运维宝典》——如何使用OOS有效进行云上自动化运维(2)
带你读《云上自动化运维宝典》——如何使用OOS有效进行云上自动化运维(2)
246 1
|
4月前
|
Linux Shell 索引
Python自动化脚本-运维人员宝典第一章 Python脚本概述
在学习本书前,你应该了解一些 Python 编程的基础知识,比如基础语法、变量类型、元组数据类型、列表字典、函数、字符串和方法。在python.org/downloads/上有3.7.2和2.7.15两个版本可供下载。本书中我们将使用3.7这一版本来作为代表示例和包的安装。
236 11
|
1月前
|
人工智能 运维 Prometheus
现代运维中的自动化工具与挑战
随着信息技术的不断发展,现代运维工作日益复杂且关键。本文将探讨现代运维中自动化工具的应用与挑战,介绍各类自动化工具在提高效率、降低风险方面的作用,并讨论在实际应用中可能面临的问题与解决方法。
25 4
|
1月前
|
运维 负载均衡 监控
提升运维效率:自动化工具在云端环境中的应用
随着云计算技术的快速发展,运维工作面临着更加复杂和繁重的挑战。本文将探讨如何利用自动化工具在云端环境中提升运维效率,从而降低成本、减少人为错误,并实现更高水平的运维管理。
|
3月前
|
存储 运维 Shell
Shell内置命令大全,Linux运维工程师收藏!
Shell内置命令大全,Linux运维工程师收藏!
168 0
Shell内置命令大全,Linux运维工程师收藏!