首頁 後端開發 Python教學 python fabric實作遠端操作和部署範例

python fabric實作遠端操作和部署範例

Jan 16, 2017 pm 05:32 PM

近期接手越來越多的東西,發布和運維的工作相當機械,加上頻率還蠻高,導致時間浪費還是優點多。修復bug什麼的,測試,提交版本庫(2分鐘),ssh到測試環境pull部署(2分鐘),rsync到線上機器A,B,C,D,E(1分鐘),分別ssh到ABCDE五台機器,逐一重啟(8-10分鐘) = 13-15分鐘其中鬱悶的是,每次操作都是相同的,命令一樣,要命的是在多個機器上,很難在本機一個腳本搞定,主要時間都浪費在ssh,敲命令上了,寫成腳本,完全可以一鍵執行,花兩分鐘看下執行結果

直到,發現了fabric可以將自動化部署或者多機操作的命令固化到一個腳本裡和某些維運工具很像,用它主要是因為,簡單好用易上手,當然,shell各種命令組合起來也可以,上古神器和現代兵器的區別

環境配置

在本機和目標機器安裝對應套件(注意,都要有)

sudo easy_install fabric

目前是1.6版本(或者用pip install,一樣的)

安裝完後,可以查看是否安裝成功

[ken@~$] which fab
/usr/local/bin/fab
登入後複製

裝完之後,可以安裝成功

裝完瀏覽下官方文件

然後,可以動手了


hello world

先進行本機簡單操作,有一個初步認識,例子來源與官網

新建一個py腳本: fabfile.py

def hello():
    print("Hello world!")
登入後複製

命令列執行:

命令行執行:

[ken@~/tmp/fab$] fab hello
Hello world!
登入後複製

Done.

注意,這裡可以不用fabfile當檔名,但執行時需指定檔

[ken@~/tmp/fab$] mv fabfile.py test.py
fabfile.py -> test.py
[ken@~/tmp/fab$] fab hello

Fatal error: Couldn't find any fabfiles!
Remember that -f can be used to specify fabfile path, and use -h for help.
Aborting.
[ken@~/tmp/fab$] fab -f test.py hello
Hello world!
登入後複製

Done.

帶參數:

修改fabfile.pycle

def hello(name, value):
    print("%s = %s!" % (name, value))
登入後複製

執行本機操作
簡單的本地操作

[ken@~/tmp/fab$] fab hello:name=age,value=20
age = 20!
Done.
[ken@~/tmp/fab$] fab hello:age,20
age = 20!
登入後複製

結果:

from fabric.api import local
def lsfab():
    local('cd ~/tmp/fab')
    local('ls')
登入後複製

Done.

實戰開始:

假設,你每天要提交一份配置文件settings.py到版本庫(這裡沒有考慮衝突的情況)

如果是手工操作:

[ken@~/tmp/fab$] pwd;ls
/Users/ken/tmp/fab
fabfile.py   fabfile.pyc  test.py      test.pyc
[ken@~/tmp/fab$] fab -f test.py lsfab
[localhost] local: cd ~/tmp/fab
[localhost] local: ls
fabfile.py  fabfile.pyc test.py     test.pyc
登入後複製

也就是說,這幾個命令你每天都要手動敲一次,所謂daily job,就是每天都要重複的,機械化的工作,讓我們看看用fabric怎麼實現一鍵搞定:(其實用shell腳本可以直接搞定,但是fab的優勢不是在這裡,這裡主要位後面本地+遠端操作做準備,畢竟兩個地方的操作寫一種腳本便於維護)

cd /home/project/test/conf/
git add settings.py
git commit -m 'daily update settings.py'
git pull origin
git push origin
登入後複製

混搭整合遠端操作

這時候,假設,你要到機器A的/home/ken/project對應專案目錄把設定檔更新下來

from fabric.api import local
def setting_ci():
    local("cd /home/project/test/conf/")
    local("git add settings.py")
    #后面你懂的,懒得敲了…..
登入後複製

然後,執行之:

#!/usr/bin/env python
# encoding: utf-8
from fabric.api import local,cd,run
env.hosts=['user@ip:port',] #ssh要用到的参数
env.password = 'pwd'
def setting_ci():
    local('echo "add and commit settings in local"')
    #刚才的操作换到这里,你懂的
def update_setting_remote():
    print "remote update"
    with cd('~/temp'):   #cd用于进入某个目录
        run('ls -l | wc -l')  #远程操作用run
def update():
    setting_ci()
    update_setting_remote()
登入後複製

Done.

注意,如果不聲明env.password,執行到對應機器時會跳出要求輸入密碼的互動


多伺服器混搭

操作多個伺服器,需要設定多個host

[ken@~/tmp/fab$] fab -f deploy.py update
[user@ip:port] Executing task 'update'
[localhost] local: echo "add and commit settings in local"
add and commit settings in local
remote update
[user@ip:port] run: ls -l | wc -l
[user@ip:port] out: 12
[user@ip:port] out:
登入後複製

結果:

#!/usr/bin/env python
# encoding: utf-8
from fabric.api import *
#操作一致的服务器可以放在一组,同一组的执行同一套操作
env.roledefs = {
            'testserver': ['user1@host1:port1',],  
            'realserver': ['user2@host2:port2', ]
            }
