DevSecOps

22 out, 2015

Meu primeiro plugin para o Vagrant, o vagrant-ip-show, mostra a lista de IPs da VM

100 visualizações
Publicidade

Olá, pessoal!

Passando rápido aqui para falar que criei meu primeiro plugin para Vagrant: é o vagrant-ip-show.

Ele faz uma coisa muito simples: mostra os IPs de uma VM.

Vagrant-ip-show_by_rogeriopradoj

Ah, Rogério, mas porque um plugin para algo tão simples? Não tem jeito de fazer isso a mão?

— Alguém por aí…

Então, tem uma série de formas de buscar essa informação. Você poderia conectar na VM (vagrant ssh) e rodar um comando if config. Ou então, olhar no seu Vagrantfile as configurações de rede que tiver feito. Ou ainda, entrar na configuração do Virtualbox (ou qual seja o provider que estiver usando) e tentar localizar a faixa de IPs que ele está usando e partir daí para rodar no seu host alguns comandos de rede…

Caramba, quanta coisa! Mas se tem um jeito fácil, porque não usar?! Fui atrás de uma linha mágica, já tratada para trazer apenas a listinha de IPs; e ela é essa:

$ ifconfig | grep 'inet addr:' | grep -v 127.0.0.1 | sed -e 's/Bcast//' | cut -d: -f2

No seu computador, você poderia passar via vagrant ssh o comando direto para dentro da VM e receber o resultado assim:

$ vagrant ssh -- ifconfig | grep 'inet addr:' | grep -v 127.0.0.1 | sed -e 's/Bcast//' | cut -d: -f2

Mas o jeito mais fácil, depois que o plugin está instalado, é só rodar esse comando aqui:

$ vagrant ip-show

Quer instalar o plugin? É fácil:

$ vagrant plugin install vagrant-ip-show

Depois disso, você pode usar o comando vagrant ip-show em qualquer um dos seus projetos.

Motivação

Mas vale a pena criar um plugin para o Vagrant? Não dá muito trabalho?

— Alguém por aí…

Agora estou enxergando uma pergunta mais interessante! No meu caso, criar um plugin para o Vagrant era um desafio, que até que enfim consegui realizar. Então sim, vale a pena! Sempre acompanhei o brasileiro Fábio Rehm criando uma porrada deles, e pensava: poxa, teria que ficar fera em Ruby antes de conseguir um dia criar um plugin… Mesmo estudando um monte sobre Vagrant e seus plugins, não parecia tarefa fácil.

Mas acreditava que talvez pudesse ser como usar o Vagrant, que é construído em Ruby, mas você pode usá-lo sem ter o mínimo de proficiência na linguagem. Se eu achasse um “be-a-bá” de como começar, deveria conseguir. E, como disse, era um desafio e a necessidade que tive de descobrir os IP de uma VM mexeu comigo. Pensei: “é isso! Já sei a necessidade! Se não houver nenhum plugin para isso, é esse que vou criar”.

Na minha busca, achei apenas um plugin que não entregava o que eu precisava.

2__rogerio_RgoMBP____contribs_mercado_sup__zsh_

Infelizmente, ele trazia apenas um IP: o que estava configurado como hostonly na interface de rede do VirtualBox. E esse IP é geralmente o que não precisamos saber. O que geralmente queremos são os IPs configurados como private_network ou public_network, sejam eles estáticos ou recebidos por DHCP. O ifconfig/ipconfig traz isso tudo para nós, então o meu plugin devia trazer pelo menos todos os IPs.

Base teórica

Aí que o artigo How to Create a Simple Vagrant Plugin, do Noppanit (Toy), que eu já tinha lido alguns meses atrás, veio como uma mão na roda. Nele o autor fala sobre como fez num passo a passo para criar o seu plugin (se tem curiosidade, acesse que vale a pena!). Dessa vez, como já tinha uma necessidade clara, coloquei a mão na massa e o projeto saiu!

2__rogerio_RgoMBP____contribs_mercado_sup__zsh_-2

Tive que ficar fera em Ruby?

Com certeza não. Mas tive que entender um pouquinho mais sobre o site http://rubygems.org/, pois o plugin é publicado lá como uma Ruby Gem. Aprendi que aparentemente no mundo Ruby os badges de versões para projetos open source são liberados no https://badge.fury.io/ (no mundo PHP, que estou mais acostumado, é comum usar o https://poser.pugx.org/). Aprendi um pouco mais também no código fonte do plugin vagrant-exec sobre como funciona um plugin um pouco mais elaborado. E tudo isso foi ótimo!

Testem o plugin se acharem interessante, deêm o feedback e fiquem à vontade para conversar sobre o assunto.

É isso aí, pessoal!

Até a próxima!