Dicas, Linux

vpnc graphical client on KDE 4.x

Recently I needed to configure a VPN connection in my workstation to connect with our corporate Server. That server uses a Cisco VPN solution so the support for this kind of VPN in Linux systems is offered by the vpnc client package.

vpnc client supports only CLI control and configuration. To be able to configure your vpnc connections in a graphical environment (KDE, Gnome, etc) you need to install another package. In my case I had to install the following package:

sudo yum install -y kde-plasma-networkmanagement-vpnc.x86_64

I’m sharing this with you because that package is not present in the official distro repos neither in EPEL. I’m using RHEL 7. After some seaching on the Internet I could find that pkg in the alternative nux repository.

After install this pkg I was able to configure my VPN connection using the graphical NetworkManager KDE applet. See one screenshot:

kde-vpnc-networkmanager

Geral, Linux, RHEL, Tools, Virtualização

Integrando o Vagrant com libvirt/KVM no RHEL/CentOS 7

Primeiro o que é Vagrant?

Vagrant é uma ferramenta utilizada para criação e configuração de ambientes de trabalho (desenvolvimento, testes, homologação, produção etc) de forma configurável, reproduzível, portável, isolada  e automatizada. Humm… lembra um pouco algumas características do Docker, não?

Bom, em partes sim! Porém para um ambiente que utiliza virtualização tradicional. Docker e seu ecosistema tem avançado em uma velocidade absurda. Mas creio que ainda levará um tempo para o mercado corporativo começar a adotar Docker em larga escala em seus Data Centers privados. Virtualização tradicional tem vida longa ainda e, na minha opinião, irá coeexistir junto com iniciativas de Cloud baseadas em Containers.

Descrevendo de uma forma um pouco mais clara… Vagrant permite que você:

  • crie imagens (Boxes) baseadas em um Sistema Operacional qualquer
  • instale e configure pacotes/recursos utilizando uma ferramenta de automação (Provisioner) – também chamada de Configuration Management Tool. Vagrant suporta diversas dessas ferramentas: shell, chef, puppet, ansible.
  • provisione essa imagem em um hypervisor (Provider) específico: VirtualBox, VMWare, HyperV, KVM. Vagrant poder ser integrado inclusive com Cloud Providers como AWS, Digital Ocean etc.

Bom, Não vou me estender na descrição da ferramenta neste post. Para mais detalhes veja a Vagrant doc oficial.

Quando você lê o a documentação oficial do site, percebe que os providers oficialmente suportados e disponíveis Out of Box pelo Vagrant são: VirtualBox o Vmware.

Pô! Uso Linux e meu Hypervisor é o KVM! Como fazer com que o Vagrant utilize o KVM como provider?

Graças à API libvirt e o mecanismo de Vagrant plugins, existe um plugin que permite essa integração: vagrant-libvirt

Neste post descrevo os passos para instalar e configurar o Vagrant integrado com libvirt/KVM em um Host RHEL 7/Centos 7.redhat-logo

Infelizmente até o momento o Vagrant não está disponível no reposiório oficial da Red Hat. Entretanto ele está disponível no próprio site do projeto Vagrant, ná página Vagrant downloads.

Após baixar o RPM para seu host instale utilizando o yum.

sudo yum localinstall ~/Downloads/vagrant_1.7.4_x86_64.rpm

Confira a instalação

vagrant --version
Vagrant 1.7.4

Instale os seguintes pacotes necessários para plugin do provider (libvirt):

sudo yum install libxslt-devel libxml2-devel libvirt-devel libguestfs-tools-c

Em seguida instale o plugin do libvirt e o plugin nfs_guest.

vagrant plugin install vagrant-libvirt vagrant-nfs_guest

Installing the ‘vagrant-libvirt’ plugin. This can take a few minutes…
Installed the plugin ‘vagrant-libvirt (0.0.30)’!

Verifique a lista de plugins instalados:

vagrant plugin list

vagrant-kvm (0.1.9)
vagrant-libvirt (0.0.30)
vagrant-nfs_guest (0.1.5)
vagrant-share (1.1.4, system)

