日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Python應用自動化部署工具Fabric原理及使用解析

瀏覽:23日期:2022-07-03 17:38:39

介紹

Fabirc是基于python實現的SSH命令行工具,非常適合應用的自動化部署,或者執行系統管理任務。

python2:pip3 install fabric

python3:pip3 install fabric3

簡單的例子:

root@openstack:~# cat fabfile.pydef hello(): print(’hello world!’) root@openstack:~# fab hellohello world!

這個fab簡單地導入了fabfile,并執行定義的hello函數。

命令行啟動

fab作為Fabric程序的命令行入口,提供了豐富的參數調用,命令格式如下:

root@openstack:~# fab --helpUsage: fab [options] <command>[:arg1,arg2=val2,host=foo,hosts=’h1;h2’,...] ...

各參數含義如下:

參數項 含義 -l 顯示可用任務函數名 -f 指定fab入口文件,默認為fabfile.py -g 指定網關(中轉設備),比如堡壘機環境,填寫堡壘機IP即可 -H 指定目標主機,多臺主機用“,”分隔 -P 以異步并行方式運行多臺主機任務,默認為串行運行 -R 指定角色(Role) -t 設置設備連接超時時間 -T 設置遠程主機命令執行超時時間 -w 當命令執行失敗,發出告警,而非默認終止任務

fabfile全局屬性設定

env對象的作用是定義fabfile的全局設定,各屬性說明如下:

屬性 含義 env.host 定義目標主機,以python的列表表示,如env.host=[’xx.xx.xx.xx’,’xx.xx.xx.xx’] env.exclude_hosts 排除指定主機,以python的列表表示 env.port 定義目標主機端口,默認為22 env.user 定義用戶名 env.password 定義密碼 env.passwords 與password功能一樣,區別在于不同主機配置不同密碼的應用情景,配置此項的時候需要配置用戶、主機、端口等信息,如:env.passwords = {’root@xx.xx.xx.xx:22’: ’123’, ’root@xx.xx.xx.xx’:’234’} env.getway 定義網關 env.deploy_release_dir 自定義全局變量 env.roledefs 定義角色分組

常用的API

Fabric支持常用的方法及說明如下:

方法 說明 local 執行本地命令,如:local(’hostname’) lcd 切換本地目錄,lcd(’/root’) cd 切換遠程目錄,cd(’cd’) run 執行遠程命令,如:run(’hostname’) sudo sudo執行遠程命令,如:sudo(’echo “123456″ passwd --stdin root’) put 上傳本地文件到遠程主機,如:put(src,des) get 從遠程主機下載文件到本地,如:get(des,src) prompt 獲取用戶輸入信息,如:prompt(‘please enter a new password:’) confirm 獲取提示信息確認,如:confirm(’failed.Continue[Y/n]?’) reboot 重啟遠程主機,reboot() @task 函數修飾符,標識的函數為fab可調用的 @runs_once 函數修飾符,表示的函數只會執行一次

從一個實例入手

假設我們需要為一個 web 應用創建 fabfile 。具體的情景如下:這個 web 應用的代碼使用 git 托管在一臺遠程服務器 vcshost 上,我們把它的代碼庫克隆到了本地 localhost 中。我們希望在我們把修改后的代碼 push 回 vcshost 時,自動把新的版本安裝到另一臺遠程服務器 my_server 上。我們將通過自動化本地和遠程 git 命令來完成這些工作。

關于 fabfile 文件放置位置的最佳時間是項目的根目錄:

