新闻资讯

新闻资讯 行业动态

自动化运维利器 Fabric 教程(三)——Fabric 的进阶用法

编辑:008     时间:2020-03-09

1、身份认证

Fabric 使用 SSH 协议来建立远程会话,它是一种相对安全的基于应用层的加密传输协议。

基本来说,它有两种级别的安全认证方式:

  • 基于口令的身份认证:使用账号与密码来登录远程主机,安全性较低,容易受到“中间人”攻击
  • 基于密钥的身份认证:使用密钥对方式(公钥放服务端,私钥放客户端),不会受到“中间人”攻击,但登录耗时较长

前文在举例时,我们用了第一种方式,即通过指定 connect_kwargs.password 参数,使用口令来登录。

Fabric 当然也支持采用第二种方式,有三种方法来指定私钥文件的路径,优先级如下:

  • 优先查找 connect_kwargs.key_filename 参数,找到则用作私钥
  • 其次查找命令行用法的 --identify 选项
  • 最后默认使用操作系统的 ssh_config 文件中的IdentityFile 的值

如果私钥文件本身还被加密过,则需要使用 connect_kwargs.passphrase 参数。

2、配置文件

Fabric 支持把一些参数项与业务代码分离,即通过配置文件来管理它们,例如前面提到的密码和私钥文件,可写在配置文件中,避免与代码耦合。

Fabric 基本沿用了 Invoke 的配置文件体系(官方文档中列出了 9 层),同时增加了一些跟 SSH 相关的配置项。支持的文件格式有 .yaml、.yml、.json 与 .py(按此次序排优先级),推荐使用 yaml 格式(后缀可简写成 yml)。

其中,比较常用的配置文件有:

  • 系统级的配置文件:/etc/fabric.yml
  • 用户级的配置文件:~/.fabric.yml(Windows 在 C:\Users\xxx 下)
  • 项目级的配置文件:/myproject/fabric.yml

以上文件的优先级递减,由于我本机是 Windows,为了方便,我在用户目录建一个".fabric.yml"文件,内容如下:

# filename:.fabric.yml user: root
connect_kwargs:
  password: xxxx # 若用密钥,则如下 #  key_filename: #    - your_key_file 

我们把用户名和密码抽离出来了,所以 fabfile 中就可以删掉这些内容:

# 文件名:fabfile.py from fabric import Connection from fabric import task

host_ip = '47.xx.xx.xx' # 服务器地址 cmd = 'date' # shell 命令,查询服务器上的时间 @task def test(c): """
    Get date from remote host.
    """ con = Connection(host_ip)
    result = con.run(cmd, hide=True)
    print(result.stdout)

然后,在命令行中执行:

>>> fab test
Tue Feb 18 10:33:38 CST 2020 

配置文件中还可以设置很多参数,详细可查看文档 [4]。

3、网络网关

如果远程服务是网络隔离的,无法直接被访问到(处在不同局域网),这时候需要有网关/代理/隧道,这个中间层的机器通常被称为跳板机或堡垒机。

Fabric 中有两种网关解决方案,对应到 OpenSSH 客户端的两种选项:

  • ProxyJump:简单,开销少,可嵌套
  • ProxyCommand:开销大,不可嵌套,更灵活

在创建 Fabric 的 Connection 对象时,可通过指定 gateway 参数来应用这两种方案:

ProxyJump 方式就是在一个 Connection 中嵌套一个 Connection 作为前者的网关,后者使用 SSH 协议的direct-tcpip 为前者打开与实际远程主机的连接,而且后者还可以继续嵌套使用自己的网关。

from fabric import Connection

c = Connection('internalhost', gateway=Connection('gatewayhost'))

ProxyCommand 方式是客户端在本地用 ssh 命令(类似“ssh -W %h:%p gatewayhost”),创建一个子进程,该子进程与服务端进行通信,同时它能读取标准输入和输出。

这部分的实现细节分别在paramiko.channel.Channel 和 paramiko.proxy.ProxyCommand,除了在参数中指定,也可以在 Fabric 支持的配置文件中定义。更多细节,请查阅文档 [5]。


原文链接:https://my.oschina.net/u/4051725/blog/3167801

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

回复列表

相关推荐