Python Fabric ssh 配置解讀

markriver發表於2021-09-09

 

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 的 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 是繼承自 中的 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 FabricConfigfrom invoke.config import merge_dictsclass 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, 這在連線比較多的伺服器的時候很有用。

原文出處:https://www.cnblogs.com/nowg/p/9936701.html  

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/818/viewspace-2816827/,如需轉載,請註明出處,否則將追究法律責任。

相關文章