Instalação e Configuração do Munin no Debian 7.0

Munin é uma ferramenta de monitoramento de rede recurso que pode ajudar a analisar as tendências de recursos e “O que aconteceu para matar nosso desempenho?” problemas. Ele é projetado para ser plug and play. Uma instalação padrão fornece uma série de gráficos com quase nenhum trabalho.

Origem do nome Munin:

Na mitologia nórdica, Huginn (do nórdico antigo “pensamento”) e Muninn (do nórdico antigo “memória” ou “mente”) são um par de corvos que voam por todo o mundo conhecido como Midgard, trazendo informações ao deus Odin. As informações sobre Huginn e Muninn são encontradas no Edda poética, compilação do século XIII de fontes mais antigas; no Edda em prosa e no Heimskringla, escritos no século XIII por Snorri Sturluson; no Terceiro Tratado Gramatical, compilado no século XIII por Óláfr Þórðarson; e na poesia dos escaldos. Por vezes seus nomes são modernamente anglicizados como Hugin e Munin.

O que vou utilizar:

  1. Servidor Munin
  2. IP: 192.168.1.30/24
  3. Nome: munin
  1. Cliente Munin
  2. IP: 192.168.1.31/24
  3. Nome: cliente

Prepare o seu sistema com o seguinte script para que não falte nenhum pacote ou configuração:

#############################################################################################################

Script para configuração Inicial do Debian Squeeze

Aqui somente precisamos obter o script, dar permissão e mandar executar

Dar permissão no script

chmod +x ConfInicialSqueeze.sh

Agora precisamos mandar executar ele

./ConfInicialSqueeze.sh -i
ConfInicialSqueeze.sh
#!/bin/sh
#-------------------------------------------------------------------------
# ConfInicialSqueeze
#
# Site	: http://www.*.com.br
# Autor : Douglas Q. dos Santos <[email protected]>
# Manutenção: Douglas Q. dos Santos <[email protected]>
#
#-------------------------------------------------------------------------
# Efetua a configuração de repositórios e a instalação de alguns pacotes,
# necessários.
#-------------------------------------------------------------------------
# Histórico:
#
# Versão 1:
# Data: 22/02/2011
# Descrição: Efetua a Configuracao do Debian GNU/Linux Squeeze
# configurando repositórios e instalando alguns pacotes
#
# Versão 2: 
# Data: 14/05/2011
# Descrição: Efetuado a validação da atualização dos repositórios,
# validacao da instalacao dos pacotes, e validacao do arquivo de backup
# Adicionadas as opcoes -V, --version, -h, --help, -i, -install, -l, --log
#--------------------------------------------------------------------------
#Licença: http://creativecommons.org/licenses/by-sa/3.0/legalcode
#
#--------------------------------------------------------------------------
#clear
INICIO=$(date)

# DEFINIÇÃO DAS CORES USADAS NO SCRIPT
GREY="\033[01;30m" RED="\033[01;31m" GREEN="\033[01;32m" YELLOW="\033[01;33m"
BLUE="\033[01;34m" PURPLE="\033[01;35m" CYAN="\033[01;36m" WHITE="\033[01;37m"
CLOSE="\033[m"

# VALIDANDO O USUARIO QUE ESTA EXECUTANDO O SCRIPT
USU=$(whoami)

if [ "${USU}" != root ]; then
  echo
  echo "${RED}###################################################################################"
  echo " ESTE PROGRAMA PRECISA SER EXECUTADO COM PERMISSOES DE SUPERUSUARIO!"
  echo " Abortando..."
  echo "####################################################################################${CLOSE}"
  echo
  exit 1
fi

