python 自动化运维–fabric库

1、windows拷贝文件到linux部署脚本(python)


# encoding='utf-8'

from fabric import Connection
import sys 

from fabric import Connection
import sys
packageName = sys.argv[1].replace('(','').replace(')','')
sourceDir = "C:\\tmp\\"
destDir = "/usr/local/src/"

with  Connection(host="122.226.107.154", port=2024, user="root", connect_kwargs={"password":"xxxx"}) as c:
    c.put(sourceDir + sys.argv[1], destDir + packageName)
    c.run('rm -rf /usr/local/src/dist')
    c.run('rm -rf /usr/local/app/szzj-portal-pc/*')
    c.run('unzip -o /usr/local/src/%s -d /usr/local/src/' %(packageName))
    c.run('/usr/bin/mv -f /usr/local/src/dist/* /usr/local/app/szzj-portal-pc/')

fabric 官网已经更新到2.6版,阿里镜像下载也已经是2.5的版本,但是网络上搜索到的案例大部分是按照1.X版本编写的。今天查看了下官网的文档,一些用法记录下。

2、基本上只要使用Connection这个api :

fabric.connection.Connection

这个类是从 Invoke 的Context 继承过来的,另外它还封装了Paramiko SSHClient 。可用参数如下:
Connection(hostuser=Noneport=Noneconfig=Nonegateway=Noneforward_agent=Noneconnect_timeout=Noneconnect_kwargs=Noneinline_ssh_env=None)

这里主要说明下connect_kwargs这个参数,它的值是字典(dict),比如密码,密钥key只能设置在这里。这个字典会直接传递给paramiko.client.SSHClient.connect解析,完整的可用字段如下:connect(hostnameport=22username=Nonepassword=Nonepkey=Nonekey_filename=Nonetimeout=Noneallow_agent=Truelook_for_keys=Truecompress=Falsesock=Nonegss_auth=Falsegss_kex=Falsegss_deleg_creds=Truegss_host=Nonebanner_timeout=Noneauth_timeout=Nonegss_trust_dns=Truepassphrase=Nonedisabled_algorithms=None)

3、另外是多主机的操作api

  1. fabric.group.Group(*hosts**kwargs) /**抽象类,无法直接使用,只能选用下面两个
  2. fabric.group.SerialGroup(*hosts**kwargs)
  3. fabric.group.ThreadingGroup(*hosts**kwargs)

因为本机测试不支持put (2.5版本)。group.py也看了,确实没有put ,不好用。
还是选择了for 循环IP列表调用Connection 来实现多主机操作。

其它

1、参数传递 :

python 的参数传递到 shell 脚本 c.run('/root/test.sh %s' %(sys.argv[1]))
实现上类是print函数传参。

Leave a Reply

Your email address will not be published. Required fields are marked *