Rodando um comando em múltiplos servidores via ssh

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 .

Via

TECH.SAIGONIST.COM

comments powered by Disqus