# DECLARAÇÃO DA FUNÇÃO DE INSTALAÇÃO
INSTALL()
{
echo  "${RED}####################################################################${CLOSE}"
echo "${RED} Este script estara trabalhando com o seguinte processo ${GREEN} $$ ${CLOSE}   ${CLOSE}"
echo  "${RED}####################################################################${CLOSE}"
sleep 3

# COMANDOS UTILIZADOS NO SCRIPT 
CAT=$(which cat)
APTGET=$(which apt-get)
APTITUDE=$(which aptitude)
CAT=$(which cat)
CRONTAB=$(which crontab)
CP=$(which cp)
RM=$(which rm)
NTPDATE=$(which ntpdate)
REBOOT=$(which reboot)
TZCONFIG=$(which tzconfig)
WGET=$(which wget)
GPG=$(which gpg)
APT_KEY=$(which apt-key)
MKDIR=$(which mkdir)
SED=$(which sed)
LOCALE_GEN=$(which locale-gen)
CD="cd"
CHSH="/usr/bin/chsh"

# PACOTES A INSTALAR E A REMOVER
#PACOTES_A_REMOVER="dhcp3-client dhcp3-common nfs-common"
PACOTES_A_INSTALAR="vim vim-scripts ctags vim-doc zip unzip rar p7zip bzip2 less links telnet locate openssh-server sysv-rc-conf rsync build-essential libncurses5-dev ntpdate postfix cmake sudo git makepasswd"
FERRAMENTAS="atsar tcpstat ifstat dstat procinfo pciutils dmidecode htop nmap tcpdump usbutils strace ltrace hdparm sdparm iotop atop iotop iftop sntop powertop itop kerneltop dos2unix tofrodos chkconfig zsh"
#SEPRECISAR="mytop ptop dnstop vnstat"
# ARQUIVOS E DIRETÓRIOS USADOS PARA A GERAÇÃO DOS LOGS 
DIR_LOGS="/root/logs"
LOGS="${DIR_LOGS}/ConfInicialSqueeze"

### AJUSTANDO O APT ###
APT="/etc/apt"

# VALIDA SE JA EXISTE O ARQUIVO DE BACKUP DO sources.list
if [ -f ${APT}/sources.list.bkp ]; then
	echo "${GREEN}Digite um novo nome para o arquivo de backup do sources.list ou pressione ENTER${CLOSE}"
	read SOURCES
	APTBKP=${SOURCES}

        if [ -z ${SOURCES} ]; then
	APTBKP=sources.list.bkp
        fi
else
	echo "${RED}Vou fazer um backup do arquivo sources.list com o nome sources.list.bkp${CLOSE}"
	APTBKP=sources.list.bkp
fi

# EFETUANDO BACKUP DO ARQUIVO DE REPOSITORIOS
${CP} -Rf ${APT}/sources.list ${APT}/${APTBKP} 

# REFAZENDO O ARQUIVO COM OS REPOSITORIOS
${CAT} << EOF > $APT/sources.list
# DATA DA GERACAO DO NOVO ARQUIVO: $(date)
# REPOSITÓRIO OFICIAL 
deb http://ftp.br.debian.org/debian squeeze main contrib non-free
deb-src http://ftp.br.debian.org/debian squeeze main contrib non-free

# REPOSITÓRIO DE ATUALIZAÇÕES FREQUENTES
#deb http://volatile.debian.org/debian-volatile squeeze/volatile main contrib non-free
#deb-src http://volatile.debian.org/debian-volatile squeeze/volatile main contrib non-free

# REPOSITÓRIO DE ATUALIZAÇÕES DE SEGURANÇA 
deb http://security.debian.org/ squeeze/updates main contrib non-free
deb-src http://security.debian.org/ squeeze/updates main contrib non-free

# REPOSITÓRIO DE ATUALIZAÇÕES PROPOSTAS
deb http://ftp.br.debian.org/debian squeeze-proposed-updates main contrib non-free
deb-src http://ftp.br.debian.org/debian squeeze-proposed-updates main contrib non-free

#REPOSITORIO BACKPORT
#deb http://ftp.br.debian.org/debian-backports/ squeeze-backports main contrib non-free
#deb-src http://ftp.br.debian.org/debian-backports/ squeeze-backports main contrib non-free

# REPOSITÓRIO BACKPORT 
#deb http://www.backports.org/debian squeeze-backports main contrib non-free
#deb-src http://www.backports.org/debian squeeze-backports main contrib non-free

# PLUGINS MULTIMIDIA 
#deb http://ftp.br.debian.org/debian-multimedia/ squeeze main
#deb http://www.debian-multimedia.org squeeze main

# PHP5 BACKPORT 
#deb http://packages.dotdeb.org squeeze all
#deb-src http://packages.dotdeb.org squeeze all

# POSTFIX COM PATCH PARA COTAS. 
#deb http://debian.home-dn.net/squeeze postfix-vda/
#deb-src http://debian.home-dn.net/squeeze postfix-vda/
EOF

# ATUALIZANDO OS REPOSITÓRIOS
${APTITUDE} -y update || { echo "${RED} FALHA AO ATUALIZAR OS REPOSITORIOS ${CLOSE} "; exit 1; }

# ATUALIZANDO AS CHAVES DE REPOSITÓRIOS (KEYRINGS) 
${APTITUDE} -y install debian-archive-keyring || { echo "${RED} ERRO NO NOME DOS PACOTES"; exit 1; }
${GPG} --keyserver pgp.uni-mainz.de --recv-keys 1F41B907 || { echo "${RED} ERRO NA IMPORTAÇÃO DAS CHAVES ${CLOSE}"; exit 1; }
#${GPG} --keyserver pgpkeys.mit.edu --recv-keys 1F41B907 || { echo "${RED} ERRO NA IMPORTAÇÃO DAS CHAVES ${CLOSE}"; exit 1; }
${GPG} --keyserver pgp.uni-mainz.de --recv-key A2098A6E || { echo "${RED} ERRO NA IMPORTAÇÃO DAS CHAVES ${CLOSE}"; exit 1; }
#${GPG} --keyserver pgpkeys.mit.edu --recv-key A2098A6E || { echo "${RED} ERRO NA IMPORTAÇÃO DAS CHAVES ${CLOSE}"; exit 1; }
${APT_KEY} add ~root/.gnupg/pubring.gpg 

### MUDAR O DEBCONF PARA CRITICAL, PARA QUE NAO SEJAM FEITAS PERGUNTAS DESNECESSARIAS ###
export DEBIAN_PRIORITY=critical 
export DEBIAN_FRONTEND=noninteractive

# INSTALANDO PACOTES ALGUNS PACOTES 
${APTITUDE} install ${PACOTES_A_INSTALAR} -y
${APTITUDE} install ${FERRAMENTAS} -y

### VOLTANDO O DEBCONF AO SEU PADRAO ###
unset DEBIAN_PRIORITY
unset DEBIAN_FRONTEND

# ATUALIZANDO O SISTEMA 
${APTITUDE} -y dist-upgrade || { echo "${RED} ERRO NÃO FOI POSSÍVEL ATUALIZAR O SISTEMA ${CLOSE}"; exit 1; }

# HABILITA A syntax no vim
${WGET} -c http://www.douglas.wiki.br/Downloads/scripts/.vimrc -O /root/.vimrc

#CONVERTE O ARQUIVO PARA O FORMATO UNIX
DOS2UNIX=$(which dos2unix)
${DOS2UNIX} /root/.vimrc

# LIMPANDO O TERMINAL NO LOGOFF 
echo "clear" > .bash_logout

# AJUSTANDO O BASHRC
${CAT} << EOF > /root/.bashrc
#VARIAVEIS PARA O SHELL DO ROOT
alias ls='ls --color=auto'
alias ll='ls -l'
alias l='ls -lA'
alias df='df -Th'
alias grep='grep --color'
alias egrep='egrep --color'
export EDITOR=vim
export PS1='\[\033[01;31m\][\[\033[01;37m\]\t\[\033[01;31m\]] \[\033[01;32m\]\u\[\033[01;31m\]@\[\033[01;32m\]\h \[\033[01;31m\][\[\033[01;33m\]\w\[\033[01;31m\]] \[\033[01;37m\]# \[\033[00m\]'
EOF

# AJUSTANDO O BASHRC
${CAT} << EOF > /etc/skel/.bashrc
#VARIAVEIS PARA O SHELL DO ROOT
alias ls='ls --color=auto'
alias ll='ls -l'
alias l='ls -lA'
alias df='df -Th'
alias grep='grep --color'
alias egrep='egrep --color'
export EDITOR=vim
export PS1='\[\033[01;31m\][\[\033[01;37m\]\t\[\033[01;31m\]] \[\033[01;32m\]\u\[\033[01;31m\]@\[\033[01;32m\]\h \[\033[01;31m\][\[\033[01;33m\]\w\[\033[01;31m\]] \[\033[01;37m\]$ \[\033[00m\]'
EOF

${CP} /root/.bashrc /root/.bashrc.old

#ACERTANDO ERRO NA INICIALIZAÇÃO DA MAQUINA
echo "blacklist pcspkr" >> /etc/modprobe.d/blacklist.conf

#ACERTANDO A LOCALIZAÇÃO
${SED} -i "s/# pt_BR.UTF-8 UTF-8/pt_BR.UTF-8 UTF-8/g" /etc/locale.gen
${SED} -i "s/# pt_BR ISO-8859-1/pt_BR ISO-8859-1/g" /etc/locale.gen

${LOCALE_GEN}

${CP} /etc/default/locale /etc/default/locale.bkp

${CAT} << EOF > /etc/default/locale
LANG="pt_BR.UTF-8"
LANGUAGE="pt_BR:pt:en"
LC_CTYPE="pt_BR.UTF-8"
LC_NUMERIC="pt_BR.UTF-8"
LC_TIME="pt_BR.UTF-8"
LC_COLLATE="pt_BR.UTF-8"
LC_MONETARY="pt_BR.UTF-8"
LC_MESSAGES="pt_BR.UTF-8"
LC_PAPER="pt_BR.UTF-8"
LC_NAME="pt_BR.UTF-8"
LC_ADDRESS="pt_BR.UTF-8"
LC_TELEPHONE="pt_BR.UTF-8"
LC_MEASUREMENT="pt_BR.UTF-8"
LC_IDENTIFICATION="pt_BR.UTF-8"
LC_ALL=
EOF

# AJUSTANDO O CRONTAB 
CRON=/tmp/cron

# TAREFAS AGENDADAS NO CRON
${CAT} << EOF > ${CRON}
# Minuto Hora Dia Mês Dia_da_Semana Usuário Comando
#
# Minuto - Definição dos minutos da execução (0-59)
# Hora - Definição da hora da execução formato 24 horas (0-23)
# Dia - Definição do dia do mês da execução (1-31)
# Mês - Definição do mês da execução (1-12)
# Dia_da_semana - Dia da semana. (0-7; obs.: 0 e 7 referem-se ao domingo).
# Usuário - Definição do usuário responsável pela execução do comando.
# Comando - Comando que será executado conforme o tempo especificado.
# Ex: Agendar tarefa a cada 8 horas: * */8 * * * usuario /dir/tarefa
#
0 */8      *       *       *       /usr/bin/aptitude update
0 */6      *       *       *       /usr/sbin/ntpdate -u ntp.usp.br
0 */12     *       *       *       /usr/bin/updatedb
EOF

# REMOVE O CRONTAB
${CRONTAB} -r

# AGENDAR UM NOVO CRONTAB
${CRONTAB} ${CRON}

# ELIMINAR O ARQUIVO TEMPORARIO DO CRONTAB
${RM} -rf ${CRON}

#Baixando a ultima versão dos firmwares do kernel
GIT=$(which git)
${CD} /usr/src
${GIT} clone git://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git firmware
${CP} -Rfa firmware/* /lib/firmware/

#MUDANDO O SHELL DO ROOT
${CHSH} -s /bin/zsh
${WGET} -c www.douglas.wiki.br/Downloads/scripts/zshrc -O /root/.zshrc
${DOS2UNIX} /root/.zshrc
${CP} /root/.zshrc /etc/skel

# REMOVENDO PACOTES DESNECESSARIOS ###
#${APTGET} remove ${PACOTES_A_REMOVER} --purge -y

# VALIDA SE EXISTE O DIRETÓRIO DE LOGS
if test "${GERA_LOG}" = 1
then
	if [ ! -d ${DIR_LOGS} ]; then
		${MKDIR} -p  ${DIR_LOGS}
	fi

# GERAÇÃO O DO ARQUIVO DE LOG
echo 
echo "LOGS DA INSTALAÇÃO NA MAQUINA $(hostname -f)" >> ${LOGS}
echo "DATA E HORA DO IN͍CIO DA INSTALAÇÃO: ${INICIO}" >> ${LOGS}
echo "NOME DO ARQUIVO DE BACKUP DO APT: ${APTBKP}" >> ${LOGS}
echo "PACOTES QUE FORAM INSTALADOS ${PACOTES_A_INSTALAR}" >> ${LOGS}
echo "FERRAMENTAS QUE FORAM INSTALADAS ${FERRMENTAS}" >> ${LOGS}
echo "PACOTES QUE FORAM REMOVIDOS ${PACOTES_A_REMOVER}" >> ${LOGS} 
echo "DATA E HORA DO FINAL DA INSTALAÇÃO: $(date)" >> ${LOGS}
echo 

fi

# REINICIALIZAR A MAQUINA
${REBOOT}
}

GERA_LOG=0 #DEVE SER GERADO LOGS DAS OPERACOES
export GERA_LOG

MSG_USO="
Uso: $(basename "$0") [OPÇÕES]

OPÇÕES:
-i, --install	Efetua a instalação dos pacotes e a configuracão do sistema.
-l, --log	Efetua a geração de logs dos processos
-h, --help	Mostra esta tela de ajuda e sai
-V, --version	Mostra a versão do programa e sai

EX: ./$(basename "$0") -l -i Habilita a opção de geração de log e efetua a instalação
"

# TRATAMENTO DAS OPÇÕES DA LINHA DE COMANDO
if [ -z "$1" ]; then
echo "${RED} ${MSG_USO} ${CLOSE}"
exit 0
fi

# TRATAMENTO DAS OPÇÕES DE LINHA DE COMANDO
while test -n "$1"
do
case "$1" in
	-h | --help)
		echo "${RED}${MSG_USO}${CLOSE}"
		exit 0 #Programa terminou de forma normal
	;;

	-V | --version)
		echo -n $(basename "$0")
		#Extrai a versão diretamente dos cabeçalhos do programa
		VER=$(grep '^# Versão ' "$0" | tail -1 | cut -d ':' -f 1 | tr -d \#)
		echo "${GREEN} ${VER} ${CLOSE}"
		exit 0
	;;

	-l | --log)
		GERA_LOG=1
		export GERA_LOG
	;;	

	-i | --install)
		INSTALL
	;;

	*)
		if test -n "$1"
		then
		echo "Opção inválida: $1"
		exit 1 #Programa terminou de forma anormal por causa de um erro.
		fi
	;;
esac
#FILA $1 JA PROCESSADA, A FILA DEVE ANDAR
shift 
done

#############################################################################################################

Agora vamos mandar atualizar os repositórios e mandar fazer um upgrade do sistema nos servidores

aptitude update && aptitude dist-upgrade -y

Agora no servidor Munin vamos instalar o Apache que é por onde vamos visualizar os nossos relatórios e vamos instalar também o próprio munin

apt-get install apache2 munin munin-node munin-plugins-extra -y

Agora vamos ajustar a configuração do munin server vamos mudar o nome dele de localhost.localdomain para debian e vamos adicionar o cliente.

vim /etc/munin/munin.conf
[...]
#Agora vamos trocar o localhost.localdomain por debian igual abaixo
[munin]
     address 127.0.0.1
     use_node_name yes

#Agora vamos adicionar as linhas abaixo referente ao cliente
[client]
     address 192.168.1.31
     use_node_name yes

Agora vamos fazer o munin reconhecer todos os plugins que ele pode utilizar

Vamos acessar o diretório dos plugins do munin

cd /usr/share/munin/plugins

Agora vamos mandar rodar o script que reconhece os serviços que ele vai poder monitorar

munin-node-configure --suggest

Agora vamos fazer um ajuste no arquivo de configuração das interfaces de rede

sed -i '/$MUNIN_LIBDIR/{h;s/.*/MUNIN_LIBDIR=\/usr\/share\/munin/;p;x;}' /usr/share/munin/plugins/if_

