python三大神器之fabric(2.0新特性)
fabric經(jīng)常出現(xiàn)在自動(dòng)化運(yùn)維領(lǐng)域,批量處理一些運(yùn)維工作会前。fabric是在paramiko之上又封裝了一層,操作起來更加簡(jiǎn)單易用驶社。
本來只是想寫個(gè)博客記錄一下堵腹,然后發(fā)現(xiàn)之前寫的代碼不能運(yùn)行了,報(bào)以下錯(cuò)誤:
Traceback (most recent call last):
File "D:/PycharmProjects/TestTool/Publish/fabric_sample.py", line 3, in <module>
from fabric.api import * ModuleNotFoundError: No module named 'fabric.api'
然后百度了下俄周,說是2.0以上的fabric版本已經(jīng)移除了fabric.api吁讨,解決方法是指定安裝2.0以下的版本,比如pip install fabric==1.14.0
峦朗,但都并沒有介紹新的特性建丧。然后去官網(wǎng)看了下文檔,使用方法如下:
1.連接服務(wù)器
通過fabric.Connection方法連接服務(wù)器:
conn = fabric.Connection(host , user = 'root',port = 22, config = None, geteway = None, connect_kwargs={"password": "123456"})
Connection參數(shù)的含義:
def __init__(
self,
host, #主機(jī)ip
user=None, #用戶名
port=None, #ssh端口波势,默認(rèn)是22
config=None, #登錄配置文件
gateway=None, #連接網(wǎng)關(guān)
forward_agent=None, #是否開啟agent forwarding
connect_timeout=None, #設(shè)置超時(shí)
connect_kwargs=None, #設(shè)置 密碼登錄connect_kwargs={"password": "123456"}) 還是 密鑰登錄connect_kwargs={"key_filename": "/home/myuser/.ssh/private.key"}
inline_ssh_env=None,
)
2.通過fabric安裝軟件
下面通過一段代碼實(shí)現(xiàn)在Ubuntu上批量安裝docker翎朱,順序取走列表中的ip。
import fabric
def docker_install():
for host in ['10.1.4.24', '10.1.15.154', '10.1.14.106']:
conn = fabric.Connection(host , user = 'root', connect_kwargs={"password": "123456"})
print("%s:" % host)
conn.run("echo Y|apt-get remove docker.io")
docker_install()
是不是很簡(jiǎn)單尺铣,幾行代碼就解決了~
conn獲取Connetction對(duì)象后拴曲,有很多屬性方法可以使用,介紹下幾個(gè)常用的:
cd: #切換遠(yuǎn)程目錄凛忿,如:cd('/root'); with conn.cd('/root'):繼承這個(gè)狀態(tài)
put: #上傳本地文件到遠(yuǎn)程主機(jī)澈灼,如:put('/root/test.py','/root/test.py')
get: #獲取服務(wù)器上文件,如:get('/root/project/test.log')
sudo: #sudo方式執(zhí)行遠(yuǎn)程命令店溢,如:sudo('service docker start')
全部屬性:
['cd', 'clear', 'client', 'close', 'config', 'connect_kwargs', 'connect_timeout', 'create_session', 'cwd', 'derive_shorthand', 'forward_agent', 'forward_local', 'forward_remote', 'from_data', 'from_v1', 'gateway', 'get', 'get_gateway', 'host', 'is_connected', 'local', 'open', 'open_gateway', 'original_host', 'pop', 'popitem', 'port', 'prefix', 'put', 'resolve_connect_kwargs', 'run', 'setdefault', 'sftp', 'ssh_config', 'sudo', 'transport', 'update', 'user']
調(diào)用本地命令:
import invoke
invoke.run('uname -a')