Ok! O próximo passo é começar a provisionar VMs. Na terminologia do Vagrant VMs são Boxes. Assim como o Docker hub, existe um repositório público de Boxes chamado Atlas Hashcorp. Basta buscar por um Box usando o nome do sistema operaciona ou o nome do provider. Ex: procure por imagens criadas para libvirt.

Vamos adicionar uma Box em meu host local. Eu escolhi uma imagem baseada no Centos 7 criada pelo usuário uvsmtid.

vagrant vagrant box add --insecure uvsmtid/centos-7.0-minimal
==> box: Loading metadata for box 'uvsmtid/centos-7.0-minimal'
box: URL: https://atlas.hashicorp.com/uvsmtid/centos-7.0-minimal
==> box: Adding box 'uvsmtid/centos-7.0-minimal' (v1.0.0) for provider: libvirt
box: Downloading: https://atlas.hashicorp.com/uvsmtid/boxes/centos-7.0-minimal/versions/1.0.0/providers/libvirt.box
==> box: Successfully added box 'uvsmtid/centos-7.0-minimal' (v1.0.0) for 'libvirt'!

Diferentemente de uma Docker Image os Vagrant Boxes são imagens de VMs tradicionais! Portanto são bem maiores. O download pode demorar um pouco. Aguarde!

Verifique as imagens adicionadas em seu host com o comando abaixo

vagrant box list
uvsmtid/centos-7.0-minimal (libvirt, 1.0.0)

Agora é necessário criar um descritor chamado VagrantFile. Esse cara é uma espécie de Dockerfile e através dele o Vagrant faz toda a sua mágica de provisionamento da VM.
Crie um diretório (como um projeto) para hospedar o descritor e os metadados para as suas Vagrant Boxes.

mkdir -p ~/vagrant/centos7-minimal
cd ~/vagrant/centos7-minimal

vagrant init uvsmtid/centos-7.0-minimal
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.

Veja que o Vagrant criou um descritor Vagrantfile no diretório atual e um diretório oculto (.vagrant) para armazenar metadados (arquivos criados durante a inicialização da).

➜  tree -a .
.
├── .vagrant
│   └── machines
│       └── default
│           └── libvirt
│               ├── created_networks
│               ├── creator_uid
│               ├── id
│               ├── index_uuid
│               └── private_key
└── Vagrantfile

Agora basta executar o comando:

vagrant up

Bringing machine 'default' up with 'libvirt' provider...
==> default: Creating image (snapshot of base box volume).
==> default: Creating domain with the following settings...
==> default:  -- Name:              centos7-minimal_default
==> default:  -- Domain type:       kvm
==> default:  -- Cpus:              1
==> default:  -- Memory:            512M
==> default:  -- Base box:          uvsmtid/centos-7.0-minimal
==> default:  -- Storage pool:      default
==> default:  -- Image:             /var/lib/libvirt/images/centos7-minimal_default.img
==> default:  -- Volume Cache:      default
==> default:  -- Kernel:
==> default:  -- Initrd:
==> default:  -- Graphics Type:     vnc
==> default:  -- Graphics Port:     5900
==> default:  -- Graphics IP:       127.0.0.1
==> default:  -- Graphics Password: Not defined
==> default:  -- Video Type:        cirrus
==> default:  -- Video VRAM:        9216
==> default:  -- Keymap:            en-us
==> default:  -- Command line :
==> default: Pruning invalid NFS exports. Administrator privileges will be required...
==> default: Creating shared folders metadata...
==> default: Starting domain.
==> default: Waiting for domain to get an IP address...
==> default: Waiting for SSH to become available...
    default:
    default: Vagrant insecure key detected. Vagrant will automatically replace
    default: this with a newly generated keypair for better security.
    default:
    default: Inserting generated public key within guest...
    default: Removing insecure key from the guest if it's present...
    default: Key inserted! Disconnecting and reconnecting using new SSH key...
==> default: Configuring and enabling network interfaces...
==> default: Rsyncing folder: /home/rsoares/vagrant/centos7-minimal/ => /vagrant