#env.password = '这里不要用这种配置了,不可能要求密码都一致的,明文编写也不合适。打通所有ssh就行了'
@roles('testserver')
def task1():
    run('ls -l | wc -l')
@roles('realserver')
def task2():
    run('ls ~/temp/ | wc -l')
def dotask():
    execute(task1)
    execute(task2)
登入後複製

Done.
顏色

1.在查看操作結果資訊的時候更為醒目和方便

[ken@~/tmp/fab$] fab -f mult.py dotask
[user1@host1:port1] Executing task 'task1'
[user1@host1:port1] run: ls -l | wc -l
[user1@host1:port1] out: 9
[user1@host1:port1] out:
[user2@host2:port2] Executing task 'task2'
[user2@host2:port2] run: ls ~/temp/ | wc -l
[user2@host2:port2] out: 11
[user2@host2:port2] out:
登入後複製

2.錯誤和異常

關於錯誤處理

默認,一組命令,上一個命令執行失敗後,不會接著往下執行

失敗後也可以進行不一樣的處理, 文檔

目前沒用到,後續用到再看了

3.密碼管理

看文檔

更好的密碼管理方式,哥比較土,沒打通,主要是伺服器列表變化頻繁,我的處理方式是:

1.host,user,port,password配置列表,所有的都寫在一個文件

或者直接搞到腳本裡,當然這個更...... ..

from fabric.colors import *
def show():
    print green('success')
    print red('fail')
    print yellow('yellow')
#fab -f color.py show
登入後複製

 或

env.hosts = [
'host1',
'host2'

]
env.passwords = { 
'host1': "pwdofhost1",
'host2': "pwdofhost2",
}
登入後複製
2.根據key解析成map嵌套,放到deploy中

另外命令其實也可以固化成一個cmds列表的…..

另外命令其實也可以固化成一個cmds列表的…..

🎜更多python fabric實現遠端操作和部署範例相關文章請關注PHP中文網! 🎜
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24
Python vs.C:申請和用例 Python vs.C:申請和用例 Apr 12, 2025 am 12:01 AM

Python适合数据科学、Web开发和自动化任务,而C 适用于系统编程、游戏开发和嵌入式系统。Python以简洁和强大的生态系统著称,C 则以高性能和底层控制能力闻名。

Python:遊戲,Guis等 Python:遊戲,Guis等 Apr 13, 2025 am 12:14 AM

Python在遊戲和GUI開發中表現出色。 1)遊戲開發使用Pygame,提供繪圖、音頻等功能,適合創建2D遊戲。 2)GUI開發可選擇Tkinter或PyQt,Tkinter簡單易用,PyQt功能豐富,適合專業開發。

Python與C:學習曲線和易用性 Python與C:學習曲線和易用性 Apr 19, 2025 am 12:20 AM

Python更易學且易用,C 則更強大但複雜。 1.Python語法簡潔,適合初學者,動態類型和自動內存管理使其易用,但可能導致運行時錯誤。 2.C 提供低級控制和高級特性,適合高性能應用,但學習門檻高,需手動管理內存和類型安全。

Python和時間:充分利用您的學習時間 Python和時間:充分利用您的學習時間 Apr 14, 2025 am 12:02 AM

要在有限的時間內最大化學習Python的效率,可以使用Python的datetime、time和schedule模塊。 1.datetime模塊用於記錄和規劃學習時間。 2.time模塊幫助設置學習和休息時間。 3.schedule模塊自動化安排每週學習任務。

Python vs.C:探索性能和效率 Python vs.C:探索性能和效率 Apr 18, 2025 am 12:20 AM

Python在開發效率上優於C ,但C 在執行性能上更高。 1.Python的簡潔語法和豐富庫提高開發效率。 2.C 的編譯型特性和硬件控制提升執行性能。選擇時需根據項目需求權衡開發速度與執行效率。

Python:自動化,腳本和任務管理 Python:自動化,腳本和任務管理 Apr 16, 2025 am 12:14 AM

Python在自動化、腳本編寫和任務管理中表現出色。 1)自動化:通過標準庫如os、shutil實現文件備份。 2)腳本編寫:使用psutil庫監控系統資源。 3)任務管理:利用schedule庫調度任務。 Python的易用性和豐富庫支持使其在這些領域中成為首選工具。

Python標準庫的哪一部分是:列表或數組? Python標準庫的哪一部分是:列表或數組? Apr 27, 2025 am 12:03 AM

pythonlistsarepartofthestAndArdLibrary,herilearRaysarenot.listsarebuilt-In,多功能,和Rused ForStoringCollections,而EasaraySaraySaraySaraysaraySaraySaraysaraySaraysarrayModuleandleandleandlesscommonlyusedDduetolimitedFunctionalityFunctionalityFunctionality。

學習Python:2小時的每日學習是否足夠? 學習Python:2小時的每日學習是否足夠? Apr 18, 2025 am 12:22 AM

每天學習Python兩個小時是否足夠?這取決於你的目標和學習方法。 1)制定清晰的學習計劃,2)選擇合適的學習資源和方法,3)動手實踐和復習鞏固,可以在這段時間內逐步掌握Python的基本知識和高級功能。

See all articles