• Python运维自动化开发之Fabric模块


    本章讲解fabric模块,与上一章的paramiko模块功能类似,fabric是在paramiko基础上又做了一层封装,操作起来更方便。主要用于多台服务器批量执行任务。

    非内置Python模块,需要手动安装:pip install fabric
    如果安装失败,可以尝试yum安装:yum install fabric
    Fabric常用API:

    API类

    描述

    示例

    local

    执行本地命令

    local('uname -s')

    lcd

    切换本地目录

    lcd('/opt')

    run

    执行远程命令

    run('uname -s')

    cd

    切换远程目录

    cd('/opt')

    sudo

    sudo方式执行远程命令

    sudo('/etc/init.d/httpd start')

    put

    上传本地文件或目录到远程主机

    put(remote_path, local_path)

    get

    从远程主机下载文件或目录到本地

    put(local_path, remote_path)

    open_shell

    打开一个shell,类似于SSH连接到了远程主机

    open_shell("ifconfig  eth0")

    prompt

    获得用户输入信息

    prompt('Please input user  password: ')

    confirm

    获得提示信息确认

    confirm('Continue[Y/N]?')

    reboot

    重启远程主机

    reboot()

    @task

    函数装饰器,引用说明函数可调用,否则不可见

     

    @runs_once

    函数装饰器,函数只会执行一次

     

    当我们写好fabric脚本后,需要用fab命令调用执行任务。
    命令格式:fab [options][:arg1,arg2=val2,host=foo,hosts=’h1;h2’,…] …
    fab命令有以下常用选项:

    选项

    描述

    -l

    打印可用的命令(函数)

    --set=KEY=VALUE,...

    逗号分隔,设置环境变量

    --shortlist

    简短打印可用命令

    -c PATH

    指定本地配置文件

    -D

    不加载用户known_hosts文件

    -f PATH

    指定fabfile文件

    -g HOST

    逗号分隔要操作的主机

    -i PATH

    指定私钥文件

    -k

    不加载来自~/.ssh下的私钥文件

    -p PASSWORD

    使用密码认证and/or  sudo

    -P

    默认为并行执行方法

    --port=PORT

    指定SSH连接端口

    -R ROLES

    根据角色操作,逗号分隔

    -s SHELL

    指定新shell,默认是'/bin/bash -l -c'

    --show=LEVELS

    以逗号分隔的输出

    --ssh-config-path=PATH

    SSH配置文件路径

    -t N

    设置连接超时时间,单位秒

    -T N

    设置远程命令超时时间,单位秒

    -u USER

    连接远程主机用户名

    -x HOSTS

    以逗号分隔排除主机

    -z INT

    并发进程数

    示例:

    1、本地执行命令

    from fabric.api import local
    def command():
        local('ls')
    # fab command
    [localhost] local: ls
    fabfile.py  fabfile.pyc  tab.py  tab.pyc
    Done.

    使用fab命令调用,默认寻找当前目录的fabfile.py文件。

    2、远程执行命令

    from fabric.api import run
    def command():
        run('ls')
    # fab -H 192.168.1.120 -u user command
    [192.168.1.120] Executing task 'command'[192.168.1.120] run: ls
    [192.168.1.120] Login password for 'user':
    [192.168.1.120] out: access.log  a.py
    [192.168.1.120] out:
    Done.
    Disconnecting from 192.168.1.120... done.

    如果在多台主机执行,只需要-H后面的IP以逗号分隔即可。

    3、给脚本函数传入位置参数

    from fabric.api import run
    def hello(name="world"):
        print("Hello %s!" % name)
    # fab -H localhost hello
    [localhost] Executing task 'hello'Hello world!
    Done.
    # fab -H localhost hello:name=Python
    [localhost] Executing task 'hello'Hello Python!
    Done.

    4、主机列表组

    from fabric.api import run, env
    env.hosts = ['root@192.168.1.120:22', 'root@192.168.1.130:22']
    env.password = '123.com'env.exclude_hosts = ['root@192.168.1.120:22']   # 排除主机
    def command():
       run('ls')

    env作用是定义fabfile全局设定,类似于变量。还有一些常用的属性:

    env属性

    描述

    示例

    env.hosts

    定义目标主机

    env.hosts = ['192.168.1.120:22']

    env.exclude_hosts

    排除指定主机

    env.exclude_hosts =  '[192.168.1.1]'

    env.user

    定义用户名

    env.user='root'

    env.port

    定义端口

    env.port='22'

    env.password

    定义密码

    env.password='123'

    env.passwords

    定义多个密码,不同主机对应不同密码

    env.passwords =  {'root@192.168.1.120:22': '123'}

    env.gateway

    定义网关

    env.gateway='192.168.1.2'

    env.roledefs

    定义角色分组

    env.roledef =  {'web':['192.168.1.11'], 'db':['192.168.1.12']}

    env.deploy_release_dir

    自定义全局变量,格式:env.+  '变量名'

    env.var

    5、定义角色分组

    # vi install.py
    from fabric.api import run, env
    env.roledefs = {    'web': ['192.168.1.10', '192.168.1.20'],    'db': ['192.168.1.30', '192.168.1.40']
    }
    env.password = '123'@roles('web')
    def task1():
       run('yum install httpd -y')
    @roles('db')
    def task2():
       run('yum install mysql-server -y')
    def deploy():
       execute(task1)
       execute(task2)
    # fab -f install.py deploy

    6、上传目录到远程主机

    from fabric.api import *
    env.hosts = ['192.168.1.120']
    env.user = 'user'env.password = '123.com'def task():
       put('/root/abc', '/home/user')
       run('ls -l /home/user')
    # fab task

    7、从远程主机下载目录

    from fabric.api import *
    env.hosts = ['192.168.1.120']
    env.user = 'user'env.password = '123.com'def task():
       get('/home/user/b', '/opt')
       local('ls -l /opt')
    # fab task

    8、打印颜色,有助于关键地方醒目

    from fabric.colors import *
    def show():
       print green('Successful.')
       print red('Failure!')
       print yellow('Warning.')
    # fab show

    经过上面示例,有没有觉得fabric模块很适合批量自动部署呢!没错,通过编写简单的脚本,即可完成复杂的部署操作。

    而paramiko模块,更擅长远程执行命令,文件传输,可灵活的嵌入到运维系统中。

    阅读原文

    使用模块psutil获取系统cpu、内存、磁盘、网络、进程等信息

    利用Paramiko模块执行批量上传/下载/执行命令/查看服务器列表

    DNS处理模块dnspython

  • 相关阅读:
    世界黑客怎么排名?曝郭盛华公司30万美元收购海外域名,怎么回事
    AI应该享有与动物一样的权利吗?
    2020年将会迎来人工智能新浪潮,哪些商业巨头已经提前布局好了?
    揭秘郭盛华的真实收入,事实和你想的真不一样
    Excel表格中单击一个单元格如何将整行整列变色
    ldconfig与 /etc/ld.so.conf
    在excel中,应用公式到多行
    Excel怎么把两个单元格中的文字合并到一个单元格中
    在EXCEL中批量添加超链接
    windows中对文件进行排序
  • 原文地址:https://www.cnblogs.com/276815076/p/7918596.html
Copyright © 2020-2023  润新知