自动化Fabric

2018-06-18  本文已影响58人  平凡的运维之路

[TOC]

神马是Fabric

安装

pip3 install fabric3  #安装python3以上版本
pip install fabric    #安装python3以下版本

fab常用参数

    -l 显示定义好的任何函数列表
    -f 执行fab入口文件,默认入口文件为fabfile.py
    -g 指定网关
    -H 指定目标主机,多个主机使用,分隔
    -P 以异步并行方式运行多主机任务,默认为串行任务,也就是依次执行
    -u 指定主机用户名
    -P 执行主机密码
    案例: fab -p 密码 -H 主机1,主机2... '命令'
    

(fabric) [fabric@MAILCCOD ~]$ fab -H root@192.168.127.1:22 -- "pwd"  #远程执行pwd命令
[root@192.168.127.1:22] Executing task '<remainder>'
[root@192.168.127.1:22] run: pwd
[root@192.168.127.1:22] Login password for 'root': 
[root@192.168.127.1:22] out: /root
[root@192.168.127.1:22] out: 
Done.

编写fabfile文件

单机操作
fabfile.py

#coding:utf8
from fabric.api import *  #导出api方法

env.hosts =  ["127.0.0.1"]   #声明定义host主机
env.user = "root"            #声明定义用户名
env.password = "ChannelSoft*ccod4.5"  #声明定义密码
env.port = 20001             #声明定义密码

@task  #使用装饰器
def show():     #编写show函数,远程运行linux命令
    run("ls /home")
    run("ps -ef|rep resin")

@task
def Mem():
    run("free -m")

@task
def run_all():  #执行所有任务
    execute(show)
    execute(Mem)

if __name__ == "__main__":   #使用Python直接执行
    execute(run_all)
    
多机操作
#!/usr/bin/python
#coding:utf8
from fabric.api import *
env.user = "root"
env.hosts = ["192.168.127.1","192.168.127.2"]
env.passwords = {
    "root@192.168.127.1:22":"qnsoft",
    "root@192.168.127.2:22":"qnsoft",
}

#roledefs是定义角色分组
env.roledefs = {
    "Web":["192.168.127.1"],
    "DB":["192.168.127.2"]
}


@task
def show():
    run("df -h")

@task
@roles("Web")   #使用角色
def Echo():
    run("ifconfig ")

@task
@roles("DB")
def run_all():
    execute(show)  #此命令是调用上面定义的函数
    run("ifconfig")

if __name__ == "__main__":
    execute(run_all)

[auto@mongodb1 fabric]$ fab -f Fabric1-0.py -l   #使用fab命令显示可执行的任务
Available commands:
    Echo
    run_all
    show
[auto@mongodb1 fabric]$ fab -f Fabric1-0.py Echo  #执行Echo任务

常用的fabric的API

颜色输出

文件上传下载校验

upload_file.py
#!/usr/bin/python
#coding:utf8

from fabric.api import *
from fabric.contrib.console import   confirm
from fabric.colors import *   #导入颜色函数

env.user = "root"
env.hosts = ["192.168.127.26"]
env.passwords = {
    "root@192.168.127.2:22":"ChannelSoft*ccod4.5"
}

#roledefs是定义角色分组
env.roledefs = {
    "fps":["192.168.127.2"]
}


#定义文件上传任务
@task
def upload_file():
    with settings(warn_only=True):  #异常处理
        local("tar zcf FPS.tar.gz /home/auto/fabric/Fps.py")
        result = put("FPS.tar.gz","/root/FPS.tar.gz")
    if result.failed  and not confirm("continue[y/n]"):  #异常处理,如果上传失败是否继续
        abort("Put tar file Failed")

    #获取本地和上传远端文件的m5d值是否一致
    with settings(warn_only=True):
        local_file = local("md5sum FPS.tar.gz",capture=True).split(" ")[0]
        remote_file = run("md5sum /root/FPS.tar.gz").split(" ")[0]

    if local_file == remote_file:
        print(green("Yes upload  Acss , M5D Ok"))
    else:
        print(read("Upload file Failed MD5 NO !!!"))

#定义文件下载任务
@task
def download_file():
    with settings(warn_only=True):
        get("/root/FPS.tar.gz","FPS.tar.gz")
        local("tar -zxf FPS.tar.gz -C ./ && cat Fps.py ")


@task
def run_all():
    execute(upload_file)
    execute(download_file)


if __name__ == "__main__":
    execute(run_all)

并行执行

#!/usr/bin/python
#coding:utf8

from fabric.api import *

@parallel
def runs_in_parallel():
    pass

def runs_serially():
    pass

如果这样执行:
$ fab -H host1,host2,host3 runs_in_parallel runs_serially

将会按照这样的流程执行:
runs_in_parallel 运行在 host1、host2 和 host3 上
runs_serially 运行在 host1 上
runs_serially 运行在 host2 上
runs_serially 运行在 host3 上

from fabric.api import *

def runs_in_parallel():
    pass

@serial
def runs_serially():
    pass

在这样调用时:
$ fab -H host1,host2,host3 -P runs_in_parallel runs_serially
和上面一样,runs_in_parallel 将会并行执行,runs_serially 顺序执行。

例如同时在 5 个主机上运行:

from fabric.api import *

@parallel(pool_size=5)
def heavy_task():
    # lots of heavy local lifting or lots of IO here

或者不使用关键字参数 pool_size:
$ fab -P -z 5 heavy_task

并行执行
#!/usr/bin/python
#coding:utf8
from fabric.api import *
from Hosts import *

@task
@roles("Web")
@parallel(pool_size=5) #意思说最大线程是为5个
def File():
    with prefix("cd /home") :
        run("ls -htrl")
#类似执行 cd /home && ls ccodrunner 的linux命令


if __name__ == "__main__":
    execute(File)

上下文切换

-使用with语句的上下文管理器

#!/usr/bin/python
#coding:utf8
from fabric.api import *

env.hosts =  ["127.0.0.1"]   #声明定义host主机
env.user = "root"            #声明定义用户名

env.password = "qnsoft"  #声明定义密码
env.port = 10000             #声明定义密码


@task
def File():
    with prefix("cd /home") : #with上下文切换
        run("ls ccodrunner")
#类似执行 cd /home && ls ccodrunner 的linux命令


if __name__ == "__main__":
    execute(File)

上一篇 下一篇

猜你喜欢

热点阅读