Voila!
Sua VM Centos7 UP and Running!

NOTA: na época da escrita desse post a última release do plugin vagrant-libvirt era a 0.0.30. Tem um bug nessa versão documentado em: https://github.com/pradels/vagrant-libvirt/issues/412. Nos comentários da issue tem um trecho de código (Ruby) que resolve o problema. Copie o trecho de código e altere o arquivo ‘ ~/.vagrant.d/gems/gems/vagrant-libvirt-0.0.30/lib/vagrant-libvirt/action/prepare_nfs_settings.rb. Salve o arquivo e execute o vagrant up novamente.

Para acessar a VM:

vagrant ssh

Para ver um status das VMs gerenciadas pelo Vagrant no host atual:

vagrant global-status
id       name    provider state   directory
------------------------------------------------------------------------
5b3e766  default libvirt running /home/rsoares/vagrant/centos7-minimal

The above shows information about all known Vagrant environments
on this machine. This data is cached and may not be completely
up-to-date. To interact with any of the machines, you can go to
that directory and run Vagrant, or you can use the ID directly
with Vagrant commands from any directory. For example:
"vagrant destroy 1a2b3c4d"

Para efetuar um shutdown na VM:

vagrant halt
==> default: Halting domain...

Para eliminar a VM:

vagrant destroy
==> default: Removing domain...

Pode destruir sem dó! A ideia do Vagrant é essa! Criar e recriar ambientes de forma rápida, automatizada sem stress!:-)

Bom, por hoje é só! Há muito mais para falar do Vagrant e suas funcionalidades. Em um próximo post quero abordar a questão da portabilidade entre os diferentes providers (Hypervisors). Tipo, como portar essa mesma imagem que foi provionada em cima do KVM (com o plugin libvirt) para o provider VMWare ou VirtualBox? É possível!


Referências utilizadas neste post:

Dicas, Docker, Linux

Comandos Docker: torne sua CLI mais fácil e ágil

Tips & Tricks SeriesApós trabalhar um tempo com Docker na linha de comando você percebe que alguns comandos são muito repetitivos e um tanto chatos. Apesar de o cliente de linha de comando do Docker ser extremamente poderoso, existe uma infinidade de parâmetros e combinações para se lembrar.

Em um ambiente Unix-like (*-Linux, Mac, etc) é possível tornar algumas tarefas repetitivas um pouco mais ágil e divertida. Veja como é possível definir algumas variantes dos comandos Docker mais comuns: docker run, docker psdocker images, docker inspect, docker exec, e assim por diante…

É possível definir novos comandos e expor em seu profile shell utilizando aliases e functions via Linux Shell. Veja alguns que defini em meu ~/.bash_profile (pode ser o ~/.bashrc também!):

NOTA: após editar e salvar o arquivo execute ‘source ~/.bash_profile’ para carregar as novas definições em sua shell.

Nas duas primeiras linhas defini dois alias:

  • di: listar as imagens em meu repositório local; e
  • dps: listar todos os containers criados

Em seguida defino algumas funções que utilizam sub-comandos e combinações de parâmetros um pouco mais elaborados:

  • dock-run <nome ou id da imagem>: cria um container utilizando a imagem informada
  • dock-exec <nome ou id do container>: executa o shel (/bin/sh) do container informado. Equivalente ao docker attach
  • dock-ip <nome ou id do container>: obtém o endereço ip do container
  • dock-rmc: remove todos os containers inativos (com status exited)
  • dock-rmi: remove todas as imagens com id ‘none

Espero que essa dica seja útil pra vocês também!

Compartilhe seus comandos também comentando abaixo😉

Containers, Dicas, Docker, Geral

Como me mantenho atualizado sobre a onda Containers, Docker e afins…

Olá!realcontainers

Neste post quero compartilhar algumas referências que venho utilizando para, não apenas aprender, mas principalmente me manter atualizado sobre o tópico Containers, Docker, Kubernetes (orquestração) e afins…

Como tudo tem um início, segue alguns links interessantes pra quem está començando no assunto. O site opensource.com é uma excelente fonte pois reúne o que há de mais relevante no mundo Open Source. Abaixo alguns artigos para conhecer Docker:

