fabric 基础总结

fab的常用参数:
-l : 显示定义好的任务函数列表
-f : 指定fab入口文件,默认入口文件是fabfile.py
-g : 指定网关
-H:指定目标主机,多个主机用,隔开。
-P : 以异步并行方式运行多主机任务,默认为串行。
-u: 指定主机的用户名,
-p:指定用户的密码。

fab -p 密码 -H 主机1,主机2 –‘命令’

实验:
1:单机操作
fab -u root -p password -H “ip” – “uname -a”
在远端服务器上执行命令 uname -a
2:多机串行
fab -u root -p password -H “ip1,ip2” – “uname -a”
2:多机并行:
fab -u root -p password -H “ip1,ip2” -P – “uname -a && 命令2”
执行是并行输出是串行。

测试代码:

#coding:utf8
from fabric.api import *
env.hosts = ["ip"]
env.user = "root"
env.password = "password"
env.port = 22

@task
def show():
    run("hostname")
    run("netstat -anptu | grep 22")
    run("ls /root/")
@task
def catmem():
    run("free -m")
@task
def run_all():
    execute(show)
    execute(catmem)
if __name__ == "__main__":
    execute(run_all)

编写fabfile.py的脚本文件。

全局属性的设定:
env对象的作用是定义fabfile的全局设定,支持多个属性,包括目标主机,用户,密码,角色等等。

1 env.hosts:定义多个目标主机,用IP或者主机名的列表。
格式:env.hosts=[“”,”“]

2 env.user 定义用户名
格式: env.user = “root”

3 env.port 定义端口
格式: env.port = 22

4 env.password定义密码
env.password = “”

5 env.passwords: 定义多台主机的用户名,ip,port,password
格式 env.passwords = {
“root@ip”:”pw”,
“root@ip”:”pw”
}

6 env.gateway定义网关
格式:env.gateway = “ip”

7 env.roledefs: 定义角色分组
env.roledefs = {
“webserver”:[“ip”,”ip”],
“dbserver”:[“ip”,”ip”]
}

fab -f test1.py -l 显示任务函数
fab -f test1.py show 任务2 任务3 执行任务函数
python test1.py 也可以执行 if __name__=”__main__”:

测试代码:

#coding:utf8
from fabric.api import *
env.user = "root"
env.hosts = ["",""]
env.passwords = {
        "root@ip":"pw",
        "root@ip","pw"
        }
env.roledefs = {
        "webserver":["ip"],
        "dbserver",["ip"]


        }
@task
def show():
    run("hostname")

@task
@roles("webserver")
def install_httpd():
    print("install webserver")

@task
@roles("dbserver")
def install_mysql():
    print("install mysql")

@task
def run_all():# 可能会调用两次?
    execute(show)
    execute(install_httpd)
    execute(install_mysql)

if __name__ == "__main__":# 可能会调用两次
    execute(run_all)

本地与远程运维常用的api
1,local 执行本地命令
格式: local(本地命令)
2,lcd 切换到本地目录
格式:lcd(本地目录)
3,cd 切换远程目录
格式:cd(远程目录)
4,run 执行远程命令
格式: run(远程命令)
5,sudo sudo的方式执行远端命令
格式:sudo(远程命令)
6,put:上传本地文件到远程主机
格式:put(本地文件,远程文件)
7,get:从远程主机下载文件到本地
格式:get(远程文件,本地文件)
8,prompt获取用户的输入信息
格式:prompt(“please input user password:”)
9,confirm:获取提示信息确认
格式:confirm(”continue[y/n]?”)
10,reboot 重启远程主机
格式:reboot()
11 ,@task 标注过的fab命令可见
12,@runs_once: 表示函数只会执行一次,不受多台主机的影响。

输出颜色
from fabric.colors import *
yellow(“hello world”)
blue(“hello world”)
red(“hello world”)
green(“hello world”)
cyan(“hello world”)
magenta(“hello world”)
white(“hello world”)
测试代码:

