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!