4个版本
0.1.3 | 2022年10月30日 |
---|---|
0.1.2 | 2022年10月30日 |
0.1.1 | 2022年10月30日 |
0.1.0 | 2022年10月29日 |
#645 in 配置
25KB
186 行
Shell Of A New Machine
soanm
是一个用于轻松配置新UNIX机器的简单工具,对目标机器几乎没有任何先决条件。它只需要 curl
。
目前它在 MacOS 和 Linux(包括 aarch64 和 x86_64)以及 x86_64 的 OpenBSD 上运行。这些都是我通常使用并且可以轻松构建的系统,但将其移植到新平台就像编译一个新的静态Rust二进制文件并将其添加到GitHub上的发行版一样简单。如果您希望支持新平台,请提交一个问题,我将很高兴帮助将其移植。
基本思想
当您在某些机器上安装新的操作系统时,无论它是服务器、笔记本电脑、台式机还是虚拟机,都需要费劲周折才能达到在机器上感到舒适的状态:您需要安装数十个工具,其中许多都需要配置。您需要设置Tailscale、SSH密钥和API密钥。
如果可以一次性、完全自定义地完成所有这些操作,那岂不是很好?现在您就可以做到了!
您需要两台计算机:一台“赞助者”,它具有为“注册者”提供配置所需资源的任何资源(“注册者”是另一台机器)。例如,如果您希望新机器能够访问GitHub,那么赞助者计算机应该有将SSH密钥添加到GitHub的能力。
为了配置 soanm
,您还希望有一个描述配置阶段的目录:它应该有一个名为 enroll
的子目录,其中包含将在注册者上运行的程序,一个名为 sponsor
的子目录,其中包含将在赞助者上运行的程序,以及一个名为 results
的子目录,其中将存储注册者的输出。在 sponsor
和 enroll
目录中必须具有相同数量的程序,并且所有这些都必须设置为可执行。
一旦您创建了此配置目录,就可以通过运行 soanm sponsor [conf_directory]
来开始配置过程。这将打印出您需要在注册者上运行的相应命令(此命令将包含用于安全连接计算机的秘密)。
程序将按文件名排序的顺序执行。对于每一对程序,首先运行sponsor
程序,并通过Magic Wormhole发送其输出。然后,将这个输出用作对应enroll
程序的输入。接着,将enroll
程序的输出发送回赞助商,并保存在results
目录中,供后续的sponsor
程序使用。
请注意,在赞助商机器上,配置程序的stdin从顶级程序继承,允许用户输入。在赞助商和报名机器上,stderr都会打印到相应的终端。
如何使用
赞助商机器需要一个相对较新的rust版本,以及一个包含sponsor
程序子目录、一个enroll
程序子目录和一个名为results
的空目录的目录。
cargo install soanm
soanm sponsor config_dir
这将打印出一个命令,该命令应在报名者机器上运行。
安全考虑
在假设的情况下,使用这个工具传递秘密应该是相对安全的。
显然,你必须相信这里提供的发布二进制文件不是恶意的。我以此信誉担保,我亲自从该存储库中的源代码构建了这些二进制文件,这些源代码(当然)不包含恶意代码。但如果你不信任我,或者你用于构建这些二进制文件依赖的树,你应该验证发布二进制文件看起来是安全的。这也需要信任GitHub忠实地为已上传的二进制文件提供服务,以及信任没有人未经授权访问我的GitHub账户。出于明显的原因,我努力保护我的GitHub账户,并保证我永远不会将此存储库的控制权交给其他人。
你还需要信任magic-wormhole
协议。我们使用默认的magic-wormhole rendezvous服务器(ws://relay.magic-wormhole.io:4000/v1
)来建立安全的点对点连接,通过该连接传输文件。我们默认使用128位的密码(16个单词)进行初始 rendezvous,尽管在赞助商命令行上可以配置。我们选择默认使用非常长的密码,因为我们希望将中间人攻击的概率降到极低,而且通常情况是从一个shell复制/粘贴密码到另一个shell。
为什么不直接使用[另一个工具]呢?
有许多工具可以用于完成这项任务的部分工作。其中最重要的是Nix。如果你只使用Linux、MacOS或也许FreeBSD,Nix可以完成你所需的一切:只需编写一个快速脚本,安装nix,获取你的nix配置,并将其实例化到你的配置文件中,然后你可以使用curl -L [myscript] | bash
来神奇地设置一切。但如果你使用任何其他平台,例如(比如说)OpenBSD,Nix目前不可行。
其他可能性
- 你可以编写一个脚本,使用SCP将你的文件和配置脚本发送到远程主机,然后运行它们。这会很好用,但需要你有SSH访问新主机,例如,在新笔记本电脑上通常不是默认情况。
- 您可以使用Ansible、Puppet或Terraform。但您需要在主机上安装这些工具,当然您还需要学习如何使用这些系统,这可能会很复杂。《soanm》不需要比shell脚本更复杂的东西,并允许您在确保它们在早期阶段正确安装的情况下,用任何您想要的编程语言编写代码。使用这些其他工具的大部分,您可能还需要额外的工具来管理您的机密信息,而使用《soanm》则可以从旧主机安全地将它们传输到新主机。
- 您可以使用点文件管理器,如《chezmoi》。这些通常不会为您安装包或运行任意代码。
如果您愿意,可以轻松地将《soanm》与这些其他方法结合起来。
完成这类任务可能有成千上万种方法。我没有找到我喜欢的方法,所以我自己编写了一个。也许您也会喜欢。
依赖项
~26–39MB
~735K SLoC