Coder Social home page Coder Social logo

devopsnapratica's Introduction

Créditos para o livro DevOps Na Prática (Danilo Sato)

Esse README contém um compilado do livro com correções. Esse repositório não é suficiente para entender o conteúdo do livro.

Criando máquinas manualmente

$vagrant box add hashicorp/precise32

Build Vagrantfile and $vagrant up

Configurando DB

vagrant ssh db

$sudo apt-get update

$sudo apt-get install mysql-server (Choose password for db)

$sudo apt-get install vim

Copia allow_external.cnf para /etc/mysql/conf.d/allow_external.cnf

$sudo service mysql restart

Cria o banco loja_schema:

$mysqladmin -u root -p create loja_schema

$mysql -u root -p -e "SHOW DATABASES;"

Deleta a conta anônima do MYSQL

$mysql -u root -p -e "DELETE FROM mysql.user WHERE user=''; FLUSH PRIVILEGES"

Cria conta para manipulação do banco

$mysql -u root -p -e "CREATE USER 'loja'@'localhost'"

$mysql -u root -p -e "GRANT ALL PRIVILEGES ON loja_schema.* TO 'loja'@'localhost'"

$mysql -u loja -p loja_schema -e "select database(), user()"

Configurando servidor WEB

vagrant ssh web

$sudo apt-get update

$sudo apt-get install tomcat7 mysql-client

Acesse 192.168.33.12:8080 e veja se está tudo funcionando

Configurar certificado SSL:

$ cd /var/lib/tomcat7/conf

$sudo keytool -genkey -alias tomcat -keyalg RSA -keystore .keystore

Copia tomcat.xml para /var/lib/tomcat7/conf/server.xml

Copy tomcat7 to /etc/default/tomcat7

Reinicie o Tomcat 7

$sudo service tomcat7 restart

Acesse https://192.168.33.12:8443 e veja se está tudo funcionando

Fazendo build e deploy

Na mesma máquina do Web.

vagrant ssh web

$sudo apt-get install git maven2 efault-jdk

Copie o código e realizar o build:

$git clone https://github.com/dtsato/loja-virtual-devops.git

$cd loja-virtual-devops

$export MAVEN_OPTS=-Xmx256m

$mvn install

É necessário configurar o bind da aplicação com o banco. Copie context.xml para /var/lib/tomcat7/conf/context.xml.

Faça o deploy copiando o artefato para o tomcat

$cd loja-virtual-devops

$sudo cp combined/target/devopsnapratica.war /var/lib/tomcat7/webapps

Veja o log do deploy

$tail -f /var/lib/tomcat7/logs/catalina.out

Acesse a aplicação http://192.168.33.12:8080/devopsnapratica/ e a página de admin http://192.168.33.12:8080/devopsnapratica/admin/

Configurando servidor de monitoração

Atualize a base de dados para obter versões mais atualizadas do Nagios:

$ echo "Package: nagios* > PIN: release n=raring > Pin-priority: 990" | sudo tee /etc/apt/preferences.d/nagios
$ echo "deb http://archive.ubuntu.com/ubuntu > raring main" | sudo tee /etc/apt/sources.list.d/raring.list
$ sudo apt-get update

Instale o nagios

$ sudo apt-get install nagios3 

Ele vai instalar o POSTFIX, um serviço de e-mail para isso vai pedir para que você selecione algumas opções. Neste momento, escolha Internet Site e depois monitor.lojavirtualdevops.com.br

Tente acessar o servidor com http://nagiosadmin:\@192.168.33.14/nagios3 com o usuário nagiosadmin e sua senha.

Configure o monitoramento do servidor web e do banco de dados copiando a configuração:

$ sudo cp /vagrant/loja_virtual.cfg /etc/nagios3/conf.d

$ sudo service nagios3 reload

Com esse arquivo criamos um hostgroup chamado DB-SERVERS e WEB-SERVERS e adicionamos nossos servidores. Também adicionamos a eles o hostgroup SSH (checagens do serviço) e o Debian (coloca o logotipo e identifica nossos servidores).

Tem como checar os serviços de forma manual através da execução de scripts. Em /usr/lib/nagios/plugins:

$ ./check_ssh 192.168.33.12 - SSH OK - OpenSSH_5.9p1 Debian-5ubuntu1 (protocol 2.0)*

$ ./check_ssh 192.168.33.11 - No route to host

Também existem outros scripts que podem ser executados:

$ ./check_http -H 192.168.33.12 -p 8080

$ ./check_disk -H 192.168.33.12 -w 10% -c 5%

Podemos extender esses comands ao criar diretivas no arquivo cfg.

Alarmes

O nagios pode disparar alarmes caso alguma checagem falhe. Esses alarmes podem ser por e-mail como observado em /etc/nagios3/commands.cfg. Também podemos definir a perioticidade dos alarmes em /etc/nagios3/conf.d/timeperiods_nagios2.cfg e os contatos que irão receber notificações em /etc/nagios3/conf.d/contacts_nagios2.cfg. Vamos editar informações de contato para que você receba um e-mail. Vá no último arquivo e troque root@localhost pelo seu endereço de e-mail.

Pode-se observar no menu de serviços que todos os monitoramentos estão OK. Vamos agora destruir o servidor de banco de dados e dar início a automação da infraestrutura:

$ vagrant destroy db

Criando máquinas automaticamente

Banco de Dados

Deploy se refere a instalação e configuração de aplicação. Diferente de shell script, ferramentas de deploy automatizado possuem idenpotência. Não importa quanto vezes forem executados, eles só mudarão o necessário. Você declara o estado final do seu sistema e a ferramenta buscará esse estado.

Puppet básico

Puppet utiliza um conjunto de instruções chamado manifesto. Vamos criar a máquina db com Puppet.

$ vagrant up db
$ vagrant ssh db

Se executar sudo puppet apply db.pp o pacote mysql-server vai ser instalado. O pacote é instalado de acordo com o provider indicado. Se executar:

$ sudo puppet describe package

Vai mostrar os detalhes da diretiva package, bem como seus providers (yum, apt e etc).

Agora vamos colocar o puppet no Vagrant. Crie um diretório manifests no mesmo lugar aonde está seu Vagrantfile. Vamos editar o arquivo para colocar o arquivo /etc/mysql/conf.d/allow_external.cnf. O puppet só altera o arquivo se ele for modificado de acordo com o MD5.

Usando templates

Ao invés de adicionarmos uma linha a um arquivo podemos usar um template que é copiado para a máquina que está sendo provisionada.

Também adicionamos uma diretiva Service que faz com que o serviço enteja sempre rodando (ensure), que esteja habilitado ao iniciar a máquina (enable), que consiga entender o comando restart e status do próprio service (hasstatus, hasrestart). Ele também tem uma dependência com o pacote do mysql como mostrado com a diretiva require.

A diretiva notify faz com que toda vez que o arquivo seja alterado, o serviço reinicie.

A diretiva unless especifica que, caso o comando seja executado com sucesso, o comando principal não irá executar.

A diretiva onlyif especifica que, caso o comando seja executado com sucesso, o comando principal irá executar.

Ambos os comandos onlyif e unless garantem a idempotência da diretiva command

Web

Usando templates com variáveis

Vamos criar uma máquina web2 e fazer o deploy nela primeiramente. Adicionamos umas linhas no Vagrant file e o arquivo web.pp. Ele vai instalar os pacotes e copiar alguns arquivos do tomcat7 necessários.

Variáveis no puppet são declaradas com cifrão: $variavel

Você pode declarar variáveis e atribuir um valor a elas no manifesto. Elas podem ser colocadas em um arquivo template ERB e quando o puppet processar, vai substituir a variável no arquivo pelo valor declarado no manifesto. Você deve colocá-las no arquivo da seguinte forma: <%= var %>

Não esqueça de colocar a função template no arquivo ao qual vc quer carregar as variáveis.

Refatorando código Puppet

Usando classes

Classes, no Puppet, são um conjunto de recursos. Não é o mesmo que classes em programação.

Para declarar classe use:

class <nome> {}

Dentro de uma classe devemos ter recursos que são executados somente uma vez e não podem ser reaproveitados.

Para usar a classe vc deve utilizar:

include <nome da classe> ou class ( "nome da classe>": ... )

Usando tipos definidos

Tipos definidos é uma coleção de recursos que pode ser usada várias vezes em um mesmo manifesto. Ele evita duplicação de código e pode ser parametrizado.

define <nome do tipo> ($var1, $var2 = $title, $var4...) {}

Perceba que title é o título. Chamamos o tipo definido da seguinte forma....

$nome-do-tipo { "<título da instância>":
	var2   => "loja_schema",
	var4 => "lojasecret",
}

Módulos

Você pode organizar seu código puppet em módulos. Módulos possuem uma estrutura predefinida de diretórios e nomenclaturas. Módulos são compartilhados pela comunidade em http://forge.puppetlabs.com. A estrutura é:

$<nome do módulo>/
	files
		...
	manifests
		init.pp
	templates
		...
	tests
		init.pp

Você deve colocar seus manifestos dentro da pasta manifests. O arquivo init.pp serve como ponto de entrada para o módulo.

O diretório files possuem arquivos de configuração estáticos e você pode acessá-los pela seguinte URL puppet:///modules/<nome do módulo>/<arquivo>.

O diretório templates contém arquivos que podem ser utilizados dentro do manifesto da seguinte forma: template('<nome do módulo>/<arquivo ERB>'). Agora você não precisa mais referenciar o arquivo pelo caminho absoluto.

O diretório tests contém exemplos mostrando como utilizar as classes e tipos definidos pelo módulo. Esses testes não fazem nenhum tipo de verificação automatizada. Você roda os testes com puppet apply --noop e elas fazem simulações em cima do seu código.

No arquivo init.pp do manifests precisamos declarar uma classe como namespace:

$ class <nome> {}

Exemplo:

$ class mysql {}

Agora vamos referenciar o namespace quando declaramos as classes em outros manifestos como por exemplo no arquivo server.pp:

$ class mysql::server {...}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.