.|-- __init__.py|-- app.wsgi|-- fabfile.py <-- our fabfile!|-- manage.py`-- my_app |-- __init__.py |-- models.py |-- templates | `-- index.html |-- tests.py |-- urls.py `-- views.py

注解

在這里我們使用一個 Django 應用為例——不過 Fabric 并s依賴于外部代碼,除了它的 SSH 庫。

作為起步,我們希望先執行測試準備好部署后,再提交到 VCS(版本控制系統):

from fabric.api import localdef prepare_deploy(): local('./manage.py test my_app') local('git add -p && git commit') local('git push')

這段代碼的輸出會是這樣:

$ fab prepare_deploy[localhost] run: ./manage.py test my_appCreating test database...Creating tablesCreating indexes..........................................----------------------------------------------------------------------Ran 42 tests in 9.138sOKDestroying test database...[localhost] run: git add -p && git commit<interactive Git add / git commit edit message session>[localhost] run: git push<git push session, possibly merging conflicts interactively>Done.

這段代碼很簡單,導入一個 Fabric API: local ,然后用它執行本地 Shell 命令并與之交互,剩下的 Fabric API 也都類似——它們都只是 Python。

用你的方式來組織

因為 Fabric “只是 Python”,所以你可以按你喜歡的方式來組織 fabfile 。比如說,把任務分割成多個子任務:

from fabric.api import localdef test(): local('./manage.py test my_app')def commit(): local('git add -p && git commit')def push(): local('git push')def prepare_deploy(): test() commit() push()

這個 prepare_deploy 任務仍可以像之前那樣調用,但現在只要你愿意,就可以調用更細粒度的子任務。

故障

我們的基本案例已經可以正常工作了,但如果測試失敗了會怎樣?我們應該抓住機會即使停下任務,并在部署之前修復這些失敗的測試。

Fabric 會檢查被調用程序的返回值,如果這些程序沒有干凈地退出,Fabric 會終止操作。下面我們就來看看如果一個測試用例遇到錯誤時會發生什么:

$ fab prepare_deploy[localhost] run: ./manage.py test my_appCreating test database...Creating tablesCreating indexes.............E............................======================================================================ERROR: testSomething (my_project.my_app.tests.MainTests)----------------------------------------------------------------------Traceback (most recent call last):[...]----------------------------------------------------------------------Ran 42 tests in 9.138sFAILED (errors=1)Destroying test database...Fatal error: local() encountered an error (return code 2) while executing ’./manage.py test my_app’Aborting.

太好了!我們什么都不用做,Fabric 檢測到了錯誤并終止,不會繼續執行 commit 任務。

參見

Failure handling (usage documentation)

故障處理但如果我們想更加靈活,給用戶另一個選擇,該怎么辦?一個名為 warn_only 的設置(或著說 環境變量 ,通常縮寫為 env var )可以把退出換為警告,以提供更靈活的錯誤處理。

讓我們把這個設置丟到 test 函數中,然后注意這個 local 調用的結果:

from __future__ import with_statementfrom fabric.api import local, settings, abortfrom fabric.contrib.console import confirmdef test(): with settings(warn_only=True): result = local(’./manage.py test my_app’, capture=True) if result.failed and not confirm('Tests failed. Continue anyway?'): abort('Aborting at user request.')[...]

為了引入這個新特性,我們需要添加一些新東西:

在 Python 2.5 中,需要從 __future__ 中導入 with ;

Fabric contrib.console 子模塊提供了 confirm 函數,用于簡單的 yes/no 提示。

settings 上下文管理器提供了特定代碼塊特殊設置的功能。

local 這樣運行命令的操作會返回一個包含執行結果( .failed 或 .return_code 屬性)的對象。

abort 函數用于手動停止任務的執行。

即使增加了上述復雜度,整個處理過程仍然很容易理解,而且它已經遠比之前靈活。

建立連接

讓我們回到 fabfile 的主旨:定義一個 deploy 任務,讓它在一臺或多臺遠程服務器上運行,并保證代碼是最新的:

def deploy():code_dir = ’/srv/django/myproject’with cd(code_dir):run('git pull')run('touch app.wsgi')

這里再次引入了一些新的概念:

Fabric 是 Python——所以我們可以自由地使用變量、字符串等常規的 Python 代碼;

cd 函數是一個簡易的前綴命令,相當于運行 cd /to/some/directory ,和 lcd 函數類似,只不過后者是在本地執行。

~fabric.operations.run` 和 local 類似,不過是在 遠程 而非本地執行。

我們還需要保證在文件頂部導入了這些新函數:

from __future__ import with_statementfrom fabric.api import local, settings, abort, run, cdfrom fabric.contrib.console import confirm

改好之后,我們重新部署:

$ fab deployNo hosts found. Please specify (single) host string for connection: my_server[my_server] run: git pull[my_server] out: Already up-to-date.[my_server] out:[my_server] run: touch app.wsgi

Done.

