Configurando múltiplas instâncias do salt minion no mesmo sistema operacional

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!

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *