DevOps na Pratica - Cap. 4 - Reconstruindo VM web

Estou no capitulo 4 e ao destruir as vms web2 e web e mandar reconstruir, a aplicação não esta subindo.

Fui olhar o log no tomcat e esta dando essas msgs de erro:

SEVERE: Error waiting for multi-thread deployment of WAR files to complete
java.lang.InterruptedException
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1000)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1304)
        at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:248)
        at java.util.concurrent.FutureTask.get(FutureTask.java:111)
        at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:751)
        at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:471)
        at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1453)
        at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:295)
        at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
        at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
        at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1379)
        at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1537)
        at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1547)
        at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1526)
        at java.lang.Thread.run(Thread.java:701)

WARNING: Failed to process JAR [jar:file:/var/lib/tomcat7/webapps/devopsnapratica/WEB-INF/lib/guava-r05.jar!/] for TLD files
java.util.zip.ZipException: error in opening zip file
at java.util.zip.ZipFile.open(Native Method)
at java.util.zip.ZipFile.(ZipFile.java:145)
at java.util.jar.JarFile.(JarFile.java:153)
at java.util.jar.JarFile.(JarFile.java:90)
at sun.net.www.protocol.jar.URLJarFile.(URLJarFile.java:90)
at sun.net.www.protocol.jar.URLJarFile.getJarFile(URLJarFile.java:66)
at sun.net.www.protocol.jar.JarFileFactory.get(JarFileFactory.java:86)
at sun.net.www.protocol.jar.JarURLConnection.connect(JarURLConnection.java:122)
at sun.net.www.protocol.jar.JarURLConnection.getJarFile(JarURLConnection.java:89)
at org.apache.tomcat.util.scan.FileUrlJar.(FileUrlJar.java:40)
at org.apache.tomcat.util.scan.JarFactory.newInstance(JarFactory.java:34)
at org.apache.catalina.startup.TldConfig.tldScanJar(TldConfig.java:460)
at org.apache.catalina.startup.TldConfig.access$100(TldConfig.java:58)
at org.apache.catalina.startup.TldConfig$TldJarScannerCallback.scan(TldConfig.java:276)
at org.apache.tomcat.util.scan.StandardJarScanner.process(StandardJarScanner.java:241)
at org.apache.tomcat.util.scan.StandardJarScanner.scan(StandardJarScanner.java:166)
at org.apache.catalina.startup.TldConfig.execute(TldConfig.java:250)
at org.apache.catalina.startup.TldConfig.lifecycleEvent(TldConfig.java:540)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5161)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:895)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:871)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:615)
at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:958)
at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1599)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
at java.util.concurrent.FutureTask.run(FutureTask.java:166)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:701)
Sep 10, 2016 12:54:17 PM org.apache.catalina.core.StandardContext startInternal
SEVERE: Error listenerStart

Sep 10, 2016 12:54:17 PM org.apache.catalina.core.StandardC> ontext startInternal

SEVERE: Context [/devopsnapratica] startup failed due to previous errors

Alguém sabe o que pode ser?

Oi Alberto,

Pela mensagem de erro, parece que o pacote war está com uma biblioteca corrompida (guava-r06.jar)

Isso pode acontecer por problemas de conectividade na hora de criar o pacote ou as vezes por falta de espaço em disco. Eu sugiro você limpar a aplicação do tomcat (logar na vm e remover o diretório /var/lib/tomcat7/webapps/devopsnapratica), gerar o war novamente e reprovisionar.

Nesse capítulo 4 a gente reusa o artefato devopsnapratica.war construido no capítulo 2 na vm web. Se você já destruiu, vai precisar refazer os passos do capítulo 2 e retomar da parte no capítulo 4 onde copiamos o war para a sua máquina host:

$ vagrant ssh web -- 'sudo cp \
> /var/lib/tomcat7/webapps/devopsnapratica.war \
> /vagrant/manifests/'

Abraços,
Danilo

Danilo,

Fiz o processo todo novamente e agora esta dando outro erro ao subir a aplicacao…

subir todo o log do tomcat para o pastebin.

http://pastebin.com/AKUAZ4Gv