我們并沒有在 fabfile 中指定任何連接信息,所以 Fabric 依舊不知道該在哪里運行這些遠程命令。遇到這種情況時,Fabric 會在運行時提示我們。連接的定義使用 SSH 風格的“主機串”(例如: user@host:port ),默認使用你的本地用戶名——所以在這個例子中,我們只需要指定主機名 my_server 。

與遠程交互

如果你已經得到了代碼,說明 git pull 執行非常順利——但如果這是第一次部署呢?最好也能應付這樣的情況,這時應該使用 git clone 來初始化代碼庫:

def deploy(): code_dir = ’/srv/django/myproject’ with settings(warn_only=True): if run('test -d %s' % code_dir).failed: run('git clone user@vcshost:/path/to/repo/.git %s' % code_dir) with cd(code_dir): run('git pull') run('touch app.wsgi')

和上面調用 local 一樣, run 也提供基于 Shell 命令構建干凈的 Python 邏輯。這里最有趣的部分是 git clone :因為我們是用 git 的 SSH 方法來訪問 git 服務器上的代碼庫,這意味著我們遠程執行的 run 需要自己提供身份驗證。

舊版本的 Fabric(和其他類似的高層次 SSH 庫)像在監獄里一樣運行遠程命令,無法提供本地交互。當你迫切需要輸入密碼或者與遠程程序交互時,這就很成問題。

Fabric 1.0 和后續的版本突破了這個限制,并保證你和另一端的會話交互。讓我們看看當我們在一臺沒有 git checkout 的新服務器上運行更新后的 deploy 任務時會發生什么:

$ fab deployNo hosts found. Please specify (single) host string for connection: my_server[my_server] run: test -d /srv/django/myproject

Warning: run() encountered an error (return code 1) while executing ’test -d /srv/django/myproject’

[my_server] run: git clone user@vcshost:/path/to/repo/.git /srv/django/myproject[my_server] out: Cloning into /srv/django/myproject...[my_server] out: Password: <enter password>[my_server] out: remote: Counting objects: 6698, done.[my_server] out: remote: Compressing objects: 100% (2237/2237), done.[my_server] out: remote: Total 6698 (delta 4633), reused 6414 (delta 4412)[my_server] out: Receiving objects: 100% (6698/6698), 1.28 MiB, done.[my_server] out: Resolving deltas: 100% (4633/4633), done.[my_server] out:[my_server] run: git pull[my_server] out: Already up-to-date.[my_server] out:[my_server] run: touch app.wsgi

Done.

注意那個 Password: 提示——那就是我們在 web 服務器上的遠程 git 應用在請求 git 密碼。我們可以在本地輸入密碼,然后像往常一樣繼續克隆。

參見

與遠程程序集成

預定義連接

在運行輸入連接信息已經是非常古老的做法了,Fabric 提供了一套在 fabfile 或命令行中指定服務器信息的簡單方法。這里我們不展開說明,但是會展示最常用的方法:設置全局主機列表 env.hosts 。

env 是一個全局的類字典對象,是 Fabric 很多設置的基礎,也能在 with 表達式中使用(事實上,前面見過的 ~fabric.context_managers.settings 就是它的一個簡單封裝)。因此,我們可以在模塊層次上,在 fabfile 的頂部附近修改它,就像這樣:

from __future__ import with_statementfrom fabric.api import *from fabric.contrib.console import confirmenv.hosts = [’my_server’]def test(): do_test_stuff()

當 fab 加載 fabfile 時,將會執行我們對 env 的修改并保存設置的變化。最終結果如上所示:我們的 deploy 任務將在 my_server 上運行。

這就是如何指定 Fabric 一次性控制多臺遠程服務器的方法: env.hosts 是一個列表, fab 對它迭代,對每個連接運行指定的任務。

總結

雖然經歷了很多,我們的 fabfile 文件仍然相當短。下面是它的完整內容:

from __future__ import with_statementfrom fabric.api import *from fabric.contrib.console import confirmenv.hosts = [’my_server’]def test(): with settings(warn_only=True): result = local(’./manage.py test my_app’, capture=True) if result.failed and not confirm('Tests failed. Continue anyway?'): abort('Aborting at user request.')def commit(): local('git add -p && git commit')def push(): local('git push')def prepare_deploy(): test() commit() push()def deploy(): code_dir = ’/srv/django/myproject’ with settings(warn_only=True): if run('test -d %s' % code_dir).failed: run('git clone user@vcshost:/path/to/repo/.git %s' % code_dir) with cd(code_dir): run('git pull') run('touch app.wsgi')

