fabric

fabric 包可以运行远程或者本地命令,上传或者下载文件、用Sudo 权限运行命令。这个包使用安全shell (ssh ) 来运行程序。

你需要把Python函数写入一个fabric文件并声明他们应该在远程还是本地执行,之后使用时需要用fabric程序(名字是fab)来运行,
需要指定目标远程机器和目标函数。他比RPC 简单很多。
fabric是一个python(2.7,3.4+)的库,用来通过SSH远程执行shell命令,并返回有用的python对象。
它建立在“invoke”和“paramiko”库之上,同时扩展了他们的API以提供更多的功能。
官方文档:https://fabric-chs.readthedocs.io/zh_CN/chs/tutorial.html
新的 http://www.fabfile.org/

 出处:http://www.cnblogs.com/madsnotes/

pip3 install fabric3
fab -V 测试一下安装成功了么

 

Fabric常用环境变量

   fabric的环境变量有很多,存放在一个字典中,fabric.state.env,而它包含在fabric.api中,为了方便,我们一般使用env来指代环境变量。env环境变量可以控制很多fabric的行为,一般通过env.xxx可以进行设置。

     fabric默认使用本地用户通过ssh进行连接远程机器,不过你可以通过env.user变量进行覆盖。当你进行ssh连接时,fabric会让你交互的让你输入远程机器密码,如果你设置了env.password变量,则就不需要交互的输入密码。

常用的环境变量:

>>> import fabric.api
>>> for i in fabric.api.env:
...     print(i)
... 
disable_known_hosts     # 默认是false,如果是true,则会跳过用户知道的hosts文件
effective_roles
tasks
linewise
show
password          # 定义密码
key_filename
abort_on_prompts
skip_unknown_tasks
reject_unknown_hosts
skip_bad_hosts                  # 默认false,为ture时,会导致fab跳过无法连接的主机
use_ssh_config 
roledefs          # 定义角色分组,例如:区分DB主机与web主机
gateway          # 定义网关(中转,堡垒机)IP
gss_auth
keepalive
eagerly_disconnect
rcfile
path_behavior
hide
sudo_prefix
lcwd
no_agent
forward_agent
remote_interrupt
port          # 定义目标主机的端口
shell
version
use_exceptions_for
connection_attempts
hosts      # 定义目标主机
gss_deleg
cwd
abort_exception
real_fabfile
passwords      # 与password功能一致,区别在于不同主机不同密码的应用场景
sudo_password
host_string
shell_env
always_use_pty
colorize_errors
exclude_hosts   # 排除指定主机
all_hosts
sudo_prompt
again_prompt
echo_stdin
user        # 定义ssh使用哪个用户登录远程主机
gss_kex
command_timeout
path
local_user
combine_stderr
command_prefixes
dedupe_hosts
warn_only
no_keys
sudo_passwords
roles
fabfile
use_shell
host
pool_size
system_known_hosts
prompts
output_prefix
command
timeout        # 默认10 网络连接的超时时间
default_port
ssh_config_path
parallel
sudo_user
ok_ret_codes

Fabric执行模式

执行策略:fabric默认是单一的,串行的执行函数,虽然有一个paralle模式可供你选择。默认的行为遵循以下优先级规则:

  •  一个task列表被创建,通过命令行传递给fab
  •  针对每一个task,都有一个主机列表通过变量设置
  • task列表按顺序执行每个task在主机列表中的主机上执行一遍
  • 如果主机列表为空,则默认在本地执行,也是执行一次

Fabric常用API

[root@bogon fabric]# python
Python 2.6.6 (r266:84292, Jul 23 2015, 14:41:34) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-11)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import tab
>>> import fabric.api
>>> for i in dir(fabric.api):
...     print(i)
... 
__builtins__
__doc__
__file__
__name__
__package__
abort
cd                 # 切换远程目录
env
execute
fastprint
get              # 从远程主机下载文件到本地
hide 
hosts
lcd              # 切换本地目录
local           # 执行本地命令     
open_shell
output
parallel
path
prefix
prompt          # 获取用户输入信息
put               # 上传本地文件到远程主机
puts
quiet
reboot
remote_tunnel
require
roles
run                    # 执行远程命令
runs_once          # 函数修饰符 标识的函数只会执行一次,不收多台主机影响
serial
settings
shell_env
show
sudo              # sudo方式执行远程命令
task              # 函数修饰符,标识的函数为fab可以调用
warn
warn_only
with_settings

API应用场景案例

案例1:同时查看本地及远程主机信息

案例2:动态获取远程目录列表

案例3:网关模式文件的上传与下载

 

Fabric 使用 

[root@saltstack fabric]# fab -h
Usage: fab [options] <command>[:arg1,arg2=val2,host=foo,hosts='h1;h2',...] ...

