文档结构  
翻译进度:已翻译     翻译赏金:0 元 (?)    ¥ 我要打赏

orgalorg 

orgalorg 可以通过SSH并行的在多台主机上运行命令和上传文件。

特性

  • 零配置,不需要配置文件,所有的操作都是通过命令行参数来做的

  • 并行的在任意数量的主机上执行SSH命令或者是shell脚本。所有节点的输出都会返回,并且将原始的标准输出、标准错误输出映射到原始命令

  • 通过全局集群锁定,跨集群执行文件和目录同步。同步完成之后,可以对任意命令进行评估

  • 同步文件和目录之后,可以跨集群同步的执行多个复杂的步骤

  • 用户友好的进度条

  • 严格的和松散的故障转移模式确保无论发生什么,在出现错误的时候能够直接失败或者努力完成

  • 交互式的密码认证和SSH公钥认证

  • 使用sudo执行命令的能力

  • 组模式输出,因此来自节点的标准输出和标准错误输出可以按照节点名进行分组。另外,当节点返回内容的时候也可以尽快的返回

第 1 段(可获 2 积分)

安装

获取

go get github.com/reconquest/orgalorg

替代方案

  • ansible:旨在应用复杂的基于DSL的动作场景;
    orgalorg只针对运行命令和并行同步文件。 orgalorg可以接受stdin上的目标主机列表,并且可以提供来自命令行的实时输出,这是ansible不能做的(像运行tail -f)。 orgalorg也使用与ssh相同的参数语义:
    orgalorg ... -C tail -f '/var/log/*.log'做法的完全一样。

  • clusterssh / cssh:将打开所有节点的xterm终端数。
    orgalorg意图在批处理模式下使用,不假定GUI。 但是orgalorg可以以交互模式使用(见下面的实施例部分)。

  • pssh:buggy,使用二进制ssh,没有高效利用资源。
    orgalorg使用本机SSH协议实现,因此k可以安全快速地在上千个节点上使用。

  • dsh / gsh / pdsh: 不再维护。

第 2 段(可获 2 积分)

使用范例

-o <host>... 在后面的例子中将会介绍一些参数在一起的用法,比如
-o node1.example.com -o node2.example.com.

在主机上并行的执行命令

orgalorg -o <host>... -C uptime

在主机上执行标准输入中的命令

axfr is a tool of your choice for retrieving domain information from your infrastructure DNS.

axfr | grep phpnode | orgalorg -s -C uptime

使用root权限执行命令(需要无密码的sudo权限)

orgalorg -o <host>... -x -C whoami

实时从多主机查看最新的日志

orgalorg -o <host>... -C tail -f /var/log/syslog
第 3 段(可获 2 积分)

复制SSH公钥以进行远程身份验证

orgalorg -o <host>... -p -i ~/.ssh/id_rsa.pub -C tee -a ~/.ssh/authorized_keys

同步配置然后重新加载服务(如nginx)

orgalorg -o <host>... -xn 'systemctl reload nginx' -S /etc/nginx.conf

评估shell脚本

orgalorg -o <host>... -i script.bash -C bash

在所有节点上安装软件包,并从每个节点获取组合输出

orgalorg -o <host>... -lx -C pacman -Sy my-package --noconfirm

评估单行shell

orgalorg -o <host>... -C sleep '$(($RANDOM % 10))' '&&' echo done

运行简单交互式并行shell

第 4 段(可获 2 积分)
orgalorg -o <host>... -i /dev/stdin -C bash -s

获取全局群集锁

orgalorg -o <host>... -L

下一个orgalorg调用将失败并显示消息,该锁已被获取,直到第一个实例被停止。

用于将集群设置为维护状态。

获取自定义目录中的全局集群锁

orgalorg -o <host>... -L -r /etc

描述

orgalorg提供了容易的方式来跨集群同步文件并运行任意SSH命令。

orgalorg通过SSH和tar工作,因此不会出现意外的协议错误。

在默认操作模式下(最近称为同步模式)orgalorg将按以下顺序执行步骤:

第 5 段(可获 2 积分)
  1. 获取全局集群锁(查看上面更详细的信息)。
  2. 以流模式创建,上传和提取指定的文件到指定的节点到临时运行目录。
  3. 在每个节点上启动同步工具,应将文件从临时运行目录重新定位到目标目录。

所以,orgalorg希望与第三方同步工具一起工作,这将会实际执行文件重定位,并且可能会非常复杂,但是orgalorg可以在没有该工具的情况下工作,并执行简单的文件同步(稍后再说)。

全局集群锁

在做任何事情之前,orgalorg将执行全局集群锁。 该锁以原子方式获取,并且如果它被获取后,其他的orgalorg实例不能获取锁定。

第 6 段(可获 2 积分)

锁定是通过每个目标节点上flock指定的文件或目录进行的,如果至少有一个节点出现flock失败,则锁定失败。

目录可以作为锁定目标以及普通文件。 --lock-file 可用于指定不同于 / 的锁定目标。

获取锁定后,orgalorg将运行心跳过程,这将检查该锁仍然完整。 默认情况下,该检查将每10秒执行一次。 如果至少有一个心跳失败,则orgalorg将中止整个同步过程。