但它已經涉及到了 Fabric 中的很多功能:

定義 fabfile 任務,并用 fab 執行;

用 local 調用本地 shell 命令;

通過 settings 修改 env 變量;

處理失敗命令、提示用戶、手動取消任務;

以及定義主機列表、使用 run 來執行遠程命令。

還有更多這里沒有涉及到的內容,你還可以看看所有“參見”中的鏈接,以及 索引頁 的內容表。

更多請參考:https://fabric-chs.readthedocs.io/zh_CN/chs/tutorial.html

常用示例

1、上傳文件

fabric可以將本地文件上傳到遠程服務器上,這個操作要用到put函數

2、示例代碼

#coding=utf-8from fabric.api import *from fabric.contrib.console import confirmimport hashlibhost = ’root@192.168.0.62:22’password = ’123456’env.hosts=[host]env.password = passworddef md5sum(filename): fd = open(filename,'r') fcont = fd.read() fd.close() fmd5 = hashlib.md5(fcont) return fmd5def upload_file(filename): run('mkdir -p /root/upload') with cd(’/root/upload’): with settings(warn_only=True): res = put(filename,filename) if res.failed and not confirm('put file failed, Continue[Y/N]?'): abort(u’終止上傳文件’)def checkmd5(filename): fmd5 = md5sum(filename) lmd5 = fmd5.hexdigest() target = ’/root/upload/’+filename rmd5=run('md5sum ' + target).split(’ ’)[0] if lmd5 == rmd5: print ’ok,the file uploaded’ else: print ’error’def uploadfile(filename): upload_file(filename) checkmd5(filename)

執行命令 fab -f uploadfile.py uploadfile:filename=fabricdemo1.py

3、程序分析

在執行fab命令時,可以指定函數的參數,多個參數之間用逗號分隔

with settings(warn_only=True) 的作用,是在發生錯誤時,不中斷執行,只會輸出警告信息

4、上傳文件夾

其實fabric也是可以上傳文件夾的,但是很多教程里都沒有提及,示例代碼如下

def uploadfolder(): run('mkdir -p /root/upload') with cd(’/root/upload’): with settings(warn_only=True): res = put(’testfolder’,’.’)

在uploadfile.py 同目錄下,有一個testfolder的文件夾,上面的代碼可以將這個文件夾上傳到/root/upload目錄下,主要注意的是put的第二個參數,我這里放的是’.’,就表明要把本地的testfolder放到/root/upload目錄下。

