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:
-
Servidor Munin
-
IP: 192.168.1.30/24
-
Nome: munin
-
Cliente Munin
-
IP: 192.168.1.31/24
-
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.