opensourceblog

 

O Site CenturyLink Labs também disponibiliza artigos exelentes escritos pelos principais especialistas no assunto.centurylink labs

Para quem está interessando em desenvolver aplicações nesse novo paradigma de Cloud e Containers sugiro seguir o Blog do Arun Gupta: http://blog.arungupta.me/

Arun Gupta weblog

Arun é um dos vários evangelistas Red Hat que escreve  sobre JavaEE, Docker, Containers, Microservices e demais soluções Red Hat JBoss Enterprise Middleware

Após conhecer esse novo mundo , sugiro assinar essas duas Newsletter

Alguns perfis que vale a pena seguir no Twitter_logo:

Para uma abordagem Corporativa do uso de Containers veja:

red hat containers

BPMS, Dicas, JBoss, Middleware

JBoss BPM Suite: Project Deployment Override

In this post I want to share a useful tip for those working with Red Hat JBosTips & Tricks Seriess BPM Suite 6.x (based on Drools jBPM 6.2). During development phase is normal to redeploy your project many times to view/test your changes.images_branding_product-logos_bpm-suite-19

As you already know the JBoss BPM Suite offers a rich and powerful Workbench that supports the full BPM life circle (from design to deployment) – Business Central (Kie Workbench).

In the business-central every time you try to do a build your project It also tries to deploy in the jBPM runtime. BPMS-6.2-BuildDeploy

At this time the jBPM Deployment Manager checks for any existing project artifact with the same Maven GAV coordinates (Group Artifact Version). The Maven GAV coordinate uniquely identifies each project artifact deployed and managed by the BPMS. So when you try to redeploy your project without change the project version before, your Build & Deploy will fail.

JBoss BPM Suite Travel Agency Demo
JBoss BPM Suite Travel Agency Demo: https://github.com/jbossdemocentral/bpms-travel-agency-demo

In the server.log you can see the following error entry:

16:46:21,464 ERROR [org.jbpm.console.ng.bd.backend.server.DeploymentManagerEntryPointImpl] (http-/127.0.0.1:8080-8) Deployment of unit org.specialtripsagency:specialtripsagencyproject:2.0.1 failed: unit already deployed! (override deployment: false): org.jbpm.console.ng.bd.exception.DeploymentException: unit already deployed! (override deployment: false)

You can workaround this going to Process Deployments (top Menu > Deploy in the Business Central) and undeploy  the Process artifact.

BPMS-6.3-Undeploy

But doing this every time you want to test a change is very boring and time consuming.

To avoid this you can pass a System Property to the BPMS during the startup to instruct it to accept artifacts redeployment using the same Maven GAV coordinates.

Start you BPMS server instance using the following system property

./standalone.sh -Dorg.kie.override.deploy.enabled=true

Note: This approach is documented in the official Product documentation – Administration Guide (item 2.4).

Now you can redeploy your process’ project without having to change the project version every time you want t test a change. See the server.log snippet below showing the deployment of my project after our change:

17:53:21,654 INFO [org.drools.compiler.kie.builder.impl.KieRepositoryImpl] (http-localhost/127.0.0.1:8080-3) KieModule was added: MemoryKieModule[releaseId=org.specialtripsagency:specialtripsagencyproject:2.0.1]
17:53:21,945 INFO [org.jbpm.kie.services.impl.store.DeploymentSynchronizer] (http-localhost/127.0.0.1:8080-3) Deployment unit org.specialtripsagency:specialtripsagencyproject:2.0.1 removed successfully
17:53:21,947 INFO [org.jbpm.console.ng.bd.backend.server.DeploymentManagerEntryPointImpl] (http-localhost/127.0.0.1:8080-3) Deploying unit org.specialtripsagency:specialtripsagencyproject:2.0.1
17:53:22,392 INFO [org.drools.compiler.kie.builder.impl.KieRepositoryImpl] (http-localhost/127.0.0.1:8080-3) KieModule was added: ZipKieModule[releaseId=org.specialtripsagency:specialtripsagencyproject:2.0.1,file=/home/rsoares/.m2/repository/org/specialtripsagency/specialtripsagencyproject/2.0.1/specialtripsagencyproject-2.0.1.jar]
17:53:22,785 INFO [org.jbpm.kie.services.impl.store.DeploymentSynchronizer] (http-localhost/127.0.0.1:8080-3) Deployment unit org.specialtripsagency:specialtripsagencyproject:2.0.1 stored successfully

