zoukankan      html  css  js  c++  java
  • python自动化运维七:fabric

    Fabric是基于Python实现的SSH命令行工具。可以采用命令行的方式来执行SSH。可以认为是在paramiko的基础上做了更高一层的封装。来看下如何使用。

    我们直接使用fab -H 192.168.0.9的时候提示错误,找不到任何的fabfiles

    root@zhf-linux:/home/zhf/zhf/python_prj/auto_manintance# fab -H 192.168.0.9


    Fatal error: Couldn't find any fabfiles!


    Remember that -f can be used to specify fabfile path, and use -h for help.


    Aborting


    我们现在就来编写fabfiles.

    from fabric.api import run

    def host_type():

    run('ls -al')

    然后再按照如下方式的使用。可以看到远程连接成功。

    root@zhf-linux:/home/zhf/zhf/python_prj/auto_manintance# fab -H 192.168.0.9 -f chapter7.py host_type

    [192.168.0.9] Executing task 'host_type'

    [192.168.0.9] run: ls -al

    [192.168.0.9] out: total 68

    [192.168.0.9] out: drwx------ 11 root root 4096 Oct 31 22:07 .

    [192.168.0.9] out: drwxr-xr-x 22 root root 4096 Jul 9 16:59 ..

    [192.168.0.9] out: -rw------- 1 root root 5403 Oct 31 22:36 .bash_history

    [192.168.0.9] out: -rw-r--r-- 1 root root 3106 Feb 20 2014 .bashrc

    [192.168.0.9] out: drwx------ 5 root root 4096 Aug 31 21:47 .cache

    [192.168.0.9] out: drwx------ 4 root root 4096 Jul 26 10:47 .config

    [192.168.0.9] out: drwx------ 3 root root 4096 Jul 9 15:59 .dbus

    [192.168.0.9] out: drwx------ 2 root root 4096 Jul 9 16:23 .gvfs

    [192.168.0.9] out: drwxr-xr-x 3 root root 4096 Jul 26 11:23 .local

    [192.168.0.9] out: drwxr-xr-x 2 root root 4096 Jul 26 11:33 .pip

    [192.168.0.9] out: -rw-r--r-- 1 root root 140 Feb 20 2014 .profile

    [192.168.0.9] out: drwxr-xr-x 3 root root 4096 Jul 26 11:41 .python-eggs

    [192.168.0.9] out: drwxr-xr-x 2 root root 4096 Oct 30 21:18 .rpmdb

    [192.168.0.9] out: drwx------ 2 root root 4096 Oct 27 23:11 .ssh

    [192.168.0.9] out: -rw-r--r-- 1 root root 0 Oct 29 10:02 test.txt

    [192.168.0.9] out: -rw------- 1 root root 5439 Oct 31 22:07 .viminfo

    [192.168.0.9] out:


    Done.

    Disconnecting from 192.168.0.9... done.


    Fab的参数如下:

    -l:显示定义好的任务函数名

    -f:指定fab入口文件,默认入口文件位fabfile.py

    -g:指定网关设备

    -H:指定目标主机

    -P:以异步方式运行多主机任务

    -R:指定角色区分不同业务组设备

    -t:设置设备连接超时时间

    -T:设置远程主机命令执行超时时间

    -w: 当命令执行失败,发出告警,而非默认终止任务


    我们也可以直接采用命令行的方式来执行。注意--前后都有空格

    root@zhf-linux:/home/zhf/zhf/python_prj/auto_manintance# fab -H 192.168.0.9 -- 'ls -al'


    fabric提供了一组功能强大的fabric.api命令集。主要有以下的方法:

    local:执行本地命令

    lcd:切换本地目录

    cd:切换远程目录

    run:执行远程命令

    sudo:sudo方式执行远程命令

    put:上传文件到远程主机

    get:从远程主机下载文件到本地

    prompt:获得用户输入信息

    confirm:获得提示信息确认

    reboot:重启远程主机

    @task:函数修饰符,标识的函数位为fab可调用的。非标记对fab不可见

    @runs_once:函数修饰符,标识的函数只会执行一次,不受多台主机影响。


    下面来看下fabfile的编写:

    首先是全局属性设定:evn evn对象的作用是定义fabrile的全局设定。支持多个属性,包括目标主机,用户,密码,角色等。来看下面的例子。首先通过env设置用户以及远程主机IP

    from fabric.api import *

    env.user='root'

    env.hosts=['192.168.0.9']


    def remote_task():

    with cd("/home/zhf"): #with的作用是让后面的表达式的语句集成当前状态实现cd /home/zhf && ls -al的效果

    run("ls -al")

    执行结果:

    root@zhf-linux:/home/zhf/zhf/python_prj/auto_manintance# fab -f chapter7.py remote_task

    [192.168.0.9] Executing task 'remote_task'

    [192.168.0.9] run: ls -al

    [192.168.0.9] out: total 59372

    [192.168.0.9] out: drwxr-xr-x 21 zhf zhf 4096 Nov 1 21:04 .

    [192.168.0.9] out: drwxr-xr-x 4 root root 4096 Oct 29 10:07 ..

    [192.168.0.9] out: -rw------- 1 zhf zhf 847 Oct 29 10:14 .bash_history

    [192.168.0.9] out: -rw-r--r-- 1 zhf zhf 220 Jul 2 16:44 .bash_logout

    [192.168.0.9] out: -rw-r--r-- 1 zhf zhf 3760 Jul 2 16:44 .bashrc

    [192.168.0.9] out: drwx------ 17 zhf zhf 4096 Jul 26 11:03 .cache

    [192.168.0.9] out: drwx------ 17 zhf zhf 4096 Jul 26 10:49 .config

    [192.168.0.9] out: drwx------ 3 zhf zhf 4096 Jul 9 09:19 .dbus

    [192.168.0.9] out: drwxr-xr-x 2 zhf zhf 4096 Jul 26 09:29 Desktop

    [192.168.0.9] out: -rw-r--r-- 1 zhf zhf 25 Jul 2 16:54 .dmrc

    [192.168.0.9] out: drwxr-xr-x 2 zhf zhf 4096 Jul 9 14:35 Documents

    [192.168.0.9] out: drwxr-xr-x 2 zhf zhf 4096 Jul 26 11:03 Downloads

    [192.168.0.9] out: -rw-r--r-- 1 zhf zhf 8980 Jul 2 16:44 examples.desktop

    [192.168.0.9] out: drwx------ 3 zhf zhf 4096 Nov 1 21:04 .gconf

    [192.168.0.9] out: -rw------- 1 zhf zhf 5920 Nov 1 21:04 .ICEauthority

    [192.168.0.9] out: drwx------ 3 zhf zhf 4096 Jul 2 16:55 .local

    [192.168.0.9] out: drwx------ 4 zhf zhf 4096 Jul 26 10:46 .mozilla

    [192.168.0.9] out: drwxr-xr-x 2 zhf zhf 4096 Jul 9 14:35 Music

    [192.168.0.9] out: drwxr-xr-x 2 zhf zhf 4096 Jul 9 14:35 Pictures

    [192.168.0.9] out: -rw-r--r-- 1 zhf zhf 675 Jul 2 16:44 .profile

    [192.168.0.9] out: drwxr-xr-x 2 zhf zhf 4096 Jul 9 14:35 Public

    [192.168.0.9] out: drwx------ 2 zhf zhf 4096 Oct 27 23:05 .ssh

    [192.168.0.9] out: -rw-r--r-- 1 root root 12376 Oct 29 21:21 syslogin.log

    [192.168.0.9] out: drwxr-xr-x 2 zhf zhf 4096 Jul 9 14:35 Templates

    [192.168.0.9] out: drwxr-xr-x 2 zhf zhf 4096 Jul 9 14:35 Videos

    [192.168.0.9] out: -rw-rw-r-- 1 zhf zhf 60638465 Oct 18 2013 VMwareTools-9.6.1-1378637.tar.gz

    [192.168.0.9] out: drwxr-xr-x 7 zhf zhf 4096 Oct 18 2013 vmware-tools-distrib

    [192.168.0.9] out: drwxr-xr-x 2 zhf zhf 4096 Jul 25 12:04 .wireshark

    [192.168.0.9] out: -rw------- 1 zhf zhf 64 Nov 1 21:04 .Xauthority

    [192.168.0.9] out: -rw------- 1 zhf zhf 354 Nov 1 21:04 .xsession-errors

    [192.168.0.9] out: -rw------- 1 zhf zhf 1576 Oct 31 22:36 .xsession-errors.old

    [192.168.0.9] out: drwxr-xr-x 4 root root 4096 Jul 26 11:34 zhf

    [192.168.0.9] out: drwxr-xr-x 2 zhf zhf 4096 Jul 2 17:51 下载

    [192.168.0.9] out:



    Done.

    Disconnecting from 192.168.0.9... done.


    我们再来看一个例子,前面的例子通过with cd("/home/zhf")设定死了远程切换的路径。下面的例子实现动态获取远程目录列表

    from fabric.api import *

    env.user='root'

    env.hosts=['192.168.0.9']


    @runs_once

    def input_raw():

    return prompt("please input directory name:",default="/home")


    def worktask(dirname):

    run("ls -al "+dirname)

    @task #设置task使得仅有gofab可见

    def go():

    getdirname=input_raw() #通过inpu_raw获得手动输入路径

    worktask(getdirname) #执行命令


    执行效果如下

    root@zhf-linux:/home/zhf/zhf/python_prj/auto_manintance# fab -f chapter7.py go

    [192.168.0.9] Executing task 'go'

    please input directory name: [/home] /home

    [192.168.0.9] run: ls -al /home

    [192.168.0.9] out: total 2664

    [192.168.0.9] out: drwxr-xr-x 4 root root 4096 Oct 29 10:07 .

    [192.168.0.9] out: drwxr-xr-x 22 root root 4096 Jul 9 16:59 ..

    [192.168.0.9] out: drwx------ 2 root root 16384 Jul 2 16:27 lost+found

    [192.168.0.9] out: -rwxr--r-- 1 root root 2696108 Oct 29 10:07 root

    [192.168.0.9] out: drwxr-xr-x 21 zhf zhf 4096 Nov 1 21:04 zhf

    [192.168.0.9] out:

    Done.

    Disconnecting from 192.168.0.9... done.


    那么这个@task修饰符究竟起什么作用呢,我们前面写过remote_task函数,这个是没有被task修饰的,函数中只有go是被task修饰的。我们来执行下remote_task看下结果。提示找不到remote_task,只有go是可用的命令。这正好说明了@task是表示函数仅对fab有效的作用。

    root@zhf-linux:/home/zhf/zhf/python_prj/auto_manintance# fab -f chapter7.py remote_task


    Warning: Command(s) not found:

    remote_task


    Available commands:


    go


  • 相关阅读:
    拥抱函数式编程 I
    关于CMS的那点事 I
    常用正规表达式
    javascript source map 的使用
    架构师修炼 后记
    CSS 天坑 I
    架构师修炼 III
    架构师修炼 II
    win10,VM14 安装cnetos6.9 虚拟机黑屏和只有光标闪烁解决办法
    C/C++数组初始化
  • 原文地址:https://www.cnblogs.com/zhanghongfeng/p/7768796.html
Copyright © 2011-2022 走看看