Python使用Fabric模块实现自动化运维(2)

@task  #函数修饰符,标识的函数为fab可调用的,非标记对fab不可见,纯业务逻辑
@runs_once  #函数修饰符,标识的函数只会执行一次,不受多台主机影响

Fabric应用示例说明

1、查看本地与远程主机信息

本示例调用local方法执行本地命令,添加@runs_once修饰符保证任务函数只执行一次,调用run方法执行远程命令。

#!/usr/bin/env python
# -*- encoding: utf-8 -*-

from fabric.api import *

env.user = 'root'
env.hosts = ['192.168.1.22']
env.password = '123456'

@runs_once  #查看本地系统信息,当有多台主机时只运行一次
def local_task():  #本地任务函数
    local('uname -a')
   
def remote_task():
    with cd('/var/logs'):  #with的作用是让后面的表达式语句继承当前状态,实现:cd /var/logs  && ls -l的效果
        run('ls -l')

执行:

fab -f simple1.py local_task

fab -f simple1.py remote_task

2、动态获取远程目录列表

本例调用@task修饰符标志入口函数go()对外部可见,配合@runs_once修饰符接收用户输入,最后调用worktask()函数实现远程命令执行。

#!/usr/bin/env python
# -*- encoding: utf-8 -*-

from fabric.api import *

env.user = 'root'
env.hosts = ['192.168.1.22']
env.password = '123456'

@runs_once  #主机遍历过程中,只有第一台触发此函数
def input_raw():
    return prompt('please input directoryname:',default='/root')

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

@task    #限定只有go函数对fab命令可见,其他没有使用@task标记的函数fab命令不可用
def go():
    getdirname = input_raw()
    worktask(getdirname)

执行:

1

fab -f simple2.py go

对于上面的结果做了一些测试发现:

1.设置了默认值,不输入就是以默认值为准,如果不设置默认值,那么dirname就是空的,ls -l的就是你登录用户的家目录,例如是root就是/root

2.对于写在go函数下的内容,有多少主机就会循环多少次,他是以主机为循环的.

3.这个脚本是对于所有的主机列出同一个目录,对于不同的主机让选择不同的目录,可以简单的修改为:

def worktask(dirname):

run('ls -l '+dirname)

@task

def go():

getdirname=raw_input("please input directory:")

worktask(getdirname)

3.文件打包上传校验

#!/usr/bin/env python
from fabric.api import *
from fabric.colors import *
 
env.hosts=['192.168.56.30']
env.user='root'
env.passwords={'root@192.168.56.30:22':'rooter'}
 
@runs_once
@task
def tarfile():
    print yellow('tar file ...')
#使用with lcd命令,否则需要写全路径,直接lcd没用
    with lcd('/var/log'):
        local('tar czf messages.tar.gz messages')
 
@task
def putfile():
    print blue('put file ...')
    run('mkdir -p /tmp/log')
    with cd('/tmp/log'):
#warn_only当出现异常的时候继续执行
        with settings(warn_only=True):
            result=put('/var/log/messages.tar.gz','/tmp/log')
        if result.failed and not confirm('put file filed,Continue[Y/N]?'):
            abort('Aborting file put task!')
 
@task
def checkfile():
    print red('check file ...')
    with settings(warn_only=True):
#本地local命令需要配置capture=True才能获取返回值
        lmd5=local('md5sum /var/log/messages.tar.gz',capture=True).split(' ')[0]
        rmd5=run('md5sum /tmp/log/messages.tar.gz').split(' ')[0]
    if lmd5==rmd5:
        print 'ok'
    else:
        print 'error'
 
@task 
def go():
    tarfile()
    putfile()
    checkfile()

 

下面是运行结果,有颜色的区别:

[192.168.56.30] Executing task 'go'

<span>tar file ...</span>

[localhost] local: tar czf messages.tar.gz messages

<span>put file ..</span>.

[192.168.56.30] run: mkdir -p /tmp/log

[192.168.56.30] put: /var/log/messages.tar.gz -> /tmp/log/messages.tar.gz

check file ...

[localhost] local: md5sum /var/log/messages.tar.gz

[192.168.56.30] run: md5sum /tmp/log/messages.tar.gz

[192.168.56.30] out: 958b813fd7bdaa61cc206aa1012d8129  /tmp/log/messages.tar.gz

[192.168.56.30] out:

ok

Done.

Disconnecting from 192.168.56.30... done

4、网关模式文件上传与执行

本例通过定义env.gateway网关模式,即俗称的中转、堡垒机环境。通过网关对其他主机进行文件上传和执行。

#!/usr/bin/env python
# -*- encoding: utf-8 -*-

from fabric.api import *
from fabric.context_managers import *
from fabric.contrib.console import confirm

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/40098e2093e52e978ccd02af3dd3f467.html