I hope this little tip help your JBoss BPM Suite usage during process development.

Dicas

Dell DVD Store Sample Data Base: um Banco de Dados pronto para testes

Procurando por um Banco de Dados pronto para testes? Precisa de um modelo de dados relacional para implementar um laboratório, testar um novo framework, testar uma integração envolvendo acesso a banco de dados, provar um conceito ou algo do tipo? Quer fazer um benchmark do seu Banco de Dados para aplicar um Tuning específico? Data Base

Bom, eu precisei disso recentemente e, para poupar tempo resolvi “googlar” antes…

Eu poderia usar a criatividade e criar um modelo de domínio fictício para implementar um Banco de Dados na mão. Mas preferi usar um pronto e focar na ideia que estava querendo implementar.

Na Wiki do Postgres encontrei uma página que descreve e oferece várias opções de “Bancos de Dados de Exemplo”. Alguns com dados abertos de algumas agências governamentais e ONGs, outros para testes de performance (Benchmarks), outros com modelo de um determinado domínio de negócio. Os exemplos contemplam tabelas, relacionamento e integridade referencial , funções (Stored Procedures) e o melhor: dados pré carreados! \o/

Nessa Wiki encontrei uma referência para um Banco de Dados chamado “Dell DVD Store“. Trata-se de um Banco de Dados que implementa o modelo de domínio de uma loja de DVDs – básico né?! Bom, o que mais me interessa não é o modelo em si, mas a massa de dados. O Modelo do banco é composto por 8 tabelas e 6 funções (Stored Procedures).

O mais interessante deste exemplo é que ele é composto por um Kit que lhe permite gerar diferentes cargas de dados: small, medium e large. Veja a tabela abaixo com os tipos de carga disponível.

Database    Size     Customers             Orders   Products
Small      10 MB        20,000        1,000/month     10,000
Medium      1 GB     2,000,000      100,000/month    100,000
Large     100 GB   200,000,000   10,000,000/month  1,000,000

Com os scripts (Scripts Perl) disponíveis no Kit é possivel gerar uma massa de dados de 100GB. Excelente para testes de performance!

O Kit também oferece uma forma de gerar testes de carga simulando transações OLTP. E também oferece uma implementação de aplicação PHP e JSP para interagir com o Banco. Imagine a possibilidade dessa funcionalidade! Com isso você pode gerar uma carga real de transações e ao mesmo tempo testar o comportamento de sua aplicação neste cenário de carga na camada de dados…. Show né?!

Mais um detalhe importante: é possível gerar o Banco de Dados para diferentes SGBDs (Oracle, MS SQL Server, MySQL e Postgres).

Neste post descrevo os passos que executei para criar o Banco de Dados (tamanho small) em uma instalaçao do Postgres 9.4 que já possuia em uma VM rodando Red Hat Enterprise Linux 7. Caso queira explorar as demais opções do Kit, leia as instruções no arquivo ‘ds2/ds2.1_Documentation.txt

Acesse a página do exemplo (Dell DVD Store 2 Sample Database) e faça o download dos arquivos:

ds21.tar.gz
ds21_postgresql.tar.gz
readme.txt

Extraia os arquivos tgz e, um diretório temporário (ex: /tmp)

cd /tmp
tar -zxvf ds21.tar.gz
tar -zxvf ds21_postgresql.tar.gz

Para carregar criar o DB (small) no Postgres 9 abra o arquivo ‘/tmp/ds2/pgsqlds2/ds2_pgsql_readme.txt
e siga as instruções a partir do tópico ‘On PostgreSQL machine

sudo su - postgres