用户可以通过使用--lock或-L标志来停止,有效地将orgalorg转换为分布式锁工具。

第 7 段(可获 2 积分)

文件上传

文件将从本地节点发送到指定数量的节点。

orgalorg将执行流传输,因此可以安全地同步大文件,而无需大量内存消耗。

默认情况下,orgalorg将文件上传到临时运行目录。 可以使用--root或-r标志来更改该行为。 然后,文件将被上传到指定的目录。

用户可以指定-upload或-U标志来将orgalorg转换为简单的文件上传工具。 在这种模式下,orgalorg会将文件上传到指定的目录,然后退出。

orgalorg在转发时保留所有文件属性,以及用户和组ID。 可以使用--no-preserve-uid和--no-preseve-gid命令行选项来更改该行为。

第 8 段(可获 2 积分)

默认情况下,orgalorg将保留源文件路径,在目标节点上创建相同的目录布局。 例如,如果当前工作目录是/b/c/时告诉orgalorg上传文件a,orgalorg会将文件上传到远程节点上的<root>/b/c/a。 可以通过指定--relative或-e标志来更改该行为。然后,orgalorg将不会保留源文件的根目录。

orgalorg将尝试在指定的用户(默认为当前用户)下上传文件。 但是,如果用户在远程节点上的sudoers文件中具有NOPASSWD记录,则可以使用-sudo或-x在上传文件之前升级到root。 它使普通用户登录到远程节点并重写系统文件成为可能。

第 9 段(可获 2 积分)

同步工具

文件上传后orgalorg将执行同步工具(/usr/lib/orgalorg/sync)。 该工具预计将同步的文件从临时目录重定位到目标目录。 但是,该工具可以执行任意操作,如重新加载系统服务。

要指定自定义同步工具,用户可以使用--sync-cmd或-n标志。 该选项的参数支持全shell语法。

工具还可以使用sync协议(如下所述)与orgalorg进行通信,但不是必需的。 如果没有指定,orgalorg将使用stdin / stdout流与该工具进行通信。 用户可以使用--simple或-m标志来更改该行为,这将导致orgalorg将指定的同步工具视为简单的shell命令。 用户甚至可以通过使用--stdin或-i标志为该程序提供stdin。

第 10 段(可获 2 积分)

工具可以接受一些参数,可以使用-g或--arg标志指定。

同步协议

orgalorg将使用特殊同步协议与给定的同步工具进行通信,这样可以在整个集群中执行同步操作。

orgalorg将启动在命令行中指定的同步工具,无需任何修改。

开始之后,orgalorg将使用stdin和stdout流与正在运行的同步工具进行通信。 stderr将被原样传递给用户。

所有通信消息都应该由在orgalorg发送的hello消息中的特殊的前缀前缀。 stdout上不符合给定前缀的所有行将按原样打印。

第 11 段(可获 2 积分)

通信从hello消息开始。

协议

HELLO

orgalorg -> sync tool

<prefix> HELLO

开始通信会话。所有进一步的信息应该以给定的前缀前缀。

NODE

orgalorg -> sync tool

<prefix> NODE <node>

orgalorg会将节点列表发送到每个运行节点上的同步工具。

START

orgalorg -> sync tool

<prefix> START

开始消息将在节点列表的末尾发送,这意味着同步工具可以开始执行操作。

SYNC

sync tool -> orgalorg

<prefix> SYNC <description>

同步工具可以在完成一些步骤后发送同步消息,以确保集群中的每个节点按顺序逐步执行步骤。

第 12 段(可获 2 积分)

当orgalorg收到同步消息时,它将被广播到每个连接的同步工具。

SYNC (广播)

orgalorg -> sync tool

<prefix> SYNC <node> <description>

orgalorg将从一个节点向每个连接的节点(包括发送同步的节点)重新发送进入的同步消息。

同步工具可以等待特定数量的传入同步消息来继续执行下一步。

例子

<-是发出的消息(从orgalorg到sync tools).

<- ORGALORG:132464327653 HELLO
<- ORGALORG:132464327653 NODE [user@node1:22]
<- ORGALORG:132464327653 NODE [user@node2:1234]
<- ORGALORG:132464327653 START
-> (from node1) ORGALORG:132464327653 SYNC phase 1 completed
<- ORGALORG:132464327653 SYNC [user@node1:22] phase 1 completed
-> (from node2) ORGALORG:132464327653 SYNC phase 1 completed
<- ORGALORG:132464327653 SYNC [user@node2:1234] phase 1 completed
第 13 段(可获 2 积分)

测试

要运行测试下面这样就行了:

./run_tests

要求

测试用例通过 tests.sh 库运行。

对于每个测试用例,一组新的临时容器将通过 hastur初始化,因此运行测试套件需要systemd。

orgalorg测试用例尽可能接近现实,所以orgalorg将真正通过SSH连接到每个测试用例中的容器集群。

覆盖范围

运行以下命令来计算总覆盖率(运行testuite后可用):

make coverage.total

目前的覆盖率约为85%

第 14 段(可获 2 积分)

文章评论