#coding:utf8
from fabric.contrib.console import confirm
from fabric.api import *
from fabric.colors import *
env.hosts = ["ip"]
env.user = "root"
env.password = "password"
env.port = 22
@task
def local_cmd():
    local("ls -la")
    with lcd("test"):
        local("ls -la")
@task
def remote_cmd():
    #run("free -m")
    #sudo("cat /etc/passwd")
    #with cd("/etc"):
    #    run("ls -la")
    #put("test1.py","/root/test_put.py")
    #run("ls -la /root/")
    #get("/root/file.py","file.py")
    #local("ls -la")
    content1 = prompt("请输入")
    print(content1)
    content2 = confirm("请确认[Y/N]:")
    print(content2)
@task
def show_color():
    print(white("hello world"))
    print(cyan("hello world"))
@task
def reboot_sys():
    reboot()

文件打包上传校验下载:
基本操作:
1,打包:tar -czf xxx.tar.gz xxx
2,解包:tar -zxf xxx.tar.gz -C xxx
3,上传: put(本地文件,远程文件)
4,下载:get(远程文件,本地文件)
5,异常处理:
with settings(warn_only=Ture):
result = put(本地文件,远程文件)
if result.failed and not confirm(“put file failed,Continue[Y/N]?”):
abort(“Aborting file put task”)
6,校验:
with settings(warn_only=Ture):
local_md5 = local(“md5sum xxx.tar.gz”,capture=Ture).split(” “)[0]
remote_md5 = run(“md5sum xxx.tar.gz”).split(” “)[0]
if local_md5 == remote_md5:
print(“local file == remote file”)
else:
print(“local file != remote file”
测试代码:

#coding:utf8
from fabric.colors import *
from fabric.api import *
from fabric.contrib.console import confirm
env.hosts = ["ip"]
env.user = "root"
env.passwords = {
        "root@ip":"password"
        }
@task
def upload_file():
    with settings(warn_only=True):
        local("tar -czf test1.tar.gz test1.py")
        result = put("test1.tar.gz","/root/test1.tar.gz")
    if result.failed and not confirm("continue[Y/N]?"):
        abort("put file failed")

    with settings(warn_only=True):
        local_file = local("md5sum test1.tar.gz",capture=True).split(" ")[0]
        remote_file = run("md5sum /root/test1.tar.gz").split(" ")[0]
    if local_file == remote_file:
        print(green("local == remote"))
    else:
        print(red("local != remote"))
    run("mkdir /root/test")
    run("tar -zxf /root/test1.tar.gz -C /root/test/")
@task
def download_file():
    with settings(warn_only=True):
        get("/root/filename","")
        local("mkdir /root/test0")
        local("tar -zxf filename -C /root/test0")

多主机批量并行运维
基本操作
1.指定多台主机IP或者域名
env.housts = [ip,ip]
2.指定多台主机的密码
env.passwords = {
“root@ip”:”pw”,
“”:””
}
3.指定主机的角色分组
env.roledefs = {
“xxx1”:[ip,ip,],
“xxx2”:[ip,ip]
}
4.并行装饰器:@parallel
5,角色装饰器:@roles(角色)
6.主机装饰器:@hosts(主机1,主机2)

安装FTP的服务
yum clean all 清除缓存
yum repolist all 刷新仓库
yum -y install vsftpd 安装ftp服务
systemctl start vsftd.service 启动服务
systemctl enable vsftd.service 设置开机自动启动
测试代码:

#coding:utf8
from fabric.api import *
env.user = "root"
host1 = ""
host2 = ""
env.hosts = [host1,host2]
env.passwords = {
        "root@ip1":"pw1",
        "root@ip2":"pw2"
        }
@task
@parallel
@hosts(host1,host2)
def install_ftp():
    run("yum clean all")
    run("yum repolist all")
    run("yum -y install vsftpd")
    run("systemctl start vsftpd.service")
    run("systemctl enable vsftpd.service")
    run("systemctl status vsftpd.service")

自动化创建tornado项目目录:

#coding:utf8

import os
os.system("pip install -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com fabric")

os.system("pip install -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com tornado")
from fabric.api import *
from fabric.colors import *


def index_py_s():
    content = """#coding:utf8
from app import app
if __name__ == "__main__":
    app()

    """
    return content
def server_py_s(port):
    content = """#coding:utf8
import tornado.web
import tornado.ioloop
import tornado.options
import tornado.httpserver

from tornado.options import options,define
from configs import configs
from urls import urls
define("port",default = %d ,type = int)

class CustomApplication(tornado.web.Application):
    def __init__(self, configs, urls):
        settings = configs
        handlers = urls
        super(CustomApplication, self).__init__(handlers = handlers,**settings)

def create_app():
    tornado.options.parse_command_line()
    http_server = tornado.httpserver.HTTPServer(CustomApplication(configs,urls))
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()

app = create_app

    """ % int(port)
    return content

def urls_py_s():
    content = """#coding:utf8
from home.views import IndexHandler as home_index
urls = [
     (r"/",home_index)
    ]
    """
    return content


def configs_py_s():
    import uuid
    content = """#coding:utf8
import os
root = os.path.dirname(__file__)
configs = dict(
    template_path = os.path.join(root,"templates"),
    static_path = os.path.join(root, "static"),
    debug = True,
    xsrf_cookies = True,
    cookie_secret = "%s"

)

    """ % str(uuid.uuid4().hex)
    return content

def views_py_s():
    content = """#coding:utf8
import tornado.web

class IndexHandler(tornado.web.RequestHandler):
    def get(self):
        self.render("index.html",title = "hello world !")

    """
    return content

def index_html_s():
    content="""
<h1>{{title}}</h1>

    """
    return content


@task
def mk_web():
    dir_name = prompt(green("please input project name"))
    local("mkdir %s" % dir_name)
    with lcd(dir_name):
        local("touch index.py")
        local("echo '%s' >> index.py" % index_py_s())

        local("mkdir app")
        with lcd("app"):
            local("touch __init__.py")
            port = prompt(cyan("please input project port"))
            local("echo '%s' >> __init__.py" % server_py_s(port))

            local("touch urls.py")
            local("echo '%s' >> urls.py" % urls_py_s())

            local("touch configs.py")
            local("echo '%s' >> configs.py " % configs_py_s())

            local("mkdir home")
            with lcd("home"):
                local("touch __init__.py")
                local("touch views.py")
                local("echo '%s' >> views.py" % views_py_s())

            local("mkdir templates")
            with lcd("templates"):
                local("touch index.html")
                local("echo '%s' >> index.html" % index_html_s())
            local("mkdir static")
        local("python index.py")

if __name__ == "__main__":
    execute(mk_web)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 一、Hyperledger Fabric简介 Hyperledger Fabric是一个开源项目,是Linux基金会下的Hyperledger项目的一部分。它是一个模块化的框架,用于建立区块链解决方案,并可部署在各种基础架构上。它的设计目的是支持高度可扩展性、灵活性和机密性。它使用智能合约(Chaincode)来提供智能合约功能,这些智能合约可以编写成各种语言,如Java、Go等。 二、Hyperledger Fabric的工作原理 Hyperledger Fabric是一个分布式账本技术(DLT),它提供了一种安全、高效、灵活和可扩展的方式来处理交易和共享数据。Fabric的核心原理是将交易打包为区块,然后将这些区块添加到区块链中。每个区块包含多个交易,每个交易都由一个客户端向网络中的节点发出,并经过策略验证后被节点接受。 为了确保高度安全性,Fabric使用了多种身份验证机制。每个参与者都有一个身份和一组权限,这些身份和权限由证书颁发机构(CA)颁发和管理。当一个参与者发起一个交易时,他的身份将与交易一起提交到网络中。然后,网络中的节点将使用其本地副本验证交易,并将其添加到区块链中。这样,区块链可以保证所有参与者都可以看到完整的交易历史记录,并且可以验证每个交易的合法性。 三、Hyperledger Fabric的组织结构 1.数据层:Hyperledger Fabric使用CouchDB来存储状态和交易数据。CouchDB是一个开源的文档数据库,它支持高可用性和水平扩展性。CouchDB是Fabric中的默认数据库,但也可以使用其他数据库。 2.链码层:链码是Hyperledger Fabric中的智能合约。它们是用于定义和执行应用程序逻辑的代码。链码可以被编写成各种语言,如Java、Go等。链码可以实现任何类型的业务逻辑,如资产管理、身份验证等。 3.底层:Hyperledger Fabric的底层由多个模块组成,如共识模块、身份认证模块等。这些模块提供了必要的功能来确保网络的安全性和可靠性。 四、Hyperledger Fabric的链码开发 链码是Hyperledger Fabric中的智能合约,它们是用于定义和执行应用程序逻辑的代码。链码可以被编写成各种语言,如Java、Go等。链码可以实现任何类型的业务逻辑,如资产管理、身份验证等。 链码通常由两个部分组成:init和invoke。init函数用于初始化链码,而invoke函数用于执行链码中的逻辑。链码可以使用Fabric SDK编写和部署,也可以使用命令行工具进行操作。 五、Hyperledger Fabric的客户端开发 Hyperledger Fabric的客户端开发可以使用Fabric SDK或命令行工具完成。SDK提供了一组API,用于与Hyperledger Fabric网络交互。它支持多种编程语言,并可用于开发各种类型的应用程序。命令行工具提供了一种简单的方式来与网络交互,但它不如SDK灵活。 六、Hyperledger Fabric的测试部署 Hyperledger Fabric的测试部署可以使用Docker容器完成。Docker是一种轻量级容器技术,它可以帮助我们快速搭建测试环境。使用Docker,我们可以快速部署Hyperledger Fabric网络,并模拟交易和其他操作。此外,Hyperledger Fabric还提供了一些工具,如Fabric CA、Fabric CLI等,这些工具可以帮助我们快速部署和测试网络。 ### 回答2: Hyperledger Fabric是超级账本项目的一个开源平台,旨在建立可靠的、适用企业级应用的、可扩展的分布式账本技术。它为不同组织之间提供了一个去中心化的共享账本,允许多个参与者在没有中间人的情况下进行交易和合作。 在Hyperledger Fabric中,网络由多个节点组成,这些节点可以是客户端节点、对等节点或排序节点。对等节点负责维护账本,并处理交易的验证和背书。排序节点用于按照合理的顺序对交易进行排序,并将结果写入账本。客户端节点是与区块链网络进行交互的应用程序。 Hyperledger Fabric的数据层由世界状态和账本状态组成。世界状态是一个键值对的数据库,用于存储账本的最新状态。账本状态则是一个不可变的、可追溯的事务日志。两者结合起来构成了账本的完整状态。 链码层是Hyperledger Fabric的主要执行环境,用于处理交易的执行和合约的管理。链码可以被认为是类似于智能合约的逻辑,它定义了业务规则和数据模型。链码可以使用不同的编程语言编写,如Go、Java等。 Hyperledger Fabric的底层由一系列核心组件组成,包括共识模块、身份验证模块、通信层和存储层。共识模块负责确保网络中的节点达成一致的交易排序。身份验证模块用于验证交易的发起者身份。通信层负责节点之间的通信,而存储层则用于持久化存储账本数据。 在Hyperledger Fabric的链码开发中,首先需要定义链码的接口和实现,定义链码的输入输出格式和业务逻辑。然后,使用支持的编程语言编写链码,编译链码并将其部署到网络中的对等节点。最后,通过调用链码的方法来实现具体的业务功能。 在客户端开发中,开发人员可以使用提供的SDK来与链码进行交互。SDK提供了一组API,可以用于发起交易、查询账本状态等操作。 在测试和部署方面,Hyperledger Fabric提供了一套测试工具和部署工具。测试工具可以用于模拟交易和网络行为,并检查合约的正确性和性能。部署工具可以用于部署和配置网络,包括创建和加入组织、部署链码等操作。 总结来说,Hyperledger Fabric是一个适用于企业级应用的分布式账本技术平台,它提供了灵活的组织结构和数据层,支持链码开发、客户端开发和测试部署。它的设计使得多个组织可以在去中心化的环境下进行安全、可靠的交易和合作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值