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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM