Apache Ant e JBoss 7
Configurando Um Ambiente WildFly 8 Profissional – Parte 2
Olá,
Na primeira parte nós instalamos e criamos todos os ambientes que vamos utilizar em nossa arquitetura. Durante os ultimos anos sempre faço um desenho do ambiente que quero configurar antes de iniciar. Isso me ajuda a visualizar melhor o objetivo. Veja abaixo o desenho do ambiente inicial:
Essa arquitetura é realmente um clássico da plataforma JBoss. Digo isso pois a maioria dos ambientes que vejo utilizam essa arquitetura variando apenas as camadas de segurança.
O Clinte HTTP ( Navagador ) acessa ( Faz um request ) a URL que está balanceada entre dois Apaches onde o Mod_Cluster decide utilizando uma métrica inteligente qual WildFly deverá atender ( Response ) a request, simples assim.
Vamos ao que interessa!
Configurando o Domain Controller
Os procedimentos abaixo devem ser executados somente no servidor server-domain-widfly. O primeiro passo é garantir que o WildFly realmente está sendo inicializado como domain. Edite o arquivo /etc/default/wildfly.conf removendo o comentário ( # ) e deixando as valores das variáveis como abaixo:
JBOSS_MODE=domain JBOSS_DOMAIN_CONFIG=domain.xml JBOSS_HOST_CONFIG=host-master.xml STARTUP_WAIT=30 SHUTDOWN_WAIT=30 JBOSS_CONSOLE_LOG=/var/log/wildfly/console.log
Salve o arquivo. Realize o login com o usuário wildfly e reinicie o serviço:
su wildfly sudo service wildfly restart
Observe o log em /var/log/wildfly/console.log e veja se realmente o processo host-controller foi iniciado:
[Host Controller] 18:03:38,805 INFO [org.jboss.as.remoting] (MSC service thread 1-2) JBAS017100: Listening on 127.0.0.1:9999 [Host Controller] 18:03:42,940 INFO [org.jboss.as] (Controller Boot Thread) JBAS015961: Http management interface listening on http://127.0.0.1:9990/management [Host Controller] 18:03:42,943 INFO [org.jboss.as] (Controller Boot Thread) JBAS015951: Admin console listening on http://127.0.0.1:9990 [Host Controller] 18:03:42,944 INFO [org.jboss.as] (Controller Boot Thread) JBAS015874: WildFly 8.0.0.Final "WildFly" (Host Controller) started in 7691ms - Started 44 of 44 services (11 services are lazy, passive or on-demand)
O arquivo host-master.xml já preparado para ser “master” domain controller do nosso ambiente. Vamos apenas alterar o nome para que seja mais fácil identifica-lo. Edite o arquivo /opt/wildfly/domain/configuration/host-master.xml e na linha:
<host name="master" xmlns="urn:jboss:domain:2.0">
Altere para:
<host name="server-domain-widfly" xmlns="urn:jboss:domain:2.0">
Agora edite o arquivo /opt/wildfly/bin/domain.conf e abaixo da linha:
JAVA_OPTS="$JAVA_OPTS -Djboss.modules.system.pkgs=$JBOSS_MODULES_SYSTEM_PKGS -Djava.awt.headless=true"
Adicione a seguinte configuração:
JAVA_OPTS="$JAVA_OPTS -Djboss.bind.address.management=162.243.172.56"
Reinicie o wildfly e observe novamente o log em /var/log/wildfly/console.log:
sudo service wildfly restart tailf /var/log/wildfly/console.log
Perceba que agora a interface de gerenciamento está “Listening” em 192.241.138.146:9999:
[Host Controller] 18:22:36,839 INFO [org.jboss.as.remoting] (MSC service thread 1-1) JBAS017100: Listening on 162.243.172.56:9999 [Host Controller] 18:22:40,178 INFO [org.jboss.as] (Controller Boot Thread) JBAS015961: Http management interface listening on http://162.243.172.56:9990/management [Host Controller] 18:22:40,181 INFO [org.jboss.as] (Controller Boot Thread) JBAS015951: Admin console listening on http://162.243.172.56:9990 [Host Controller] 18:22:40,182 INFO [org.jboss.as] (Controller Boot Thread) JBAS015874: WildFly 8.0.0.Final "WildFly" (Host Controller) started in 6104ms - Started 44 of 44 services (11 services are lazy, passive or on-demand)
Um passo muito importante ao configurar um ambiente WildFly é escolher quais tecnologias serão utilizadas. O WildFly 8 possui 4 profiles por padrão: “default”, “full”, “ha”, “full-ha” , mas nada impede de nós copiarmos qualquer um deles e renomeá-los conforme nossos requisitos. No Java EE 6 ( Agora Java EE 7 ) foi introduzido o conceito de Profiles, onde pode-se criar um subconjunto de tecnologias presentes na spec Java EE ou até mesmo adicionar novas definidas pela JCP (Java Community Process).
Nesse tutorial vamos utilizar o full-ha pois no futuro vamos configurar um Cluster.( ha = high availability e full = teóricamente todas as tecnologias Java EE 7 + implementações da Red Hat).
Pare o WildFly:
sudo service wildfly stop
Edite o arquivo /opt/wildfly/domain/configuration/domain.xml e busque pela tag <profile name=”full-ha”> e altere para:
<profile name="arquitetura-full-ha">
Depois de definir o profile o próximo é criar um Grupo de Servidores: Server Group. Um server group nada mais é que um agrupamento de instâncias WildFly. Nessa arquitetura vamos utilizar dois server group. Isso pode ser definido na tag <server-groups> no domain.xml do master (Domain Controller). Ainda no arquivo /opt/wildfly/domain/configuration/domain.xml remova a tag <server-groups> com seu conteúdo. Insira a configuração abaixo:
<server-groups> <server-group name="arquitetura-grupo-1" profile="arquitetura-full-ha"> <jvm name="default"> <heap size="512m" max-size="512m"/> <permgen max-size="256m"/> </jvm> <socket-binding-group ref="full-ha-sockets"/> </server-group> <server-group name="arquitetura-grupo-2" profile="arquitetura-full-ha"> <jvm name="default"> <heap size="512m" max-size="512m"/> <permgen max-size="256m"/> </jvm> <socket-binding-group ref="full-ha-sockets"/> </server-group> </server-groups>
Reinicie o WildFly e verifique se a configuração deu mesmo certo! Para isso basta verificar se o não existem erros no log em /var/log/wildfly/console.log:
[Host Controller] 18:55:59,776 INFO [org.jboss.as.remoting] (MSC service thread 1-2) JBAS017100: Listening on 162.243.172.56:9999 [Host Controller] 18:56:03,057 INFO [org.jboss.as] (Controller Boot Thread) JBAS015961: Http management interface listening on http://162.243.172.56:9990/management [Host Controller] 18:56:03,060 INFO [org.jboss.as] (Controller Boot Thread) JBAS015951: Admin console listening on http://162.243.172.56:9990 [Host Controller] 18:56:03,061 INFO [org.jboss.as] (Controller Boot Thread) JBAS015874: WildFly 8.0.0.Final "WildFly" (Host Controller) started in 6146ms - Started 44 of 44 services (11 services are lazy, passive or on-demand)
Um detalhe sobre a configuração do Server Group é a tag <socket-binding-group ref=”full-ha-sockets”/>, ele deve ser associado ao tipo de profile escolhido ou seja.. se escolher o profile ha, você deverá utilizar o socket-binding ha-sockets.
Crie um usuário para administrar o WildFly ( jbossdivers ) e o usuário que será utilizado no canal de comunicação entre o Domain Controller e Host Controller (jbossdivershost). Execute o script /opt/wildfly/bin/add-user.sh e siga as instruções como abaixo:
Obs: Vou utilizar o password “Wildfly*#2”
[wildfly@server-domain-widfly opt]$ sh /opt/wildfly/bin/add-user.sh What type of user do you wish to add? a) Management User (mgmt-users.properties) b) Application User (application-users.properties) (a): a Enter the details of the new user to add. Using realm 'ManagementRealm' as discovered from the existing property files. Username : jbossdivers Password recommendations are listed below. To modify these restrictions edit the add-user.properties configuration file. - The password should not be one of the following restricted values {root, admin, administrator} - The password should contain at least 8 characters, 1 alphanumeric character(s), 1 digit(s), 1 non-alphanumeric symbol(s) - The password should be different from the username Password : Re-enter Password : What groups do you want this user to belong to? (Please enter a comma separated list, or leave blank for none)[ ]: About to add user 'jbossdivers' for realm 'ManagementRealm' Is this correct yes/no? yes Added user 'jbossdivers' to file '/opt/wildfly-8.0.0.Final/standalone/configuration/mgmt-users.properties' Added user 'jbossdivers' to file '/opt/wildfly-8.0.0.Final/domain/configuration/mgmt-users.properties' Added user 'jbossdivers' with groups to file '/opt/wildfly-8.0.0.Final/standalone/configuration/mgmt-groups.properties' Added user 'jbossdivers' with groups to file '/opt/wildfly-8.0.0.Final/domain/configuration/mgmt-groups.properties' Is this new user going to be used for one AS process to connect to another AS process? e.g. for a slave host controller connecting to the master or for a Remoting connection for server to server EJB calls. yes/no? no
[wildfly@server-domain-widfly opt]$ sh /opt/wildfly/bin/add-user.sh What type of user do you wish to add? a) Management User (mgmt-users.properties) b) Application User (application-users.properties) (a): a Enter the details of the new user to add. Using realm 'ManagementRealm' as discovered from the existing property files. Username : jbossdivershost Password recommendations are listed below. To modify these restrictions edit the add-user.properties configuration file. - The password should not be one of the following restricted values {root, admin, administrator} - The password should contain at least 8 characters, 1 alphanumeric character(s), 1 digit(s), 1 non-alphanumeric symbol(s) - The password should be different from the username Password : Re-enter Password : What groups do you want this user to belong to? (Please enter a comma separated list, or leave blank for none)[ ]: About to add user 'jbossdivershost' for realm 'ManagementRealm' Is this correct yes/no? yes Added user 'jbossdivershost' to file '/opt/wildfly-8.0.0.Final/standalone/configuration/mgmt-users.properties' Added user 'jbossdivershost' to file '/opt/wildfly-8.0.0.Final/domain/configuration/mgmt-users.properties' Added user 'jbossdivershost' with groups to file '/opt/wildfly-8.0.0.Final/standalone/configuration/mgmt-groups.properties' Added user 'jbossdivershost' with groups to file '/opt/wildfly-8.0.0.Final/domain/configuration/mgmt-groups.properties' Is this new user going to be used for one AS process to connect to another AS process? e.g. for a slave host controller connecting to the master or for a Remoting connection for server to server EJB calls. yes/no? yes To represent the user add the following to the server-identities definition <secret value="V2lsZGZseSojMg==" />
No processo de criação do usuário jbossdivershost foi gerado um password com a tag <secret value=”V2lsZGZseSojMg==” />. Guarde pois utilizaremos essa tag na configurações dos Host Controllers.
Para finalizar por enquanto a configuração do Domain Controller, abra o navegador com a url: http://162.243.172.56:9990. A página de login será exibida e após a validação do usuário jbossdivers o painel de controle será exibido:
Configurando Os Hosts Controllers
Os procedimentos abaixo devem ser executados somente no servidor server-host1-widfly e server-host2-widfly. O primeiro passo é garantir que o WildFly realmente está sendo inicializado como domain. Edite o arquivo /etc/default/wildfly.conf removendo o comentário ( # ) e deixando as valores das variáveis como abaixo:
JBOSS_MODE=domain JBOSS_HOST_CONFIG=host-slave.xml STARTUP_WAIT=30 SHUTDOWN_WAIT=30 JBOSS_CONSOLE_LOG=/var/log/wildfly/console.log JBOSS_USER=wildfly
Salve o arquivo. Realize o login com o usuário wildfly e reinicie o serviço:
su wildfly sudo service wildfly restart
Observe o log em /var/log/wildfly/console.log e veja se realmente o processo host-controller foi iniciado:
[Host Controller] 20:26:22,325 INFO [org.jboss.as] (MSC service thread 1-1) JBAS015899: WildFly 8.0.0.Final "WildFly" starting [Host Controller] 20:26:23,226 ERROR [org.jboss.as.controller.management-operation] (Controller Boot Thread) JBAS014613: Operation ("write-remote-domain-controller") failed - address: ([("host" => "unknown-host.unknown-domain")]) - failure description: "JBAS014802: Cannot resolve expression 'expression \"${jboss.domain.master.address}\"' -- java.lang.IllegalStateException: Failed to resolve expression: ${jboss.domain.master.address}" [Host Controller] 20:26:23,230 FATAL [org.jboss.as.host.controller] (Controller Boot Thread) JBAS010933: Host Controller boot has failed in an unrecoverable manner; exiting. See previous messages for details. [Host Controller] 20:26:23,252 INFO [org.jboss.as] (MSC service thread 1-2) JBAS015950: WildFly 8.0.0.Final "WildFly" stopped in 8ms [Host Controller] 20:26:23,574 INFO [org.jboss.as.process.Host Controller.status] (reaper for Host Controller) JBAS012010: Process 'Host Controller' finished with an exit status of 99 20:26:23,576 INFO [org.jboss.as.process] (Thread-8) JBAS012016: Shutting down process controller 20:26:23,577 INFO [org.jboss.as.process] (Thread-8) JBAS012015: All processes finished; exiting 1598 [ OK ]
Perceba que o Host Controller não conseguiu resolver o endereço do Domain Controller (jboss.domain.master.address).
Para resolver esse problema edite o arquivo /opt/wildfly/bin/domain.conf e abaixo da linha:
JAVA_OPTS="$JAVA_OPTS -Djboss.modules.system.pkgs=$JBOSS_MODULES_SYSTEM_PKGS -Djava.awt.headless=true"
Adicione a seguinte configuração:
JAVA_OPTS="$JAVA_OPTS -Djboss.domain.master.address=162.243.172.56" JAVA_OPTS="$JAVA_OPTS -Djboss.bind.address=162.243.172.52"
Reinicie o wildfly e observe novamente o log em /var/log/wildfly/console.log:
sudo service wildfly restart tailf /var/log/wildfly/console.log
Um novo erro foi apresentado. A autenticação falhou por que nós ainda não configuramos essa parte:
[Host Controller] 22:05:30,678 ERROR [org.jboss.remoting.remote.connection] (Remoting "unknown-host.unknown-domain:MANAGEMENT" I/O-1) JBREM000200: Remote connection failed: javax.security.sasl.SaslException: Authentication failed: the server presented no authentication mechanisms [Host Controller] 22:05:30,688 WARN [org.jboss.as.host.controller] (Controller Boot Thread) JBAS016535: Could not connect to master. No domain controller discovery options left. Error was: java.lang.IllegalStateException: JBAS010942: Unable to connect due to authentication failure. [Host Controller] 22:05:30,690 ERROR [org.jboss.as.host.controller] (Controller Boot Thread) JBAS010901: Could not connect to master. Aborting. Error was: java.lang.IllegalStateException: JBAS016519: Tried all domain controller discovery option(s) but unable to connect [Host Controller] 22:05:30,729 INFO [org.jboss.as] (MSC service thread 1-2) JBAS015950: WildFly 8.0.0.Final "WildFly" stopped in 26ms [Host Controller] 22:05:31,053 INFO [org.jboss.as.process.Host Controller.status] (reaper for Host Controller) JBAS012010: Process 'Host Controller' finished with an exit status of 99 22:05:31,054 INFO [org.jboss.as.process] (Thread-8) JBAS012016: Shutting down process controller 22:05:31,055 INFO [org.jboss.as.process] (Thread-8) JBAS012015: All processes finished; exiting
Edite o arquivo /opt/wildfly/domain/configuration/host-slave.xml substitua a tag <secret value=”c2xhdmVfdXNlcl9wYXNzd29yZA==”/> pela tag <secret value=”V2lsZGZseSojMg==” /> gerada anteriormente na criação do usuário jbossdivershost.
<server-identities> <!-- Replace this with either a base64 password of your own, or use a vault with a vault expression --> <secret value="V2lsZGZseSojMg==" /> </server-identities>
Edite também o a tag <remote …/> e adicione o usuário jbossdivershost:
<domain-controller> <remote host="${jboss.domain.master.address}" username="jbossdivershost" port="${jboss.domain.master.port:9999}" security-realm="ManagementRealm"/> </domain-controller>
Crie as instâncias arquitetura-1 e arquitetura-2. Deixe a tag <servers> como abaixo:
<servers> <server name="arquitetura-1" group="arquitetura-grupo-1"/> <server name="arquitetura-2" group="arquitetura-grupo-2"> <socket-bindings port-offset="100"/> </server> </servers>
Adicione também o nome do Host Controller como abaixo:
<host name="server-host1-widfly" xmlns="urn:jboss:domain:2.0">
Finalmente as configurações estão finalizadas. Reinicie o wildfly.
sudo service wildfly restart
Observe novamente o log no servidor server-domain-widfly e veja o server-host1-widfly se conectando:
[Host Controller] 22:32:38,672 INFO [org.jboss.as.domain] (slave-request-threads - 1) JBAS010918: Registered remote slave host "server-host1-widfly", WildFly 8.0.0.Final "WildFly"
Abra novamente o navegador com a url: http://162.243.172.56:9990. A página de login será exibida e após a validação do usuário jbossdivers o painel de controle será exibido com a estrutura atual dos Hosts e Intâncias:
Conectando o Wildfly ao Apache Web Server
No Servidor server-domain-widfly edite o arquivo /opt/wildfly/domain/configuration/domain.xml. Busque pele profile <profile name=”arquitetura-full-ha”>. Dentro desse profile edite o Subsystem <subsystem xmlns=”urn:jboss:domain:modcluster:1.2″> deixando-o como abaixo:
<subsystem xmlns="urn:jboss:domain:modcluster:1.2"> <mod-cluster-config advertise-socket="modcluster" proxy-list="162.243.172.53:80,192.241.138.146:80" advertise="false" sticky-session="true" load-balancing-group="arquitetura" connector="ajp"> <dynamic-load-provider> <load-metric type="cpu"/> </dynamic-load-provider> </mod-cluster-config> </subsystem>
Observe que na tag proxy-list nós colocamos os dois Balancers / Apache Web Servers. Acesse o mod cluster manager para visualizar as instancias conectadas nos Balancers.
server-balancer1
server-balancer2
Apenas para garantirmos o funcionamente dos nossos Balancers. Faça o deploy da aplicação SystemProps no WildFly para o Server Group arquitetura-1.
No Console Web do Wildfly navegue até Manage Deployments e realize o deploy como abaixo:
Observe novamente o Mod Cluster Manager nos Balancers e perceba que a aplicação já está publica e habilitada para acesso:
Acesse a aplicação utilizando alguns dos Balancers. A aplicação exibirá algumas informações como abaixo:
Finalizamos assim a configuração inicial do ambiente. Nas proximas partes vamos instalar os agentes de monitoramento para o RHQ Server e configurar o Cluster no Wildfly. Vamos também criar a infra-estrtura para alta disponibilidade do Apache Web Server.
Abraços e até a proxima.
Automatizando Deploy com Apache Ant no JBoss AS 7.1.3 ( JBoss EAP 6.0.1 )
Olá amigos,
Acredito que todos nós que trabalhamos com desenvolvimento precisamos em algum momento deployar a aplicação em algum servidor para que outras pessoas tenham acesso e possam realizar os devidos testes. Hoje a tarde passei por uma dessas situações: Eu precisava pegar um pacote .war e realizar o deploy nas minhas instâncias na Amazon EC2. Então estava com o seguinte cenário:
Eu estava fazendo algo bem manual mesmo. Copiava o arquivo .war para o servidor remoto na Amazon e depois me conectava ao CLI remotamente utilizando o comando:
jboss-cli.bat --connect --controller=201.66.21.20:9999 --user=jboss--password=123456
Isso se tornou uma tarefa bem repetitiva pois toda as vezes eu não me lembrava do IP do JBoss e tinha também que entrar em um Path especifico para executar o JBoss CLI.
Então para facilitar um pouco o processo de deploys, undeploys e outras tarefas, eu decidi utilizar o Apache Ant. A instação do Ant é bem simples. Basta descompactar, criar a variável ANT_HOME apontando para o arquivo descompactado do ant e coloca-la no path.
Para verificar se está funcionado basta abrir o cmd e executar: ant. Se obtiver uma resposta similar a abaixo é por que está funcionando.
Um script de build do Ant consiste em um documento no formato XML e deve se chamar build.xml.
Vou supor que o ambiente JBoss já está funcionando com o usuário de gerenciamento criado e liberado para acesso remoto. Caso não esteja siga o tutorial Acessando o JBoss AS 7.1.2 (EAP 6) Remotamente Utilizando CLI.
Crie um scritpt build.xml e deixe-o como abaixo:
<?xml version="1.0"?> <project name="jboss" basedir="."> <presetdef name="jboss-cli"> <java jar="D:\Desenvolvimento\jboss-eap\jboss-eap-6.0.1\jboss-eap-6.0\jboss-modules.jar" fork="true" > <arg line="-mp D:\Desenvolvimento\jboss-eap\jboss-eap-6.0.1\jboss-eap-6.0\modules org.jboss.as.cli --connect --controller=192.168.0.127:9999 --user=jboss --password=123456" /> </java> </presetdef> <target name="deploy-project"> <jboss-cli failonerror="true"> <arg line="'deploy test.war'" /> </jboss-cli> </target> <target name="undeploy-project"> <jboss-cli failonerror="true"> <arg line="'undeploy test'" /> </jboss-cli> </target> </project>
Perceba que está meio bagunçado mas funciona perfeitamente. Para organizar um pouco, voçê pode criar alguns properties como o JBOSS_HOME e o nome da aplicação .war. Veja que é possível também executar qualquer comando CLI que seja necessário.
Veja nos meus testes o resultado:
Deploy
Undeploy
Esse é um dos jeitos mais simples de melhorar as práticas de deploy mas o ideal é utilizar um servidor de integração contínua como o Jenkins do qual vou falar nos proxímos posts. Eu vou mostrar como integrar Jenkins, GitHub e o JBoss AS 7 com toda a estrutura de desenvolvimento.
Por hoje é isso ai!
Grande Abraço
Mauricio Magnani Jr