Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to seamlessly rename a minion?

Tags:

salt-stack

I am considering to move to salt (currently using ansible) to manage a set of standalone IoT devices (Raspberry Pi in practical terms).

The devices would be installed with a generic image, to which I would add on top the installation of salt (client side) as well as a configuration file pointing to salt-master, which is going to serve state files to be consumed by the minions.

The state files include an HTTP query for a name, which is then applied to the device (as its hostname). The obvious problem is that at that stage the minion has already registered with salt-master under the previous (generic) name.

How to handle such a situation? Specifically: how to propagate the new hostname to salt-master? (just changing the hostname and rebooting did not help, I assume the hostname is bundled, on the server, with the ID of the minion).

The more general question would be whether salt is the right product for such a situatiuon (where setting the state of the minion changes its name, among others)

like image 951
WoJ Avatar asked Dec 05 '17 07:12

WoJ


2 Answers

Your Minion ID is based on the hostname during the installation. When you change the hostname after you installed the salt-minion, the Minion ID wil not change.

The Minion ID is specified in /etc/salt/minion_id. When you change the Minion ID:

  • The Minion will identify itself with the new ID to the Master and stops listening to the old ID.
  • The Master will detect the new Minion Id as a new Minion and it shows a new key in Unaccepted Keys.
  • After accepting the key on the Master you will be able to use the Minion with the new key only. The old key is still accepted on the Master but doesn't work anymore.

I can come up with two solutions for your situation:

  1. Use salt-ssh to provision your minions. The Master will connect to your Raspberry PI using SSH. It will setup the correct hostname, install and configure salt-minion. After this is finished, your minion will connect to the master with the correct ID. But this requires the Master to know when and where a minion is available...
  2. You mentioned the state where the hostname is set. Change the Minion ID and restart the minion service in the same state. This will change the Minion ID but you need to accept the new key afterwards. Note that the minion will never report a state as successfully finished when you restart the salt-minion service in it.
like image 132
Gijs Brandsma Avatar answered Oct 19 '22 11:10

Gijs Brandsma


Here is a short script to change the hostname/minion_id. It should also work well for batch jobs. Simply call the script like so: sudo ./change-minion-id oldminionid newminionid

change-minion-id:

#! /bin/bash

echo $2; salt "$1" cmd.run "echo $2> /etc/hostname && hostname $2 && hostname > /etc/salt/minion_id" && salt "$1" service.restart "salt-minion" && salt-key -d $1 -y && salt-key -a $2 -y
like image 32
deput_d Avatar answered Oct 19 '22 09:10

deput_d