Configurando múltiplas instâncias do salt minion no mesmo sistema operacional
O salt minion precisa ser instalado em sistemas operacionais para que os mesmos sejam gerenciados pelo salt master e por padrão é 1:1, ou seja, um minion para um master. Esta configuração é extremamente simples, geralmente basta adicionar o endereço do master e definir o ID do minion, porém, em alguns casos, pode ser necessário que o mesmo minion converse com masters distintos e por este motivo se faz necessário a configuração de multiplas instâncias dentro do mesmo sistema operacional.
É importante frisar que, não é possível simplesmente adicionar todos os masters desejados no arquivo de configuração, pois isso seria no caso do seu ambiente de Salt Stack Config estar configurado em cluster, ou seja, vários masters atendendo os mesmos serviços. Isso até pode funcionar, mas provavelmente irá gerar problemas.
master: - salt-master1 - salt-master2
Sem mais delongas, vamos ver como criar instâncias do salt minion. Neste exemplo vou utillizar o Ubuntu 22.04. Então vamos começar instalando o salt-minion.
apt-get install salt-minion -y
Depois vamos garantir que esta máquina se comunique com o salt master configurando os valores id e master.
echo $HOSTNAME > /etc/salt/minion_id cat /etc/salt/minion_id echo "master: SEU-SALT-MASTER" > /etc/salt/minion cat /etc/salt/minion
Assim configuramos o salt minion para conversar com o salt master. Agora vamos configurar a segunda instância de salt minion que irá se comunicar com outro master. O diretório da nova instância fica em /etc/caverna-salt.
mkdir /etc/caverna-salt /var/log/caverna-salt /var/cache/caverna-salt cp -r /etc/salt/* /etc/caverna-salt/
Vamos completar as informações de conf_file, pki_file e ID no arquivo minion_id e as configurações de master, pki_dir, pidfile, conf_file, sock_dir e log_file no arquivo minion. Estas informações não precisaram ser informadas anteriormente porque era o diretório padrão, agora precisamos definir todas elas.
echo -e "id: "$HOSTNAME"-b\nconf_file: /etc/caverna-salt/minion\npki_dir: /etc/caverna-salt/pki/minion" > /etc/caverna-salt/minion_id cat /etc/caverna-salt/minion_id echo -e "master: SEU-OUTRO-SALT-MASTER\npki_dir: /etc/caverna-salt/pki/minion\npidfile: /var/run/caverna-salt.pid\nconf_file: /etc/caverna-salt/minion\ncachedir: /var/cache/salt/caverna-salt\nsock_dir: /var/run/salt/caverna-salt\nlog_file: /var/log/caverna-salt/minion\nlog_level: trace" > /etc/caverna-salt/minion cat /etc/caverna-salt/minion
Agora vamos criar o arquivo caverna-salt-minion em /etc/init.d.
### BEGIN INIT INFO
# Provides: caverna-salt-minion
# Required-Start: $remote_fs $network
# Required-Stop: $remote_fs $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: salt minion control daemon for caverna instance
# Description: This is a daemon that controls the salt minions
### END INIT INFO
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="salt minion caverna control daemon"
NAME=caverna-salt-minion
DAEMON=/usr/bin/salt-minion
DAEMON_ARGS="-c /etc/caverna-salt --log-file=/var/log/caverna-salt/minion -d"
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0
# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME
. /lib/lsb/init-functions
do_start() {
# Return
# 0 if daemon has been started
# 1 if daemon was already running
# 2 if daemon could not be started
pid=$(pidofproc -p $PIDFILE $DAEMON)
if [ -n "$pid" ] ; then
return 1
fi
start-stop-daemon --start --quiet --background --pidfile $PIDFILE --exec $DAEMON -- \
$DAEMON_ARGS \
|| return 2
}
do_stop() {
# Return
# 0 if daemon has been stopped
# 1 if daemon was already stopped
# 2 if daemon could not be stopped
# other if a failure occurred
start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
RETVAL="$?"
[ "$RETVAL" = 2 ] && return 2
rm -f $PIDFILE
return "$RETVAL"
}
case "$1" in
start)
[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
do_start
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
stop)
[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
do_stop
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
status)
status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
;;
#reload)
# not implemented
#;;
restart|force-reload)
log_daemon_msg "Restarting $DESC" "$NAME"
do_stop
case "$?" in
0|1)
do_start
case "$?" in
0) log_end_msg 0 ;;
1) log_end_msg 1 ;; # Old process is still running
*) log_end_msg 1 ;; # Failed to start
esac
;;
*)
# Failed to stop
log_end_msg 1
;;
esac
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
exit 3
;;
esac
exit 0
E por fim, basta configurar o novo serviço no systemd. Crie um arquivo chamado caverna-salt-minion.service em /etc/systemd/system.
[Unit] Description=The Caverna Salt Minion After=network.target salt-master.service [Service] KillMode=process Type=notify NotifyAccess=all LimitNOFILE=8192 ExecStart=/usr/bin/salt-minion -c /etc/caverna-salt
Agora é só iniciar os serviços. Se tudo foi configurado corretamente cada instância do salt minion irá se comunicar com um salt master distinto e ambas são independentes, ou seja, a configuração de uma não afetará a outra.
systemctl daemon-reload service salt-minion start service caverna-salt-minion start
Garanta que os serviços estão no ar e se precisar este é o caminho para validar os logs.
service salt-minion status service caverna-salt-minion status cat /var/log/salt/minion cat /var/log/caverna-salt/minion
É isso aí, pessoal. Até a próxima!