如何无缝地重命名一个小兵?
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 仍然接受旧密钥,但不再有效。
我可以针对你的情况提出两种解决方案:
- 使用 salt-ssh 来配置你的 minions。 Master 将使用 SSH 连接到您的 Raspberry PI。它将设置正确的主机名,安装和配置 salt-minion。完成后,您的 minion 将使用正确的 ID 连接到 master。但这需要 Master 知道何时何地可以使用 minion...
- 您提到了设置主机名的状态。更改 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
我正在考虑转移到 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 仍然接受旧密钥,但不再有效。
我可以针对你的情况提出两种解决方案:
- 使用 salt-ssh 来配置你的 minions。 Master 将使用 SSH 连接到您的 Raspberry PI。它将设置正确的主机名,安装和配置 salt-minion。完成后,您的 minion 将使用正确的 ID 连接到 master。但这需要 Master 知道何时何地可以使用 minion...
- 您提到了设置主机名的状态。更改 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