跳转到主要内容

通过Fabric进行文件同步。

项目描述

fabsync

概述

这是一个为Fabric设计的文件同步工具。它使用起来几乎和rsync一样简单,但同时也具备一些Ansible等部署自动化工具的熟悉功能。

关键点

  • 源文件以简单的目录树形式保存,就像您要使用rsync一样。
  • 元数据(如所有权和权限)在树中的TOML文件中进行配置。
  • 可以配置渲染函数以转换文件内容。您可以将它们连接到模板引擎或其他任何东西。
  • 可以使用路径和标签来同步文件树的部分子集。

需要注意的是,这是一个库,而不是框架。它只做一件简单的事情,您可以根据自己的需求将其集成到部署方案中。以下是一个假设的fabfile.py片段,供参考

import io
from pathlib import Path
from typing import Any, Mapping

from fabric import Connection, task
import fabsync
import pystache
import tomli


def _mustache_renderer(conn: Connection) -> fabsync.Renderer:
    try:
        result = conn.get('/usr/local/etc/fabsync.toml', io.BytesIO())
    except FileNotFoundError:
        host = {}
    else:
        host = tomli.loads(result.local.getvalue().decode())

    renderer = pystache.Renderer(escape=lambda s: s)

    def render(path: Path, vars: Mapping[str, Any]) -> str:
        with path.open('rt') as f:
            return renderer.render(f.read(), host | vars)

    return render


@task(iterable=['tag'], incrementable=['verbose'])
def sync(conn, subpath=None, tag=None, verbose=0):
    root = fabsync.load('files', '/')
    selector = fabsync.ItemSelector.new(subpath=subpath, tags=tag)
    renderers = {'mustache': _mustache_renderer(conn)}

    dry_run = conn['run']['dry']

    for result in fabsync.isync(conn, root, selector, renderers, dry_run=dry_run):
        print(f"{result.path}{' [modified]' if result.modified else ''}")
        if verbose > 0 and result.diff:
            print(result.diff.decode())

当然,您也可能希望保存结果并使用它们来决定执行其他操作(例如重启服务)。

因为我们只处理文件,fabsync可以提供一些其他便利函数,包括将源树渲染成可读行的函数。如果您使用PrettyTable渲染,它可能看起来像这样

+-----------------------------------+------+-------+------------+----------+-------+--------+
| Path                              | User | Group | Mode       | Renderer | Diff? | Tags   |
+-----------------------------------+------+-------+------------+----------+-------+--------+
| /usr/                             |      |       |            |          |       |        |
| /usr/local/                       |      |       |            |          |       |        |
| /usr/local/etc/                   |      |       |            |          |       |        |
| /usr/local/etc/mail/              |      |       |            |          |       | mail   |
| /usr/local/etc/mail/smtpd.conf    |      |       |            |          |       | mail   |
| /usr/local/etc/rc.d/              | root | wheel |            |          |       |        |
| /usr/local/etc/rc.d/restic-server | root | wheel | -rwxr-xr-x |          |       | restic |
| /usr/local/etc/smb4.conf          |      |       |            |          |       |        |
| /usr/local/etc/wireguard/         |      |       | drwx------ |          |       | wg     |
| /usr/local/etc/wireguard/wg0.conf |      |       | -rw------- | mustache |       | wg     |
| /usr/local/utils/                 |      |       |            |          |       |        |
+-----------------------------------+------+-------+------------+----------+-------+--------+

有关更多详细信息和使用步骤指南,请参阅文档

贡献

我写这篇文档是为了自己的目的,主要发布它是为了强制执行全面文档和测试的纪律。它的范围故意很窄。新的功能不是不可能,但主要是那些在外部实现时需要更多努力的功能。

欢迎您提交错误报告或建议。并注意Unlicense许可,这意味着您也可以直接取用代码并随意使用它。

许可证

这是一个免费且不受限制的软件,已发布到公共领域。

任何人都可以免费复制、修改、发布、使用、编译、销售或分发此软件,无论是源代码形式还是编译的二进制形式,用于任何目的,无论是商业用途还是非商业用途,以及通过任何方式。

在承认版权法的司法管辖区,该软件的作者或作者将软件的所有版权利益奉献给公共领域。我们做出这项奉献是为了公众的整体利益,损害了我们的继承人后继者的利益。我们意图这项奉献是永久放弃版权法下所有当前和未来权利的明确行为。

软件按“原样”提供,不提供任何形式的保证,无论是明示的还是暗示的,包括但不限于适销性、适用于特定目的和不侵犯版权的保证。在任何情况下,作者都不应对任何索赔、损害或其他责任负责,无论是由合同行为、侵权行为或其他行为引起的,无论是源于、出于还是与软件或使用或其它处理软件有关。

有关更多信息,请参阅http://unlicense.org/

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码分发

fabsync-1.2.0.tar.gz (31.2 kB 查看哈希值)

上传时间 源代码

构建分发

fabsync-1.2.0-py3-none-any.whl (18.4 kB 查看哈希值)

上传时间 Python 3

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面