Oi Alberto,

Agora parece ser mais um problema de configuração da conexão com o banco de dados. A VM db ainda está rodando? Se sim, pode mandar o conteúdo do arquivo /var/lib/tomcat7/conf/context.xml pra ver como está a configuração da conexão? Outra opção para verificar conexão é faze ssh na VM web e tentar dar um ping:

$ ping 192.168.33.10

Abraços,
Danilo

A VM db esta rodando sim…

conteudo do context.xml:

<?xml version='1.0' encoding='utf-8'?>
<!-- Default set of monitored resources -->
<WatchedResource>WEB-INF/web.xml</WatchedResource>

<!-- Uncomment this to disable session persistence across Tomcat restarts -->
<!--
<Manager pathname="" />
-->

<!-- Uncomment this to enable Comet connection tacking (provides events
     on session expiration as well as webapp lifecycle) -->
<!--
<Valve className="org.apache.catalina.valves.CometConnectionManagerValve" />
-->

O pingo funcionou normal…

Quer que coloque o web.pp?

Esse é o conteúdo do arquivo dentro da VM ou no template do puppet? Se for dentro da VM, o template não processou. Se for fora, pode mandar o conteúdo do arquivo dentro da VM depois de rodar o vagrant provision web?

Abs
Danilo

O que enviei antes, era o de fora…

Segue o de dentro da VM após rodar o provision.

<?xml version='1.0' encoding='utf-8'?>
<!-- Default set of monitored resources -->
<WatchedResource>WEB-INF/web.xml</WatchedResource>

<!-- Uncomment this to disable session persistence across Tomcat restarts -->
<!--
<Manager pathname="" />
-->

<!-- Uncomment this to enable Comet connection tacking (provides events
     on session expiration as well as webapp lifecycle) -->
<!--
<Valve className="org.apache.catalina.valves.CometConnectionManagerValve" />
-->

Oi Alberto,

Parece ok. O erro “no route to host” indica problema de rede/conectividade. O ping você tentou de dentro ou fora da VM? Tenta de dentro, pois é onde a aplicação tenta abrir a conexão com o banco de dados. Outro jeito de testar conectividade é tentando fazer telnet pra porta específica do MySQL (de dentro da VM web também):

$ telnet 192.168.33.10 3306

Se o ping e telnet funcionar, tentar fazer um redeploy, pois pode ter sido um problema temporário de conexão (ou tentou subir a VM web antes da VM db estar disponível).

Danilo

O ping foi de dentro da VM.
Vou testar o telnet, e depois o redeploy da aplicação…

Ola, alberto.
Uma boa seria verificar a existencia desta linha na conf do mysql

**root@db:/home/vagrant# cat /etc/mysql/conf.d/allow_external.cnf **
[mysqld]
bind-address = 0.0.0.0

Abçs

Obrigado pela ajuda Leandro, verifiquei aqui e o arquivo ja esta assim…

Agora o problema é de Access denied for user…

http://pastebin.com/kH3Mfc9e

Parece que o servidor db não está configurado corretamente. Não criou o banco/usuário para nossa aplicação.

No início do capítulo, criamos o manifesto para provisionar o servidor db. Sugiro rever e reprovisionar o servidor db antes de tentar usá-lo no servidor web. A configuração para abrir conectividade que o Leandro sugeriu é um dos passos no processo de provisionamento do servidor db.

Se o manifesto db.pp estiver ok, pode ser simplesmente rodar vagrant provision db.

Estranho, revisei todo o manifesto db e web e esta igual ao do livro.
Olhei na VM db:

vagrant@db:~$ mysql -u loja -p loja_schema -e "select database(), user()"
Enter password:
±------------±---------------+
| database() | user() |
±------------±---------------+
| loja_schema | loja@localhost |
±------------±---------------+

Na VM web, o ping funciona e o telnet tambem.
Uma duvida, quando o puppet instala o mysql, qual senha ele coloca para o root?

Oi Alberto,

De acordo com a documentação do módulo no forge, se você não especifica a criação do usuário root e a senha, ele não é criado:

https://forge.puppet.com/puppetlabs/mysql#root_password

Abs,
Danilo

Entedi.
Mais uma pergunta, para eu rodar o projeto que esta no seu github loja-virtual-devops-puppet o que preciso fazer?
Fiz o clone e deu um vagrant up db e deu erro…

Qual erro? O repositório contém a versão final do projeto, então tem coisas que você vai aprender nos capítulos mais pra frente. Provavelmente deve ser alguns plugins e comandos que você precisa rodar pra subir o projeto completo.

Boa noite Alberto,
Vc poderia me enviar seu arquivo db.pp e web.pp pra eu poder comparar ?

Leandro, segue abaixo os dois arquivos…

db.pp

exec { “apt-update”:
command => “/usr/bin/apt-get update”
}

package { “mysql-server”:
ensure => installed,
require => Exec[“apt-update”],
}

package { “vim”:
ensure => installed,
require => Exec[“apt-update”],
}

file { “/etc/mysql/conf.d/allow_external.cnf”:
owner => mysql,
group => mysql,
mode => 0644,
content => template("/vagrant/manifests/allow_ext.cnf"),
require => Package[“mysql-server”],
notify => Service[“mysql”],
}

service { “mysql”:
ensure => running,
enable => true,
hasstatus => true,
hasrestart => true,
require => Package[“mysql-server”],
}

exec { “loja-schema”:
unless => “mysql -uroot loja_schema”,
command => “mysqladmin -uroot create loja_schema”,
path => “/usr/bin/”,
require => Service[“mysql”],
}

exec { “remove-anonymous-user”:
command => “mysql -uroot -e “DELETE FROM mysql.user WHERE user=’’; FLUSH PRIVILEGES””,
onlyif => “mysql -u’ ’”,
path => “/usr/bin”,
require => Service[“mysql”],
}

exec { “loja-user”:
unless => “mysql -uloja -plojasecret loja_schema”,
command => “mysql -uroot -e “GRANT ALL PRIVILEGES ON loja_schema.* TO ‘loja’@’%’ IDENTIFIED BY ‘lojasecret’;””,
path => “/usr/bin/”,
require => Exec[“loja-schema”],
}

web.pp

exec { “apt-update”:
command => “/usr/bin/apt-get update”
}

package { [“mysql-client”, “tomcat7”, “vim”]:
ensure => installed,
require => Exec[“apt-update”],
}

file { “/var/lib/tomcat7/conf/.keystore”:
owner => root,
group => tomcat7,
mode => 0640,
source => “/vagrant/manifests/.keystore”,
require => Package[“tomcat7”],
notify => Service[“tomcat7”],
}

file { “/var/lib/tomcat7/conf/server.xml”:
owner => root,
group => tomcat7,
mode => 0644,
source => “/vagrant/manifests/server.xml”,
require => Package[“tomcat7”],
notify => Service[“tomcat7”],
}

file { “/etc/default/tomcat7”:
owner => root,
group => root,
mode => 0644,
source => “/vagrant/manifests/tomcat7”,
require => Package[“tomcat7”],
notify => Service[“tomcat7”],
}

service { “tomcat7”:
ensure => running,
enable => true,
hasstatus => true,
hasrestart => true,
require => Package[“tomcat7”],
}

$db_host = “192.168.33.10”
$db_schema = “loja_schema”
$db_user = “loja”
$db_password = “lojasecret”

file { “/var/lib/tomcat7/conf/context.xml”:
owner => root,
group => tomcat7,
mode => 0644,
content => template("/vagrant/manifests/context.xml"),
require => Package[“tomcat7”],
notify => Service[“tomcat7”],
}

file { “/var/lib/tomcat7/webapps/devopsnapratica.war”:
owner => tomcat7,
group => tomcat7,
mode => 0644,
source => “/vagrant/manifests/devopsnapratica.war”,
require => Package[“tomcat7”],
notify => Service[“tomcat7”],
}

Se alguém puder colocar os arquivos db.pp e web.pp para eu comparar aqui eu agradeceria muito.

Já reli e refiz esses arquivos várias vezes e não sei onde esta o erro.
há 2 semanas que estou parado nesse capitulo… ;/