Python Fabric ssh 配置解讀


Python Fabric ssh 配置解讀


Fabric 2.4簡介:

Fabric is a high level Python (2.7, 3.4+) library designed to execute shell commands remotely over SSH, yielding useful Python objects in return.

簡單說就是一個基於 ssh 執行遠程 shell 命令返回一個 python 對象的一個 python 庫。

Fabric 的大部分配置都是對 ssh 的配置, 而它的 ssh 協議是通過另一個 開源庫 Paramiko 實現, 所以最終這些配置都會轉換成 Paramiko 的 ssh 配置。

先看下官方的例子:

result = Connection('web1').run('hostname')

建立一個到 web1 這台服務器的一個 ssh 連接, 然后執行 hostname , 返回一個這次連接執行結果 python 對象。

這里就來到了本文的主題, 他是怎樣連接對應的 host 也就是 Web1 的。

每一個 Fabric 的 Connection 都有一個 SSHClient 實例(Paramiko 中實現), 然后通過這個實例來連接上 Web1, 所以就需要 fabric 來提供這個實例連接所需要的必要參數, 這個是 SSHClient 連接的參數。

def connect(
        self,
        hostname,
        port=SSH_PORT,
        username=None,
        password=None,
        pkey=None,
        key_filename=None,
        timeout=None,
        allow_agent=True,
        look_for_keys=True,
        compress=False,
        sock=None,
        gss_auth=False,
        gss_kex=False,
        gss_deleg_creds=True,
        gss_host=None,
        banner_timeout=None,
        auth_timeout=None,
        gss_trust_dns=True,
        passphrase=None,
    ):

Connection 是繼承自 invoke 中的 Context, 就字面意思來說是提供這個 SSHClient 連接的上下文, 也就是 SSHClient 所需的參數。

Connection 中上下文中的參數又會通過 Fabric Config來提供, Connection 實例創建的時候會生成 Fabric 自己的 Config 或將外部傳入 config 對象轉換成 Fabric Config 對象。

Fabric Config 有一個對使用者來說比較有用的一個靜態方法,

 @staticmethod
    def global_defaults():
        defaults = InvokeConfig.global_defaults()
        ours = {
            # New settings
            "connect_kwargs": {},
            "forward_agent": False,
            "gateway": None,
            "load_ssh_configs": True,
            "port": 22,
            "run": {"replace_env": True},
            "runners": {"remote": Remote},
            "ssh_config_path": None,
            "tasks": {"collection_name": "fabfile"},
            # TODO: this becomes an override/extend once Invoke grows execution
            # timeouts (which should be timeouts.execute)
            "timeouts": {"connect": None},
            "user": get_local_user(),
        }
        merge_dicts(defaults, ours)
        return defaults

這個其實是 Fabric 對 InvokeConfig 默認配置的一個擴展, 具體的可以看代碼, 我們可通過覆蓋這個方法, 來實現我們自己的默認或者說全局配置, 然后把這個配置傳給 Connection, 為 Connection 中的連接提供必要的參數。

from fabric import Config as FabricConfig
from invoke.config import merge_dicts

class MyConfig(FabricConfig):
    @staticmethod
    def global_defaults():
        defaults = FabricConfig.global_defaults()
        my = {
            "connect_kwargs": {"password":"123456"},
            "port": 22,
            "ssh_config_path": "./ssh_config",
            "load_ssh_configs": False,
            "user": "root",
        }
        merge_dicts(defaults, my)
        return defaults

幾個參數的意義:

  • connect_kwargs: 為 ssh connect 提供中的參數
  • port: ssh 連接的端口
  • ssh_config_path: ssh_config 的路徑, 配置后只會讀取這個路徑 ssh_config 的配置, fabric 擴展的參數
  • load_ssh_configs: 沒有配置 ssh_config_path 的時候, 是否讀取系統和用戶配置
  • user: 連接的用戶

這些都是默認配置, 優先級是最低的, ssh_config_path 中配置的優先級會覆蓋掉默認默認配置。 所以官方例子中 Web1 的配置來源可能有三種,ssh_config_path 中的配置, 系統的 ssh_config(/etc/ssh_config), 以及用戶的 ssh_config(~/.)。

一個值得一提的點是:
當傳入的 config 是一個對象實例的時候, 是不會再創建 Config 對象的,也就是說可以很多個 Connection 共用一個 Config, 這在連接比較多的服務器的時候很有用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM