• fabric入门


    author: headsen  chen

    date: 2018-08-12  23:13:16

    1,安装

    yum -y install epel-release
    yum -y install fabric

    2,指定密码的使用:
    fab -p 123456 -H 192.168.10.10 -f f1.py w

    #cat f1.py

    #!/usr/bin/env python
    from fabric.api import run
    def w():
        run('w')

    确定:当指定的密码不正确的时候,会一直让你尝试输入密码

    3,通过定义的密码文件来执行fab命令

    [root@localhost mnt]# vim f2.py

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    from fabric.api import *
    env.hosts = ['192.168.10.104','192.168.10.105','192.168.10.101']
    env.port = '22'
    env.user = 'root'
    env.password = '123456'
    
    def a():
        with cd('/tmp'):
            run('touch a{1..10}')
            run('ls /tmp')
    def b():
        run('uptime')
    @task
    def go():
        a()
        b()

    [root@localhost mnt]# fab -f f2.py go

    [192.168.10.104] Executing task 'go'
    [192.168.10.104] run: touch a{1..10}
    [192.168.10.104] run: ls /tmp
    [192.168.10.104] out: a1 a10 a2 a3 a4 a5 a6 a7 a8 a9 yum.log
    [192.168.10.104] out:
    
    [192.168.10.104] run: uptime
    [192.168.10.104] out: 05:21:33 up 57 min, 3 users, load average: 0.00, 0.00, 0.00
    [192.168.10.104] out:
    
    [192.168.10.105]
    ... 
    [192.168.10.101]
    ...
    Done.
    Disconnecting from 192.168.10.101... done.
    Disconnecting from 192.168.10.104... done.
    Disconnecting from 192.168.10.105... done.
    View Code

    4,指定秘钥对连接(将该密钥对的公钥放到对方的机器的 /root/.ssh/id_pub_rsa文件中去)

    [root@localhost mnt]# cat bak-com.py
    #!/usr/bin/env python
    from fabric.api import *
    
    def w():
        run("w") 
    [root@localhost mnt]# fab  -i /root/.ssh/id_rsa -H 192.168.8.222 -f bak-com.py w
    [192.168.8.222] Executing task 'w'
    [192.168.8.222] run: w
    [192.168.8.222] out:  14:14:27 up 5 days,  4:07,  2 users,  load average: 0.16, 0.15, 0.10
    [192.168.8.222] out: USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
    [192.168.8.222] out: root     pts/0    192.168.20.29    14:01    8:51   0.28s  0.04s -bash
    [192.168.8.222] out: root     pts/1    192.168.20.29    14:14    0.00s  0.01s  0.01s w
    [192.168.8.222] out: 
    Done.
    Disconnecting from 192.168.8.222... done.

    4,多个客户端的不同端口和不同密码的模板

    [root@localhost mnt]# cat f4.py

    #!/usr/bin/env python
    # coding:utf-8
    from fabric.api import *
    from fabric.context_managers import *
    from fabric.contrib.console import *
    
    env.hosts=['root@192.168.10.104:22','root@192.168.10.105:22','root@192.168.10.101:22']
    # -----> 这一步当都为root和22端口时可以简写为:env.hosts=['192.168.10.104','192.168.10.105','192.168.10.101']
    env.user = 'root'
    env.passwords = {
    'root@192.168.10.104:22':'123456',      #  ------->注意:这里的为固定格式,22端口指定不可少,否则报错
    'root@192.168.10.105:22':'123456',
    'root@192.168.10.101:22':'jack123',
    }
    def a():
        with cd('/tmp'):
            run('touch a{1..10}')
    def b():
        run('uptime')
    @task
    def c():
        a()
        b()    

    5,利用fabric来传送本地文件到客户端上去

    [root@localhost mnt]# vim f6.py 

    #!/usr/bin/env python
    # coding:utf-8
    from fabric.api import *
    from fabric.context_managers import *
    from fabric.contrib.console import *
    env.hosts=['192.168.10.104','192.168.10.105','192.168.10.101']
    env.user = 'root'
    env.passwords = {
    'root@192.168.10.104:22':'123456',
    'root@192.168.10.105:22':'123456',
    'root@192.168.10.101:22':'jack123',
    }
    def a():
        put('/tmp/jack123','/tmp/')  # --------> 此时在客户端上生成 jack123的文件,如果要在客户度上改名:put('/tmp/jack123','/tmp/jack')

    [root@localhost mnt]# fab -f f6.py a

    [192.168.10.104] Executing task 'a'
    [192.168.10.104] put: /tmp/jack123 -> /tmp/jack123
    [192.168.10.105] Executing task 'a'
    [192.168.10.105] put: /tmp/jack123 -> /tmp/jack123
    [192.168.10.101] Executing task 'a'
    [192.168.10.101] put: /tmp/jack123 -> /tmp/jack123
    
    Done.
    Disconnecting from 192.168.10.101... done.
    Disconnecting from 192.168.10.104... done.
    Disconnecting from 192.168.10.105... done.
    View Code

    6,从客户端上拉取文件到本地

    [root@localhost mnt]# cat f7.py

    #!/usr/bin/env python
    # coding:utf-8
    from fabric.api import *
    from fabric.context_managers import *
    from fabric.contrib.console import *
    env.host=['192.168.10.104']
    env.user = 'root'
    env.password = 'jack123'
    def a():
        get('/tmp/tom','/opt/')

    [root@localhost mnt]# fab -f f7.py a

    [192.168.10.104] Executing task 'a'
    [192.168.10.104] download: /opt/tom <- /tmp/tom
    Disconnecting from 192.168.10.104... done.
    View Code

    7,task装饰器的作用

    被标识的函数为fab可调用的,程序内的其他函数不可通过fab -f x.py go 调用,当整个程序内都没有@task时,则任何函数都可以被
    fab命令调用

    实例:

    #!/usr/bin/env python
    from fabric.api import *
    def lsfab():
        with lcd('/mnt/'):
            local('ls')
    def host_name():
        local('uptime')
    @task
    def go():
        lsfab()
        host_name()    

    此时不可以通过:fab -f f1.py lsfab 此时不成功。当没有@task时,这样调用可以

     8,run_once

    标识的函数只会执行一次,只会在第一台主机执行,后面的主机不再执行其下的函数,不受多台主机影响。

    实例:
    [root@localhost mnt]# cat f3.py

    #!/usr/bin/env python
    # coding:utf-8
    from fabric.api import *
    
    env.hosts=['192.168.13.128','192.168.13.130']
    env.user='root'
    env.password='123456'
    def a():
        with cd('/tmp'):
            run('ls')
    def b():
        run('uptime')
    @runs_once
    def c():
        a()
        b()    

    [root@localhost mnt]# fab -f f3.py c # 此时在13.130机器上就不执行了。

    [root@192.168.13.128:10000] Executing task 'c'
    [root@192.168.13.128:10000] run: ls
    [root@192.168.13.128:10000] out: yum.log
    
    [root@192.168.13.128:10000] run: uptime
    [root@192.168.13.128:10000] out: 01:59:19 up 2:21, 3 users, load average: 0.00, 0.00, 0.00
    
    Done.
    Disconnecting from 192.168.13.128:10000... done.
    [root@localhost mnt]#
    View Code

    9,fab的本地执行和远程执行

    [root@localhost 7]# cat f2.py

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    from fabric.api import *
    env.user='root'
    env.hosts=['192.168.13.128','192.168.13.129']
    env.password='123456'
    
    @runs_once
    def local_task () :    #本地任务函数
        local("uname -a")
    
    def remote_task():
        with cd ("/home") :             # “with”的作用是让后面的表达式的语句继承当前状态,实现
            run ("ls -1")               # “cd /data/logs && Is -1"的效果

    10,交互式fab使用方法(执行命令时输入参数)

    [root@localhost 7]# cat f3.py

    #!/usr/bin/env python 
    # -*- coding:utf-8 -*-
    from fabric.api import *
    env.user='root'
    env.hosts=['192.168.13.128','192.168.13.129']
    env.password='123456'
    
    @runs_once            #主机遍历过程中,只有第一台触发此函数 
    def input_raw():
        return prompt("please input directory name:",default="/home")
    
    def worktask(dirname):
        run("ls -l "+dirname)
    @task                 #限定只有go函数对fab命令可见 
    def go():
        getdirname = input_raw()
        worktask(getdirname)

    [root@localhost mnt]# fab -f f8.py go

    [192.168.10.104] Executing task 'go'
    please input directory name: [/home] /tmp
    [192.168.10.104] run: ls -l /tmp
    [192.168.10.104] out: total 12
    [192.168.10.104] out: -rw-r--r-- 1 root root 0 Aug 13 05:45 a1
    ...
    
    [192.168.10.105] Executing task 'go'
    [192.168.10.105] run: ls -l /tmp
    [192.168.10.105] out: total 8
    [192.168.10.105] out: -rw-r--r-- 1 root root 0 Aug 13 05:45 a1
    ...
    [192.168.10.105] out:
    
    Done.
    Disconnecting from 192.168.10.104... done.
    Disconnecting from 192.168.10.105... done.
    View Code
  • 相关阅读:
    2015.07.20MapReducer源码解析(笔记)
    Hive(笔记)
    HDFS入门(1)
    Zookepper(2015.08.16笔记)
    USB_ModeSwitch 介绍(转)
    Perl 模块 Getopt::Std 和 Getopt::Long
    在linux下设置开机自动启动程序的方法
    gcc Makefile 入门
    Linuxexec函数族及system函数
    signal(SIGHUP, SIG_IGN)的含义
  • 原文地址:https://www.cnblogs.com/kaishirenshi/p/9465504.html
Copyright © 2020-2023  润新知