如何无缝地重命名一个小兵?

How to seamlessly rename a minion?

我正在考虑转移到 salt(目前使用 ansible)来管理一组独立的物联网设备(实际上是 Raspberry Pi)。

设备将安装一个通用映像,我将在上面添加 salt(客户端)的安装以及指向 salt-master 的配置文件,这是将提供状态文件供 minions 使用。

状态文件包括对名称的 HTTP 查询,然后将其应用于设备(​​作为其主机名)。明显的问题是,在那个阶段,minion 已经在以前的(通用)名称下注册了 salt-master

遇到这种情况怎么办?具体来说:如何将新主机名传播到 salt-master? (只是更改主机名并重新启动没有帮助,我假设主机名在服务器上与 minion 的 ID 捆绑在一起)。

更普遍的问题是 salt 是否适合这种情况(设置 minion 的状态会更改其名称等)

您的 Minion ID 基于安装期间的主机名。安装 salt-minion 后更改主机名时,Minion ID 不会更改。

Minion ID 在 /etc/salt/minion_id 中指定。 当您更改 Minion ID 时:

  • Minion 将使用新 ID 向 Master 标识自己并停止侦听旧 ID。
  • Master 会将新的 Minion Id 检测为新的 Minion 并在 Unaccepted Keys.
  • 中显示新的密钥
  • 接受Master的钥匙后,您将只能使用新钥匙使用Minion。 Master 仍然接受旧密钥,但不再有效。

我可以针对你的情况提出两种解决方案:

  1. 使用 salt-ssh 来配置你的 minions。 Master 将使用 SSH 连接到您的 Raspberry PI。它将设置正确的主机名,安装和配置 salt-minion。完成后,您的 minion 将使用正确的 ID 连接到 master。但这需要 Master 知道何时何地可以使用 minion...
  2. 您提到了设置主机名的状态。更改 Minion ID 并以相同状态重新启动 minion 服务。这将更改 Minion ID,但之后您需要接受新密钥。请注意,当您在其中重新启动 salt-minion 服务时,minion 永远不会报告状态已成功完成。

这是更改 hostname/minion_id 的简短脚本。它也应该适用于批处理作业。只需像这样调用脚本:sudo ./change-minion-id oldminionid newminionid

change-minion-id:

#! /bin/bash

echo ; salt "" cmd.run "echo > /etc/hostname && hostname  && hostname > /etc/salt/minion_id" && salt "" service.restart "salt-minion" && salt-key -d  -y && salt-key -a  -y

我的回答是直接抄袭用户 deput_d。我根据需要对其进行了一些修改。

甚至我的代码也会 return 一个 Minion did not return. [No response] (由于 salt-minion 重启)但是这个错误应该被忽略,就让它 运行 吧。我等待 40 秒只是为了确保 minion 已重新连接:

#!/bin/bash

echo "salt rename ->"; salt "" cmd.run "echo > /etc/hostname && hostname  && hostname > /etc/salt/minion_id" && salt "" cmd.run "/etc/init.d/salt-minion restart &" || true
salt-key -d  -y && echo "Will sleep for 40 seconds while minion reconnects" && sleep 40 && salt-key -a  -y