Python自动化运维

发布 : 2017-08-02 分类 : Python 浏览 :

Pexpect是Don Libes的Expect语言的一个Python实现,是一个用来启动子程序,并使用正则表达式对程序输出做出特定响应,以此实现与其自动交互的Python模块

Pexpect的使用范围很广,可以用来实现与ssh、ftp、telnet等程序的自动交互,可以用来自动复制软件安装包并在不同机器自动安装,还可以用来实现软件测试中与命令行交互的自动化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# -*- coding: utf-8 -*-
# !/usr/bin/env python
from pexpect import pxssh
import getpass

# 调用构造函数,创建一个 pxssh 类的对象.
s = pxssh.pxssh()
# 获得用户指定 ssh 主机域名.
hostname = input('hostname: ')
# 获得用户指定 ssh 主机用户名.
username = input('username: ')
# 获得用户指定 ssh 主机密码.
password = getpass.getpass('password: ')
# 利用 pxssh 类的 login 方法进行 ssh 登录,原始 prompt 为'$' , '#'或'>'
s.login(hostname, username, password, original_prompt='[$#>]')
# 发送命令 'uptime'
s.sendline('uptime')
# 匹配 prompt
s.prompt()
# 将 prompt 前所有内容打印出,即命令 'uptime' 的执行结果.
print(s.before)
# 发送命令 ' ls -l '
s.sendline('ls -l')
# 匹配 prompt
s.prompt()
# 退出 ssh session
s.logout()

运行结果

1
2
3
4
5
6
7
hostname: 115.28.240.96
115.28.240.96
username: root
root
password: 88aa66AA

b'uptime\r\n 13:05:13 up 30 days, 20:04, 2 users, load average: 0.00, 0.01, 0.05\r\n'

Fabric目前只支持Python2.x

Fabric是一个Python(2.5-2.7)库,用于简化使用SSH的应用程序部署或系统管理任务。

它提供的操作包括:执行本地或远程shell命令,上传/下载文件,以及其他辅助功能,如提示用户输入、中止执行等

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/hello’)
  • get:从远程主机下载文件到本地,如:get(‘/home/python/world’,’/home/matrix/world’)
  • reboot:重启远程主机,如:reboot()
  • @task:函数装饰器,标识的函数为fab可调用,非标记的对fab不可见,纯业务逻辑
  • @runs_once:函数装饰器,标识的函数只会执行一次,不受多台主机影响

Fabric全局属性设定

  • env.host:定义目标主机,如:env.host=[‘192.168.3.243’,’192.168.3.244’]
  • env.user:定义用户名,如:env.user=”root”
  • env.port:定义目标主机端口,默认为22,如:env.port=”22”
  • env.password:定义密码,如:env.password=”lmb2015”
  • env.passwords:不同的主机不同的密码,如:env.passwords={'root@192.168.3.243:22’:’lmb2015’,'root@192.168.3.244:22’:’lmb2015’}

安装ANACONDA

1
bash Anaconda2-4.4.0-Linux-x86_64.sh

安装Fabric

1
conda install fabric

执行本地shell命令

1
[root@VM-2-2 ~]# cd /data/test
1
[root@VM-2-2 test]# vi fabricDemo.py
1
2
3
4
5
6
7
# -*- coding: utf-8 -*-

from fabric.api import local

# fabric.api包里的local()方法可以用来执行本地Shell命令
def hello():
local('ls -l /home/')

hello()函数就是一个任务

执行

1
2
3
4
5
6
7
[root@VM-2-2 test]# fab -f demo.py hello
[localhost] local: ls -l /home/
总用量 8
drwx------. 8 hadoop hadoop 4096 4月 14 17:17 hadoop
drwx------ 3 hanlp hanlp 4096 5月 8 11:13 hanlp

Done.

任务带参数

1
2
3
4
5
[root@VM-2-2 test]# vi fabricDemo.py
# -*- coding: utf-8 -*-

def hello(name, value):
print "Hello Fabric!%s=%s" % (name, value)

执行

1
2
3
4
[root@VM-2-2 test]# fab -f demo.py hello:name=matrix,value=sparse
Hello Fabric!matrix=sparse

Done.

执行远程命令

1
2
3
4
5
6
7
8
9
10
11
12
[root@VM-2-2 test]# vi fabricDemo.py
# -*- coding: utf-8 -*-

from fabric.api import run, env

env.hosts = ['115.28.240.96']
env.user = 'root'
env.password = 'xxxxxx'


def hello():
run('ls -l /home')

执行

1
2
3
4
5
6
7
8
9
10
[root@VM-2-2 test]# fab -f demo.py hello
[115.28.240.96] Executing task 'hello'
[115.28.240.96] run: ls -l /home
[115.28.240.96] out: total 4
[115.28.240.96] out: drwx------. 8 matrix matrix 4096 Jul 28 17:59 matrix
[115.28.240.96] out:


Done.
Disconnecting from 115.28.240.96... done.

动态获取远程目录列表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# -*- coding: utf-8 -*-

from fabric.api import *

env.hosts = ['192.168.3.243', '192.168.3.244']
env.user = 'root'
env.password = 'lmb2015'


@runs_once
def input_raw():
return prompt("please input name:", default="/home")


def workask(dirname):
run('ls -l ' + dirname)


@task
def go():
print "start ..."
getdirname = raw_input()
workask(getdirname)
print "end ..."

执行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@VM-2-2 test]# fab -f demo.py go
[192.168.3.243] Executing task 'go'
start ...
/root
[192.168.3.243] run: ls -l /root
[192.168.3.243] out: 总用量 300588
[192.168.3.243] out: -rw-------. 1 root root 1067 4月 28 2015 anaconda-ks.cfg
[192.168.3.243] out: -rw-r--r--. 1 root root 601 2月 22 10:53 id_dsa.pub
[192.168.3.243] out: -rw-r--r--. 1 root root 13231 4月 28 2015 install.log
[192.168.3.243] out: -rw-r--r--. 1 root root 3482 4月 28 2015 install.log.syslog
[192.168.3.243] out: -rw-r--r--. 1 root root 138082565 2月 22 10:23 jdk-7u79-linux-x64.rpm
[192.168.3.243] out: -rw-r--r-- 1 root root 142039186 3月 13 12:09 oracle-j2sdk1.7-1.7.0+update67-1.x86_64.rpm
[192.168.3.243] out: -rw-r--r-- 1 root root 15733676 6月 16 10:06 perl-5.16.1.tar.gz
[192.168.3.243] out: drwxrwxr-x 6 root root 4096 2月 12 23:14 redis-3.2.8
[192.168.3.243] out: -rw-r--r-- 1 root root 1547237 6月 16 10:06 redis-3.2.8.tar.gz
[192.168.3.243] out: -rw-r--r-- 1 root root 1547695 7月 6 14:51 redis-3.2.9.tar.gz
[192.168.3.243] out: drwxr-xr-x 13 15399 19249 4096 9月 20 2013 tcl8.6.1
[192.168.3.243] out: -rw-r--r-- 1 root root 8755700 6月 16 10:06 tcl8.6.1-src.tar.gz
[192.168.3.243] out: -rw-r--r--. 1 root root 46333 3月 7 14:09 zookeeper.out
[192.168.3.243] out:

end ...
本文作者 : Matrix
原文链接 : https://matrixsparse.github.io/2017/08/02/Python自动化运维/
版权声明 : 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

知识 & 情怀 | 二者兼得

微信扫一扫, 向我投食

微信扫一扫, 向我投食

支付宝扫一扫, 向我投食

支付宝扫一扫, 向我投食

留下足迹