-bash-4.2$ createuser -d -l -P --interactive ds2
Enter password for new role: 'ds2'
Enter it again: 'ds2'
Shall the new role be a superuser? (y/n) y

Altere o arquivo ‘/var/lib/pgsql/9.4/data/pg_hba.conf‘ para permitir que usuários locais (do sistema operacional) possam se conectar ao postgres
Mude o valor da coluna ‘METHOD‘ de ‘ident‘ para ‘trust

vim /var/lib/pgsql/9.4/data/pg_hba.conf
# TYPE DATABASE USER ADDRESS METHOD

# "local" is for Unix domain socket connections only
local all all peer
# IPv4 local connections:
host all all 127.0.0.1/32 trust
# IPv6 local connections:
host all all ::1/128 trust

volte para o shell anterior e reinicie o serviço do Postgres

sudo systemctl stop postgresql-9.4.service
sudo systemctl start postgresql-9.4.service

teste a conexão com o banco

psql -h localhost -p 5432 -U ds2 -d postgres
psql (9.4.1)
Type "help" for help.

postgres=# \q

acesse o diretório ‘/tmp/ds2/pgsqlds2

Ctrl + D
cd /tmp/ds2/pgsqlds2

altere o script ‘pgsqlds2_create_all.sh’

onde está

'createlang plpgsql ds2'

altere por

'createlang plpgsql $CONNSTR -d $DBNAME -U $SYSDBA'

execute o Script shell para carregar os dados

bash pgsqlds2_create_all.sh

A seguinte saída deve aparecer na console

NOTICE: database "ds2" does not exist, skipping
DROP DATABASE
CREATE DATABASE
ERROR: role "ds2" already exists
ALTER ROLE
ERROR: relation "customers" does not exist
ERROR: relation "orders" does not exist
ERROR: relation "orderlines" does not exist
ERROR: relation "cust_hist" does not exist
...
CREATE TABLE
CREATE TABLE
CREATE TABLE
...
COPY 5010
COPY 4942
COPY 5010
COPY 5163
COPY 4992
COPY 4951
ALTER TABLE
ALTER TABLE
COPY 10000
ALTER TABLE
ALTER TABLE
COPY 10000
ALTER TABLE
CREATE INDEX
CREATE INDEX
CREATE INDEX
...
CREATE ROLE
GRANT
GRANT
GRANT
ANALYZE

O Banco de Dados ‘ds2‘ foi gerado com o seguinte Schema

DVD Store Release 2 Database Schema
-----------------------------------

Table Columns Number of Rows (Large database)
----- ------- -------------------------------

Customers CUSTOMERID 200 million
FIRSTNAME
LASTNAME
ADDRESS1
ADDRESS2
CITY
STATE
ZIP
COUNTRY
REGION
EMAIL
PHONE
CREDITCARDTYPE
CREDITCARD
CREDITCARDEXPIRATION
USERNAME
PASSWORD
AGE
INCOME
GENDER

Orders ORDERID 120 million
ORDERDATE
CUSTOMERID
NETAMOUNT
TAX
TOTALAMOUNT

Orderlines ORDERLINEID 600 million
ORDERID
PROD_ID
QUANTITY
ORDERDATE

Cust_Hist CUSTOMERID 600 million
ORDERID
PROD_ID

Products PROD_ID 1 million
CATEGORY
TITLE
ACTOR
PRICE
SPECIAL
COMMON_PROD_ID

Inventory PROD_ID 1 million
QUAN_IN_STOCK
SALES

Reorder PROD_ID variable
DATE_LOW
QUAN_LOW
DATE_REORDERED
QUAN_REORDERED
DATE_EXPECTED

Categories CATEGORY 16
CATEGORYNAME

Execute um o seguinte comando SQL para testar o Banco de Dados criado:

psql -h localhost -p 5432 -U ds2 -d ds2
ds2=# select count(*) from customers;
count
-------
20000
(1 row)

Após a criação e carga inicial a tabela ‘CUSTOMERS‘ possui 20 mil registros.

Por enquanto é isso.

Em um próximo post pretendo explorar os scripts de carga disponíveis no Kit.