Um dos problemas mais chatos da vida de um Sysadmin ou DevOPs é quando temos que rodar um comando específico em vários servidores.
Ok, temos uma série de coisas que podem resolver nossos problemas, como o Chef, Puppet e o Ansible que é o mais simples deles.
Isto porque quem já quis colocar o Chef e o Puppet rodando sabe que eles tomam um bom tempo e para atividades simples, isto pode não ser lá tão efetivo .
Eu procurei esta solução porque tinha um total de 11 servidores e precisava rodar um grep em todos eles. Isto tomaria a confecção de um shell script ou talvez, até, logar em um a um. E, como tenho o ansible aqui já instalado e rodando alguns playbooks achei que poderia ser uma boa tentar ver se ele poderia resolver o problema.
Passo 1 - Configure o seu arquivo de hosts do Ansible
Para começar todo o negócio você precisa criar um arquivo de hosts, e isto, pelo que li no artigo e em outras documentações é por causa de uma limitação dos comandos ansible e ansible-playbook em lidar com um único host. Ou seja, não implementaram esta opção nele, para ser mais claro.
Para quem não conhece o arquivo de hosts do Ansible ele tem várias linhas tal qual o arquivo hosts do sistema operacionalm com uma sintaxe um pouquinho diferente.
servername ansible_ssh_host=hostname
Ou seja, o arquivo que você usaria neste arquivo seria este ( lógico, caso você não tenha configurado estes hosts no seu DNS ). Aliás este arquivo caso você tenha instalado o Ansible no seu sistema, ele estará dentro do diretório, /etc/ansible e inclusive, dá para usar ele caso você já tenha tudo configurado no seu sistema, ok ?
[web]
web1 ansible_ssh_host=10.0.0.1
web2 ansible_ssh_host=10.0.0.2
[ftp] ftp1 ansible_ssh_host=10.0.0.1 ftp2 ansible_ssh_host=10.0.0.2
ssh01 ansible_ssh_host=ssh01.cybernetus.com
Aliás, inclusive dá para modificar a porta do SSH no seu arquivo de hosts, viu ? Esta eu nem sabia, descobri por este artigo.
hostmodificado ansible_ssh_host=10.50.10.45 ansible_ssh_port=7890
Legal né ? Feito isto, vamos para a segunda parte do processo, que aliás, é onde vamos aplicar o que foi configurado aqui.
Ah, lembrando. Após criar o seu arquivo de hosts com o conteúdo apresentado, salve ele com um nome qualquer. Ou seja, neste exemplo aqui … vamos dar o nome de hosts ( menos criativo impossível ).
Passo 2 - Rodando o seu comando dentro do próprio Ansible
Feita a primeira parte é só passar para a execução em si do comando. Aliás, este foi o achado do dia, já viu criança quando ganha brinquedo novo ? Eu hoje com este negócio.
E, vamos ao Hello World! disto aqui. Este comando irá pegar nosso arquivinho de hosts ou o seu arquivo já configurado ( caso tenha ) e rodar este comando ping, em todos os hosts que estejam nele.
$ ansible all -i ./hosts -m ping
Legal né ? Lógico que eu sei que sua cabeça já pipocou de idéias né ?
E se você precisar rodar um comando ls em diversos servidores ?
Vamos usar o módulo command que permite, como o nome já diz … rodar comandos em servidores remotos, né ? E aliás, é possível também inserir os argumentos do comando.
$ ansible all -i ./hosts -m command -a 'ls -la'
$ ansible all -i ./hosts -a 'ls -la'
Além disto, temos o módulo shell que permite também rodar os comandos, mas ele é um pouquinho mais poderoso.
$ ansible all -i ./hosts -m shell -a ‘ls -la’
Isto porque com o módulo shell dá para fazer comandos mais elaborados e, com isto, efetuar uma série de coisinhas legais que podem nos ajudar no dia a dia. Como por exemplo, o comando abaixo que pega o resultado e envia para um arquivo de nome tainted_files .
$ ansible all -i ./hosts -m shell -a ‘ls -la | grep taint > tainted_files’
Legal né ? E se você precisar dos arquivos ?
É só buscar eles com o módulo fetch .
$ ansible all -i ./hosts -m fetch -a ‘src=tainted_files dest=taint.{{ ansible_hostname }}'
Divertido para caramba né ?
Aconselho a meter as caras no Ansible porque ele é uma ferramenta mão na roda para o dia a dia de um SysAdmin … ou DevOPs .