Conhecendo um Pouco do Ansible Galaxy – Blog do Beyeler
Conhecendo um Pouco do Ansible Galaxy
Lucas Costa Beyeler 16 de Março de 2017 2
Durante minhas aventuras como SysAdmin, eu me deparei com a fantástica ferramenta chamada Ansible. Eu me empolguei tanto com a ferramenta que acabei criando um projeto chamado warudo, agora já não existe um rastro dele, que seria um conjunto de roles que você pode rodar para criar um ambiente de teste, ou até mesmo produção. Bom, o projeto acabou morrendo pois perdi um pouco o interesse em desenvolve-lo, porém parte do projeto possuía roles que estavam completas, e seria um enorme desperdício jogar fora elas. Então o que fazer com elas? Mando para o Ansible Galaxy!
O Ansible Galaxy é um site aonde você pode compartilhar roles para qualquer tipo de atividade: subir um servidor de Zimbra? montar uma infra inteira de OpenShift? Instalar e configurar um banco de Redis? Tudo isso e muito mais. Isso acaba facilitando sua vida, já que ninguém quer ficar criando servidores manualmente, ou até mesmo escrevendo roles que já existem no Ansible Galaxy, né? Num comparativo, o site seria um repositório de roles, e o comando ansible-galaxy o apt/yum do Ansible.
Entendendo do Fluxo do Ansible Galaxy
O Ansible Galaxy é bem simples de utilizar, tanto para baixar roles quanto para desenvolver e compartilhar as suas. Todas as roles são hospedadas dentro do GitHub, dessa forma tendo acesso a todas as vantagens de se trabalhar com o GitFlow em suas roles. Uma vez que você inseriu um novo commit dentro de seu repositório do git, ele irá acionar sua ferramenta de teste automatizado, que pode ser o default (Travis CI) ou qualquer outro de seu interesse (como o Kitchen CI). Qualquer um poderá usar sua role no momento que integrou o Ansible Galaxy com sua conta do GitHub, o teste tendo falhado ou não, porém facilita sua vida pois já vai saber na hora que tem coisa errada no seu código.
Depois de ser aprovado nos testes, agora você poderá baixar seu código através de qualquer máquina bastando executar um simples "ansible-galaxy install role.name". A vantagem entre baixar através do ansible-galaxy e através do git clone está na facilidade de não precisar configurar um esquema de diretórios e colocar a role dentro dele só para rodar em seu ambiente, além de não ter a necessidade de saber a URL da role, só o nome. Seria como você rodar um apt-get install na sua máquina, só que para roles do Ansible.
Instalando e Usando uma Role
Para gerenciarmos as roles do Ansible usamos o comando ansible-galaxy, que já vem junto com todos os pacotes da suíte. Caso ainda não tenha o Ansible instalado na sua máquina, basta rodar um dos comandos abaixo, de acordo com sua distribuição:
Para buscar uma role do ansible, existe a opção "search". O search recebe como parâmetro uma palavra chave qualquer (como por exemplo um software), porém você pode expecificar ela usando os parâmetros –galaxy-tags, –platforms, e –author, que são respectivamente para buscar através das tags, por plataforma, e por autor. Também é possível usar todos eles para filtar ao máximo o resultado, se quiser. No caso iremos buscar por todas as roles que possuem como autor lucascbeyeler, ou algo próximo a isso.
# ansible-galaxy search --author lucascbeyeler
Found 8 roles matching your search:
lucascbeyeler.ansible-zimbra    Ansible role to install...
lucascbeyeler.commons           Default playbook to prepare...
lucazz.cifs_server              Role to install and configure...
lucazz.symlinks                 This is a Ansible role that...
lucafavatella.ansible-riak      Installs and configures Riak...
luckispac.firewalld4docker      An ansible play to manage...
luckypool.zsh luckypool         zsh
luckypool.elixir luckypool      elixir
Encontrando a role que precisa, para instalar utilize a opção "install", que irá baixar a role e salvar dentro do diretório /etc/ansible/roles. No caso de a role já ter sido instalada, você pode mandar um –force para que ela seja reinstalada, assim atualizando no caso de ter sido feito alguma modificação recentemente nela. Iremos instalar nesse exemplo a role lucascbeyeler.commons.
# ansible-galaxy install --force lucascbeyeler.commons
Com a role instalada, basta criar em qualquer diretório um arquivo YAML contendo a sintaxe do Ansible chamando a sua role recém instalada. Vale lembrar que antes é bom você consultar a documentação dessa role para saber quais são as variáveis que você deve configurar e como utilizar ela. Caso a documentação diga que essa role tem dependências, você deverá configurar essas dependências também no arquivo YAML, porém não precisará baixar elas pois o ansible-galaxy já resolve dependências de roles. Para conferir a documentação, execute o comando com a opção "info".
# ansible-galaxy info lucascbeyeler.commons
Criando sua Própria Role
Para criar uma nova role, primeiro vá no site do GitHub e crie um novo repositório. O nome pode ser o que quiser, porém para manter a organização iremos colocar "ansible-" na frente do nome, dessa forma mantemos organizado nosso repositório do GitHub, não conflitando com outros projetos que temos no repositório. Posteriormente, dentro do Ansible Galaxy iremos renomear o projeto para remover a extensão do nome.
Com o repositório criado, execute um git clone dele para sua máquina. Iremos começar agora a popular o projeto com nossas playbooks. Para isso execute um git clone e o endereço do repositório, no meu caso 'git@github.com:lucascbeyeler/ansible-role-example.git'. Só lembrando que você pode renomear o diretório aonde ficará o conteúdo de seu repositório simplesmente passando um nome para o diretório no final do comando, conforme o exemplo abaixo:
$ git clone git@github.com:lucascbeyeler/ansible-role-example.git role-example
Agora vamos inicializar esse repositório com os arquivos necessários para criarmos uma role. Você pode fazer o processo manualmente, na qual acredito ser demorado e um desperdício de tempo, ou você pode usar o comando ansible-galaxy para incluir toda a estrutura de um role de uma única vez, além de criar os arquivos especiais usados pelo Ansible Galaxy para exibir informações sobre seu projeto (como plataforma, autor, e suporte a qual versão do Ansible). Para inicializar utilize o parâmetro init no diretório de seu projeto, conforme exemplo abaixo:
$ ansible-galaxy init --force role-example
- role-example was created successfully
O force é simplesmente para reescrever todo o conteúdo do diretório, com exceção dos arquivos de configuração do git. Se você não tivesse o diretório a opção seria desnecessária, porém você teria mais passos para inicializar o repositório e configurar seu endpoint. Com o repositório inicializado, vamos conferir um pouco sobre sua estrutura antes de prosseguirmos com o desenvolvimento de nossa role.
Parte desses diretórios você já conhece, pois fazem parte da estrutura básica de qualquer role. Somente dois diretórios são diferentes e merecem destaques, além de um arquivo oculto.
Esse arquivo é utilizado pelo Travis CI para saber quais os testes que ele deve executar em seu software para definir se está funcionando ou não. Quando você inicializa o repositório com os arquivos de uma role através do comando ansible-galaxy init, o .travis.yml é inicializado contendo somente a análise léxica. Você pode alterar a checagem básica para também testar a instalação, mas fique avisado que os ambientes do Travis CI são contêineres, e dependendo de quanto espaço requisita para completar a operação, sua role sempre vai falhar (você tem a opção Dry Check, mas nem sempre ela funciona para tudo). Nesse arquivo iremos fazer três alterações básicas: baixaremos a todas as roles que são dependências, iremos testar a execução da playbook pelo Travis, e iremos falar qual distribuição do Linux deve ser utilizada na playbook. Para isso, abra o arquivo e inclua as seguintes linhas nos seus locais respectivos:
# This playbook need to run on Ubuntu 14.04 or later
dist: trust
# Install ansible-commons
- ansible-galaxy install lucascbeyeler.commons
- ansible-playbook -i tests/inventory tests/test.yml --connection=local --sudo --check
Por padrão, o Travis CI só cria contêineres usando o Ubuntu 12.04, que pode acabar sendo extremamente defasado para o tipo de teste que você deseja executar com sua role, além de que pode ser que sua role seja exclusiva para outra distribuição. Para contornar, usamos a opção dist: "nome da distribuição" para que seja criado usando a distribuição que queremos, no caso 'trust' para Ubuntu 14.04 (Trusty Tahr). A área script serve para você informar quais comandos devem ser executados para considerar que essa role está funcionando corretamente. Simplesmente copie o comando acima, porém removendo a opção sysntax-check e acrescentando –connnection=local (role deve ser aplicada localmente), –check (famoso "Dry Check" – Somente teste se a playbook roda, porém não faça nada), e –sudo (precisa de permissão de administrador para rodar o arquivo. Para a opção sudo funcionar, também altere o valor do campo "sudo" do arquivo de false para true.
Por ultimo precisamos informar ao Travis que ele precisa baixar a role que escolhemos como dependência, caso contrário os testes irão falhar. Como já vimos como funciona o comando ansible-galaxy, basta usarmos ele novamente para essa tarefa, porém esse comando deve ficar na sessão install, que é a região aonde você informa o Travis que precisa instalar alguns pacotes que não são fornecidos via APT/YUM.
Esse diretório contém um único arquivo que serve para preencher os dados de informação sobre sua role dentro da base do Ansible Galaxy. O arquivo já veem totalmente preenchido, porém você precisa remover os comentários de cada uma das linhas e alterar as informações para aquelas que refletem melhor sua role e o que ela fará.
author: Lucas Costa Beyeler
description: Just a role to explain how to use ansible-galaxy
company: www.beyeler.com.br
min_ansible_version: 2.2
- monoserver
- { role: lucascbeyeler.commons }
Abaixo segue uma rápida descrição sobre cada um dos campos desse arquivo:
author: Seu nome, para que as pessoas saibam que você criou essa role;
description: Uma rápida descrição sobre a role, para que quem for baixar saiba do que se trata ela;
company: O nome da empresa por trás dessa role, ou deixe em branco ou coloque seu blog se nenhuma empresa estiver por trás;
license: Licensa para usar e alterar essa role;
min_ansible_version: Versão mínima que o usuário precisa ter do Ansible para conseguir rodar a role sem problemas;
github_branch: Em qual branch, do repositório, o Ansible Galaxy deverá enviar para o usuário baixar;
platforms: Plataformas que sua role dá suporte. No caso existe uma lista gigante de plataformas já incluídas dentro do arquivo, basta remover os comentários daquelas que você irá dar suporte e pronto;
galaxy_tags: Todas as tags que os usuários poderão digitar para encontrar sua role;
dependencies: Roles que precisam ser instaladas e rodadas antes da sua ser aplicada.
Altere esse arquivo com as informações que achar necessário, porém garanta que o campo "dependencies" irá receber alguma playbook. Isso é necessário para que você veja o esquema de dependências em ação.
Esse diretório é aonde você irá criar uma playbook, ou editar a que já está criada, para aplicar todo o conteúdo de sua role dentro do contêiner. Também é possível alterar o arquivo hosts, para aonde essa playbook deve ser aplicada, porém deixaremos ela do jeito que está pois a ideia é rodar localmente.
- role: ansible-role-example
hostname: warudo
domain: hollowbastion.com
Basta copiar esse arquivo do jeito que está para dentro do arquivo test.yml. Se a role que você está fazendo com esse tutorial tiver variáveis, por favor configure o valor delas nesse arquivo. O memso deve ser feito com as variáveis das dependências. Com isso terminamos nossa etapa de configurar nosso repositório para receber nossa role. Agora basta você prosseguir com o desenvolvimento, e então executar o git push de todo o conteúdo editado localmente para a branch que você configurou no arquivo meta/main.yml.
Subindo sua Role no Ansible Galaxy
Agora que temos nossa role criada, vamos subir ela no Travis CI e no Ansible Galaxy. Primeiramente, acesse o site https://travis-ci.org/ e crie uma nova conta usando sua conta atual do GitHub. Ao se logar você irá ser redirecionado para uma página aonde existem logs de execução do Travis CI. Caso você tenha caído já direto nessa tela, clique no seu nome no canto direito da tela e depois em "Accounts". É nessa tela que iremos ativar os testes automatizados no nosso repositório.
Procure no seu perfil por uma área aonde possui uma lista de repositórios de sua conta e clique no botão ao lado para ativar as checagens. Se mudar a cor para verde e o símbolo para ✓, significa que o Travis agora tem acesso ao repositório para os testes automatizados. Para validar, clique em cima do nome do repositório e veja se o Travis iniciou algum processo. Ao término deverá exibir a cor verde, informando que o teste foi um sucesso. Qualquer coisa fora dessa cor deve ser analisado e depois executado um novo push. Não se preocupe: cada push que você executar irá acionar o Travis automaticamente. Caso o teste não tenha sido executado, mesmo que você tenha ativado o repositório, execute novamente um git push e veja se dessa vez a role está sendo validada pelo Travis CI.
Com essa etapa pronta, agora vamos acessar o Ansible Galaxy e ativar o repositório. Para isso acesse o endereço https://galaxy.ansible.com/, e se logue com sua conta do GitHub também. É necessário pois só dessa forma o Ansible Galaxy poderá ter acesso a seus repositórios e saber quais podem e quais não podem subir no site.
Depois de se autenticar, vá na aba "My Roles" e veja se aparece seu repositório. Se tudo der certo, seu repositório estará visível nessa página. Caso ainda não tenha aparecido, clique no símbolo de refresh e tente novamente. Se mesmo assim não aparecer, reveja seus passos. Alguma coisa ficou mal configurada ou não foi configurada, e por isso o Galaxy está rejeitando seu repositório.
Agora que nossa role está no Ansible Galaxy, vamos alterar o nome dela e remover a parte "ansible-". Para isso basta clicar na engrenagem e colocar qualquer outro nome. Esse será o nome que usaremos para chamar a role quando formos instalar ela. Alterado, basta clicar em salvar e aguardar alguns minutos até ser aplicado a atualização.
Para validarmos se esse repositório está funcionando, abrimos um terminal e executamos o ansible-galaxy install apontando para nosso repositório. No caso seu nome estará de acordo com a seguinte sintaxe: <username>.<role-name>.
ansible-galaxy install lucascbeyeler.role-example
Com isso termino esse artigo sobre o Ansible Galaxy. Dúvidas, sugestões, reclamações, por favor deixem nos comentário que irei ler e responder na medida do possível.