在使用 Fabric 的過程中,如果大批量服務器處理的話,我們就需要針對配置主機的密碼,每台主機的密碼相同還好,不同的話,就需要針對不同的主機做配置了,以下有兩種配置方式
注:本文主要參考官方文檔 Password management 以及 grimnes 的文章 Using SSH keys with Fabric
env.password
Fabric 在某些場合下通過保持在內存中以及雙重緩存來幫助你記錄登錄密碼以及 sudo 密碼。當多個系統的密碼一樣的時候,這可以避免讓你重復乏味的輸入密碼。或者是一個遠程系統的 sudo 配置文件沒有緩存它自己的密碼時候。
第一層是一個默認簡單的或是備用的密碼緩存。 env.password (它也可以通過命令行參數 --password 或是 --initial-password-prompt 來設定)。這個 env 變量存儲單個密碼,它會咋當前的 host string 沒有指定的主機緩存條目的事件的時候嘗試。
env.passwords (復數,表示多個密碼),作為每一個主機用戶的緩存,為唯一的 user/host/port 組合存儲了最近輸入的密碼1。由於這個緩存,連接具有相同 session 的不同用戶和主機,僅僅只要求單個的密碼。
依賴於你的配置文件以及你 session 連接的主機的數目,你可能會發現設置這些 env 是非常有用的。盡管如此, Fabric 會在必要的時候自動填充他們,不需要你多余的配置。
特別說明,每次對用戶提出的密碼提示,這值都會被用於更新這默認的密碼緩存以及 env.host_string 當前值的緩存值。
沒代碼說的球,上代碼。NO CODE NO BB
- 所有主機密碼一樣的代碼,下面代碼的幾台主機是用戶名和密碼一樣的,主要做的事情是批量注釋,批量停止應用,以及批量關機
#!/usr/bin/python env # -*- coding: utf-8 -*- from fabric.api import env from fabric.api import cd from fabric.api import run from fabric.api import local from fabric.api import get from fabric.api import put env.user = 'username' env.password = 'passwd' env.hosts = ['192.168.1.1', '192.168.1.2', '192.168.1.3', '192.168.1.4'] def get_version(): local('cat /etc/issue') run('cat /etc/issue') #with cd('/root/'): # put('/home/libaoyin/test.txt', 'test.txt', mode=0755) # get('hello_world.txt') run('ls') def get_host_name(): run('hostname') #kill all stockd'service def kill_apps_stockd(): run('killall stockd') #discharge the crontab def comment_crontabl(): put ('/home/apps/ykq/crontab.txt','crontab.txt') run('crontab crontab.txt') # offline stockd's service def offline_stockd(): kill_apps_stockd() comment_crontabl() #shutdown all stockd server def shutdown_stockd_server(): run('sudo poweroff')
- 所有主機的用戶名一樣,但密碼不一樣
這里感謝@Kollin 的提示,修正下錯誤,並且以他的示例程序為例。
不過感覺這個Fabric的這方面這樣做的原因應該是“基於不同的用戶名和不同的密碼考慮的”
沒有考慮過相同用戶名,不同密碼的情況。如果要這樣做,個人感覺可以修改源碼,然后支持env.user 和 env.passwords拼接的方式。不然每個值都要輸入user@這樣要多寫很多代碼
錯誤的示例程序。
env.user = 'username' env.passwords = {'192.168.1.1':'passwd1','192.168.1.2':'passwd2','192.168.1.3':'passwd3'} env.hosts = ['192.168.1.1', '192.168.1.2', '192.168.1.3']
正確的 @Kollin的示例程序
from fabric.api import * env.hosts = [ 'user@192.168.1.1', 'user@192.168.1.2', ] env.passwords = { 'user@192.168.1.1:22': 'password1', 'user@192.168.1.2:22': 'password2', } @task def echo(): run('echo "hello,world"')
注:后續會專門寫一篇關於 Fabric 中角色的文章
SSH KEY
官方文檔中建議,為了安全起見,最好是使用 SSH KEY 的方式來批量執行主機,操作方式如下:
- 登錄服務器,生成 SSH Key
$ ssh-keygen -t rsa -b 4096
鍵入以上命令后,會出現一連串的提示,忽略它,一直按回車鍵即可。
執行完成后,將在用戶的 ~/.ssh/ 目錄生成以下兩個文件:
~/.ssh/id_rsa 私鑰 ~/.ssh/id_rsa.pub 公鑰
-
公鑰填充
把生成的公鑰文件
~/.ssh/id_rsa.pub里面的數據添加進遠程服務器的authorized_keys file文件中注:如果遠程服務器沒有
.ssh文件夾,需要創建
scp ~/.ssh/id_rsa.pub user@host:~/.ssh/ cat ~/.ssh/id_rsa.pub >> authorized_keys
然后准備我們的用我們的 SSH Key 代替我們的密碼:
#!/usr/bin/python env from fabric.api import * from fabric.colors import * from fabric.context_managers import * env.hosts=['168.192.1.10','168.192.1.12'] # env.password='xxxxxx' env.key_filename = "~/.ssh/id_rsa" def ls_path(): print(green("I'm local /home/apps/")) with cd('/home/apps'): run('ls -l') def put_path(): print(green("I'm put local's test file to 10 and 12")) put('/home/apps/test','/home/apps/') print(yellow("I'm 10 or 12 /home/apps/")) with cd('/home/apps'): run('ls -l') def deploy(): execute(ls_path) execute(put_path)
-
我們強烈推薦使用基於 SSH key 的訪問方式代替依靠同樣的密碼,SSH key 方式是更加安全的
