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


  • 相关阅读:
    Leetcode 15 3Sum
    Leetcode 383 Ransom Note
    用i个点组成高度为不超过j的二叉树的数量。
    配对问题 小于10 1.3.5
    字符矩阵的旋转 镜面对称 1.2.2
    字符串统计 连续的某个字符的数量 1.1.4
    USACO twofive 没理解
    1002 All Roads Lead to Rome
    USACO 5.5.1 求矩形并的周长
    USACO 5.5.2 字符串的最小表示法
  • 原文地址:https://www.cnblogs.com/zhanghongfeng/p/7768796.html
Copyright © 2011-2022 走看看