author: headsen chenpython
date: 2018-08-12 23:13:16vim
1,安裝api
yum -y install epel-release
yum -y install fabricide
2,指定密碼的使用:
fab -p 123456 -H 192.168.10.10 -f f1.py w函數
#cat f1.pyspa
#!/usr/bin/env python from fabric.api import run def w(): run('w')
肯定:當指定的密碼不正確的時候,會一直讓你嘗試輸入密碼3d
3,經過定義的密碼文件來執行fab命令code
[root@localhost mnt]# vim f2.pyblog
#!/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@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.