Agora vamos mandar rodar o script que vai encontrar as interfaces de redes que vão ser monitoradas

./if_ suggest

Agora vamos fazer um ajuste no arquivo de configuração do apache

sed -i 's/Allow from localhost */#Allow from localhost /g' /etc/apache2/conf.d/munin
sed -i '/#Allow from/{h;s/.*/        Allow from all/;p;x;}' /etc/apache2/conf.d/munin

Agora vamos mandar reiniciar o apache e o munin

/etc/init.d/apache2 restart
/etc/init.d/munin-node restart

Configuração do Cliente

Agora vamos instalar os pacotes no cliente.

apt-get install munin munin-node munin-plugins-extra -y

Agora vamos adicionar o endereço ip do servidor para poder obter os dados do servidor

sed -i '/allow ^127\\./{p;s/.*/allow ^192\\.168\\.1\\.30$/;}' /etc/munin/munin-node.conf

Agora vamos fazer o munin reconhecer todos os plugins que ele pode utilizar

Vamos acessar o diretório dos plugins do munin

cd /usr/share/munin/plugins

Agora vamos mandar rodar o script que reconhece os serviços que ele vai poder monitorar

munin-node-configure --suggest

Agora vamos fazer um ajuste no arquivo de configuração das interfaces de rede

sed -i '/$MUNIN_LIBDIR/{h;s/.*/MUNIN_LIBDIR=\/usr\/share\/munin/;p;x;}' /usr/share/munin/plugins/if_