Options:
  -h, --help            show this help message and exit
  -d NAME, --display=NAME print detailed info about command NAME
  -F FORMAT, --list-format=FORMAT formats --list, choices: short, normal, nested
  -I, --initial-password-prompt  Force password prompt up-front
  --initial-sudo-password-prompt  Force sudo password prompt up-front
  -l, --list            print list of possible commands and exit                   # 显示一个脚本中可用的task(命令)
  --set=KEY=VALUE,...   comma separated KEY=VALUE pairs to set Fab env vars
  --shortlist           alias for -F short --list
  -V, --version         show program's version number and exit
  -a, --no_agent        don't use the running SSH agent
  -A, --forward-agent   forward local agent to remote end
  --abort-on-prompts    abort instead of prompting (for password, host, etc)
  -c PATH, --config=PATH specify location of config file to use
  --colorize-errors     Color error output
  -D, --disable-known-hosts  do not load user known_hosts file
  -e, --eagerly-disconnect disconnect from hosts as soon as possible
  -f PATH, --fabfile=PATH  python module file to import, e.g. '../other.py'   # 指定入口文件,fab默认入口文件是:fabfile/fabfile.py
  -g HOST, --gateway=HOST  gateway host to connect through      # 指定网关(中转)设备,比如堡垒机环境,填写堡垒机IP即可
  --gss-auth            Use GSS-API authentication
  --gss-deleg           Delegate GSS-API client credentials or not
  --gss-kex             Perform GSS-API Key Exchange and user authentication
  --hide=LEVELS         comma-separated list of output levels to hide
  -H HOSTS, --hosts=HOSTS   comma-separated list of hosts to operate on      # 指定host,支持多host逗号分开
  -i PATH               path to SSH private key file. May be repeated.
  -k, --no-keys         don't load private key files from ~/.ssh/
  --keepalive=N         enables a keepalive every N seconds
  --linewise            print line-by-line instead of byte-by-byte
  -n M, --connection-attempts=M make M attempts to connect before giving up
  --no-pty              do not use pseudo-terminal in run/sudo
  -p PASSWORD, --password=PASSWORD  password for use with authentication and/or sudo
  -P, --parallel        default to parallel execution method    # 以异步并行方式运行多主机任务,默认是串行
  --port=PORT           SSH connection port
  -r, --reject-unknown-hosts   reject unknown hosts
  --sudo-password=SUDO_PASSWORD  password for use with sudo only
  --system-known-hosts=SYSTEM_KNOWN_HOSTS  load system known_hosts file before reading user known_hosts
  -R ROLES, --roles=ROLES comma-separated list of roles to operate on    # 指定role,支持多个,即以角色名区分不同业务组设备
  -s SHELL, --shell=SHELL  specify a new shell, defaults to '/bin/bash -l -c'
  --show=LEVELS         comma-separated list of output levels to show
  --skip-bad-hosts      skip over hosts that can't be reached
  --skip-unknown-tasks  skip over unknown tasks
  --ssh-config-path=PATH   Path to SSH config file
  -t N, --timeout=N     set connection timeout to N seconds    # 设置设备连接超时时间(秒)
  -T N, --command-timeout=N  set remote command timeout to N seconds   # 设置远程主机命令执行超时时间(秒)
  -u USER, --user=USER  username to use when connecting to remote hosts  
  -w, --warn-only       warn, instead of abort, when commands fail     # warn_only,默认是碰到异常直接abort退出,该设置为发出告警,但不退出
  -x HOSTS, --exclude-hosts=HOSTS  comma-separated list of hosts to exclude
  -z INT, --pool-size=INT  number of concurrent processes to use in parallel mode

远程传递参数

[root@saltstack fabric]# cat fabric_2.py
#!/usr/bin/env python
# coding:utf-8

from fabric.api import run

def host_type(name):
    run('uname -s')
    print("Hello %s !!!" % name)

[root@saltstack fabric]# fab -H localhost -f fabric_2.py host_type:name=mads
[localhost] Executing task 'host_type'
[localhost] run: uname -s
[localhost] out: Linux
[localhost] out: 

Hello mads !!!

Done.
Disconnecting from localhost... done.

  多台服务器批量执行相同的操作

from fabric.api import run,cd,env,hosts
env.hosts=['192.168.20.140:22','172.16.1.150:22']   # env.hosts=['user@ip:port',] ssh要用到的参数格式
env.password='strong'
from fabric.api import env,roles,run,execute
 
env.roledefs = {
'server1': ['root@172.16.1.140:22',],
'server2': ['root@172.16.1.150:22', ]
}
 
env.password = 'strong'
from fabric.colors import *

def show():
    print green('success')
    print red('fail')
    print yellow('yellow')

错误及异常

# 默认情况
[root@saltstack fabric]# cat fabric_6.py
#!/usr/bin/env python
# coding:utf-8

#from fabric.api import run
from fabric.api import local

def host_type():
    local('uname -s')
    local('tt')
    local('hostname')

[root@saltstack fabric]# fab -H localhost -f fabric_6.py host_type                      
[localhost] Executing task 'host_type'
[localhost] local: uname -s
Linux
[localhost] local: tt
/bin/sh: tt: command not found

Fatal error: local() encountered an error (return code 127) while executing 'tt'

Aborting.
# 注:由于tt执行报错,后面的hostname命令没有被执行

[root@saltstack fabric]# cat fabric_7.py
#!/usr/bin/env python
# coding:utf-8

from __future__ import with_statement
from fabric.api import local, settings, abort
from fabric.colors import *
from fabric.contrib.console import confirm

def host_type():
    local('uname -s')
    with settings(warn_only=True):
        result = local('tt', capture=True)
    if result.failed and not confirm(red("tt cmd failed. Continue anyway?")):
        abort("Aborting at user request.")
    local('hostname')
[root@saltstack fabric]# fab -H localhost -f fabric_7.py host_type
[localhost] Executing task 'host_type'
[localhost] local: uname -s
Linux
[localhost] local: tt

Warning: local() encountered an error (return code 127) while executing 'tt'

tt cmd failed. Continue anyway? [Y/n] y        # 判断上一步执行有无异常,异常给予提示,确认是否继续
[localhost] local: hostname
saltstack

Done.

 

posted @ 2019-03-05 11:15  慕沁  阅读(1665)  评论(0)    收藏  举报