1. 程式人生 > >python三大神器之fabric(2.0新特性)

python三大神器之fabric(2.0新特性)

  fabric經常出現在自動化運維領域,批量處理一些運維工作。fabric是在paramiko之上又封裝了一層,操作起來更加簡單易用。

 

  本來只是想寫個部落格記錄一下,然後發現之前寫的程式碼不能運行了,報以下錯誤:No module named 'fabric.api'

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版本已經移除了fabric.api,解決方法是指定安裝2.0以下的版本,比如pip install fabric==1.14.0  ~_~ ,但都並沒有介紹新的特性。然後去官網看了下文件,使用方法如下:

 

1.連線伺服器

  通過fabric.Connection方法連線伺服器:

  conn = fabric.Connection(host , user = 'root',port = 22, config = None, geteway = None, connect_kwargs={"password": "123456"})

  Connection引數的含義:

  def __init__(
    self,
    host,                       #主機ip
    user=None,                  #使用者名稱
    port=None,                  #ssh埠,預設是22
    config=None,                #登入配置檔案
    gateway=None,               #連線閘道器
    forward_agent=None,         #是否開啟agent forwarding
    connect_timeout=None, #設定超時     connect_kwargs=None, #設定 密碼登入connect_kwargs={"password": "123456"}) 還是 金鑰登入connect_kwargs={"key_filename": "/home/myuser/.ssh/private.key"}     inline_ssh_env=None,     )

 

2.通過fabric安裝軟體

  下面通過一段程式碼實現在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()

  是不是很簡單,幾行程式碼就解決了~

 

  其他方法使用:

run:                #執行遠端命令,如:run('uname -a');

local: #執行本地命令,如:local('uname -a');

lcd: #切換本地目錄,如:lcd('/root');

cd: #切換遠端目錄,如:cd('/root'); with conn.cd('/root'):繼承這個狀態

put: #上傳本地檔案到遠端主機,如:put('/root/test.py','/root/test.py');

sudo: #sudo方式執行遠端命令,如:sudo('service docker start');

reboot: #重啟遠端主機,如:reboot();

prompt: #獲得使用者輸入資訊,如:prompt('please input user password:');

confirm: #獲得提示資訊確認,如:confirm("Continue[Y/N]?");