#ansible #dotfiles #provision #configuration-management #key-pair #public-key

app setmeup

基于Ansible的简约远程配置工具

2个不稳定版本

0.3.0 2022年7月10日
0.2.0 2021年7月26日

#613 in 配置

AGPL-3.0-or-later

59KB
1K SLoC

设置!

设置!(SMU)是一个基于Ansible的配置服务器简单实现。其主要目标是尽量减少我们试图配置的客户端所需的要求。实际上,他们只需要一个SSH服务器和客户端。

想法是

  1. 客户端打开到配置服务器SMU的SSH连接。
  2. 该服务器会提示一些信息。
  3. 客户端将自动配置!

用法

在您要配置的客户端上,只需使用以下方式连接到SMU服务器

$ ssh -R 0:localhost:22 smu@smu-server
Allocated port 44561 for remote forward to localhost:22
Welcome to Set Me Up!

-R选项允许SMU进行反向隧道回您的系统进行配置。为了使其余部分正常工作,您将进入一个小向导

  1. 首先,您需要告诉SMU分配给反向隧道的端口号。在上面的例子中,这是44561。
  2. 然后,SMU将要求您提供在您的机器上要使用的用户名。根据您要配置的内容,您可能需要在此处提供一个sudoer。
  3. 最后,SMU将向您发送一个ECDSA密钥对的公钥。您需要确保此密钥对可以用于使用上述用户名登录到您的机器。通常,这意味着将公钥添加到该用户的~/.ssh/authorized_keys中。

完成此操作后,SMU将测试所有内容以确保它可以访问到您的系统。如果一切顺利,您将通过提示配置您的配置。这是您选择要在您的机器上运行的Ansible playbooks的地方。可用的playbooks取决于SMU服务器的配置。

请注意,在此处,设置!被配置为smu用户的shell,这使得命令更短。如果您的客户端已经在您的服务器上(并且具有SSH访问权限),还有其他选项。

基本服务器设置

让我们来安装和配置设置!

安装

设置!是用Rust编写的。下载、编译、测试和安装如下所示

$ git clone https://gitlab.com/julienjpk/setmeup
$ cd setmeup
$ cargo test
$ cargo build --release
$ sudo install -m 755 target/release/setmeup /usr/local/bin

设置客户端访问

您如何在您的服务器上设置SMU完全取决于您。如果您的客户端已经在您的服务器上(并且具有SSH访问权限),它们可以使用这些账户运行SMU

$ ssh -tR 0:localhost:22 bob@smu-server setmeup

在这种情况下,无需进一步设置客户端访问。

如果情况不是这样,您可以为您的客户端创建一个smu用户。

# useradd -md /var/lib/setmeup

然后,您可以像对其他用户一样授予smu用户访问权限(例如,在/var/lib/setmeup/.ssh/authorized_keyspasswd smu中)。

限制smu用户

如果您想强制smu用户只使用SMU,不在您的系统上运行其他任何东西,我建议将以下内容添加到您的SSH服务器配置中

# /etc/ssh/sshd_config

Match User smu
    ForceCommand /usr/local/bin/setmeup

之后请记得重新加载您的SSH配置

$ systemctl reload sshd

配置供应源和选项

Set Up!会在以下位置按顺序查找其配置文件

  1. 通过-c开关提供的路径
  2. SETMEUP_CONF环境变量。
  3. $XDG_CONFIG_DIR/setmeup/setmeup.yml,相对于客户端登录的用户。
  4. ~/.setmeup.yml,同样也是用户依赖的。
  5. /etc/setmeup/setmeup.yml
  6. /etc/setmeup.yml

选项1、3和4使得每个用户都可以拥有自己的SMU配置。请注意,根据规范,XDG_CONFIG_DIR默认为~/.config。它们还允许您在/var/lib/setmeup中配置SMU(如果之前选择了该选项)。选项2如果您想通过/etc/environment~/.pam_environment~/.ssh/environment来配置SMU,则很有用。其余的都是我认为合理的默认值。

配置文件本身是YAML

sources:
  some_local_source:
    path: "/etc/setmeup/playbooks"
    playbook_match: "^public/.+\.ya?ml$"

  some_git_repository:
    path: "~/some_git_repository"
    recurse: yes
    pre_provision: "git pull"
    ansible_playbook:
      path: "/usr/local/bin/ansible-playbook"
      env:
        - name: "ANSIBLE_CONFIG"
          value: "ansible.cfg"
        - name: "ANSIBLE_ROLES_PATH"
          value: "roles"

SMU在各个源的顶层目录中查找Ansible剧本(..ya?ml$),除非设置了recurse。如果需要,可以使用playbook_match设置来设置不同的REGEX。REGEX与源根目录的相对文件路径相匹配,这意味着您可以在子目录中进行匹配。您还可以使用ansible_playbook字典来自定义如何对每个源调用ansible-playbook。请注意,SMU始终从您的源根目录运行ansible-playbook。最后,可以将pre_provision参数设置为在供应客户端之前运行命令。如果您将源作为git仓库,并希望在查找剧本之前更新它,这非常有用。

关于

Set Up!是我想到的一个小项目,因为我总是无法在所有机器之间同步我的dotfiles。那里有很好的dotfiles管理选项,但我感觉像写点东西来利用Ansible的功能。它还使我能够快速设置一些基本的服务器应用程序,无论我在哪里都无法通过SSH直接访问。(可能还有许多优秀的Ansible供应服务器...

Set Up!是根据AGPL条款许可的。

依赖

~17-29MB
~480K SLoC