不同于上傳文件,文件夾上上傳過程中是不能設置目標文件夾的名字的,目標文件夾必須先存在

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
成人在线视频免费| 国产aⅴ精品一区二区四区| 日韩一区二区在线免费| 久久久久黄色| 成人午夜网址| 精品欧美一区二区三区在线观看| 欧美天堂视频| re久久精品视频| 亚洲高清激情| 黄色av日韩| 中文字幕日韩亚洲| 日本欧美一区二区在线观看| 国产精久久久| 亚洲精品第一| 国产精品**亚洲精品| 在线人成日本视频| 91嫩草亚洲精品| 欧美精品一区二区三区精品| 亚洲婷婷丁香| 九九99久久精品在免费线bt| 久久久9色精品国产一区二区三区| 亚洲一区二区三区高清不卡| 日本午夜免费一区二区| 国产a亚洲精品| 亚洲一区二区三区高清| 国产探花在线精品一区二区| 欧美日韩精品免费观看视完整 | 欧美精品自拍| 欧美私人啪啪vps| 午夜av不卡| 亚洲激情国产| 日韩av中文字幕一区| 人在线成免费视频| 亚洲精品女人| 成人看片网站| 日本精品一区二区三区在线观看视频| 国产一区二区三区四区| 国产一区成人| 国产中文字幕一区二区三区| 鲁大师成人一区二区三区| 久久av免费看| 老司机精品久久| 国际精品欧美精品| 日韩制服丝袜av| 91视频精品| 日韩影院在线观看| 国产福利电影在线播放| 亚洲3区在线| 一区二区三区四区在线看| 久久精品99国产精品| 欧美精品羞羞答答| 四虎8848精品成人免费网站| 综合一区二区三区| 成人欧美一区二区三区的电影| 中文字幕av一区二区三区四区| 另类专区亚洲| 国产日产一区| 视频精品一区二区| 久久精品免费一区二区三区| 国产激情久久| 爽好多水快深点欧美视频| 成人在线视频免费| 国产日韩中文在线中文字幕| 国产一区亚洲| 日韩国产一区二区| 国产精品毛片久久久| 三级欧美在线一区| 亚洲福利免费| 蜜桃精品在线| 亚洲深夜视频| 超碰99在线| 国产 日韩 欧美 综合 一区| 97久久精品| 六月婷婷一区| 亚洲自拍另类| 99久久久久国产精品| 捆绑调教美女网站视频一区| 青青草国产成人99久久| 蜜桃视频一区二区三区在线观看| 蜜桃一区二区三区| 久久天堂av| 成人一区而且| 国产一区二区三区天码| 久久香蕉精品香蕉| 欧美成人aaa| 国产精品xxx在线观看| 日韩精品一区二区三区中文| 三级在线观看一区二区| 99亚洲视频| 亚洲自拍另类| 国产亚洲在线| 亚洲三级国产| 日韩精品视频中文字幕| 日韩精品一区二区三区中文字幕| 中文字幕日本一区二区| 亚洲最新av| 亚洲影视一区二区三区| 久久国产福利| 日韩一区二区三区精品| 日韩av中文字幕一区二区| 欧美日韩一区二区三区四区在线观看| 日韩精品视频网站| 国产欧美一区二区三区精品观看| 欧美影院精品| 国产精品毛片久久久| 国产毛片精品久久| 麻豆国产一区| 中文字幕人成乱码在线观看| 久久精品亚洲人成影院| 国产一区二区精品| 亚洲精品看片| 国产亚洲欧美日韩精品一区二区三区| 国产私拍福利精品视频二区| 精品国产一区二区三区性色av| 国产精品国产一区| 亚洲天堂1区| 亚洲免费高清| 日韩国产一二三区| 精品日本视频| 91精品综合| 日韩视频不卡| 亚洲精品亚洲人成在线观看| 麻豆精品在线| 欧美日中文字幕| 鲁大师成人一区二区三区| 日韩三区四区| 精品午夜视频| 欧美三区四区| 免费日韩av片| 国产精品永久| 国产麻豆久久| 日韩黄色免费网站| 精品视频一二| 亚洲欧美日韩在线观看a三区| 日本三级亚洲精品| 91一区二区| 久久国产精品毛片| 久久99国产精品视频| 欧美jjzz| 91精品在线免费视频| 精品视频黄色| 99在线精品免费视频九九视| 日韩三级久久| 国产综合色区在线观看| 亚洲精品综合| 日韩在线观看不卡| 日韩激情综合| 激情五月综合网| 国产精品久久777777毛茸茸| 欧美成人午夜| 久久激情五月婷婷| 久久久水蜜桃av免费网站| 亚洲精品乱码| 久久久久91| 国产精品最新自拍| 亚洲欧洲一区二区天堂久久| 久久精品一区二区三区中文字幕| 欧美日韩免费观看一区=区三区| 日本a口亚洲| 国产精品88久久久久久| 欧美精品中文| 亚洲免费黄色| 91日韩在线| 欧美伊人影院| 先锋影音国产一区| 成人在线免费观看网站| 日韩欧美三区| 亚洲国产一区二区三区在线播放| 国产精品亚洲综合在线观看| 国产麻豆综合| 亚洲天堂1区| 精品久久精品| 欧美精品福利| 亚洲精品韩国| 亚洲一区二区三区免费在线观看 | 亚洲综合电影| 欧美天堂在线| 亚洲三级在线| 久久国产88| 亚洲一本视频| 国产在线视频欧美一区| 日韩高清不卡一区二区| 国产精品日韩欧美一区| 亚洲二区在线| 久久精品动漫| 九九色在线视频| 精品免费视频| 日韩av在线免费观看不卡| 美女国产精品| 亚洲欧美日韩高清在线| 亚洲精品在线影院| 狠狠久久伊人| 久久99青青| 久久国产乱子精品免费女| 日韩中文字幕区一区有砖一区 | 激情国产在线| 国产aa精品| 欧美xxxx中国| 国产成人黄色| 精品亚洲免a|