Agora vamos mandar rodar o script que vai encontrar as interfaces de redes que vão ser monitoradas

./if_ suggest

Agora vamos mandar reiniciar o munin

/etc/init.d/munin-node restart

Agora vamos mandar reiniciar o munin do servidor

/etc/init.d/munin-node restart

Agora já podemos acessar o munin em http://192.168.1.30/munin os relatório demoram em média uns 5 minutos para serem gerados os primeiros.

Configuração do VirtualHost

Agora em nosso servidor vamos configurar um virtualhost para o Munin

vim /etc/apache2/sites-available/munin
<VirtualHost *:80>
 ServerName munin.douglas.wiki.br
 ServerAlias monitor.douglas.wiki.br
 DocumentRoot "/var/cache/munin/www"

 #Controle de acesso ao munin
 <Directory "/var/cache/munin/www">
 Options -Indexes FollowSymLinks MultiViews
 AllowOverride All
 Order allow,deny
 allow from all

 #Autenticação do munin
 AuthUserFile /etc/munin/munin-htpasswd
 AuthName "Munin"
 AuthType Basic
 require valid-user
 </Directory>

 <IfModule mod_expires.c>
     ExpiresActive On
     ExpiresDefault M310
 </IfModule>

 #Configuração dos logs do apache
 ErrorLog ${APACHE_LOG_DIR}/munin.douglas.wiki.br-error.log
 CustomLog ${APACHE_LOG_DIR}/munin.douglas.wiki.br-access.log common

 #Retirando a assinatura do Apache
 ServerSignature Off

 IndexIgnore .??* *~ *# README RCS CVS *,v *,t *

 # Possible values include: debug, info, notice, info, error, crit,
 # alert, emerg.
 LogLevel info
</VirtualHost>

Agora vamos criar um usuário e uma senha para acesso ao munin, aqui eu vou criar o usuário chamado munin

htpasswd -s -c /etc/munin/munin-htpasswd munin
New password: 
Re-type new password: 
Adding password for user munin

Agora vamos remover os sites default do apache

a2dissite default
a2dissite default-ssl

Agora vamos ativar o virtualhost do munin

a2ensite munin

Agora vamos reiniciar o apache

/etc/init.d/apache2 restart

Agora é só acessar http://munin.viazap.wiki.br ou http://ip_servidor, aqui agora vamos precisar informar o usuário munin e a senha que foi definida com htpasswd -s -c

Agora para adicionar mais clientes precisamos somente adicionar no servidor uma nova entrada para o cliente e no cliente adicionar o ip do servidor como já fizemos acima e mandar reiniciar o munin do servidor e do cliente.

Rolar para cima