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.
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.
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.
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]#
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.
