Tutorial Ansible v1

February 20, 2018 | Author: Cristian Trucco | Category: Ip Address, Apache Http Server, Operating System, Server (Computing), Computer Architecture
Share Embed Donate


Short Description

Introdução ao Ansible...

Description

INTRODUÇÃO AO ANSIBLE

Autor: Vamberto Rocha JR Contato: [email protected]

-v1.0-

Introdução ao Ansible Com o avanço e a popularização das tecnologias de virtualização e cloud, os administradores de sistemas gerenciam muito mais servidores do que antigamente, fazendo com que uma simples tarefa de atualização dos servidores seja extremamente trabalhosa e demorada. O Ansible é uma ferramenta open source para orquestração e automação da configuração de servidores, que veio para facilitar a vida dos administradores de sistemas. Com ele é possível realizar tarefas como: Instalação e atualização de pacotes, configuração e deploy de aplicações, gerenciamento de usuários e varias outras tarefas administrativas com enorme ganho de desempenho e produtividade.

Características •

É Escrito em Python – Diferentemente de outras ferramentas como: Puppet e Chef, que são escritos em Ruby, o Ansible é escrito em Python que é uma linguagem interpretada, de script, imperativa e orientada a objetos;



Não necessita de agentes – Diferentemente de outras feramentas de automação de configuração como: Puppet e Chef, o Ansible não necessita que agentes sejam instalados nos hosts remotos;



Utiliza SSH para se conectar aos hosts remotos – O protolo SSH é utilizado para acesso seguro a hosts remotos, o Ansible utiliza esse protocolo para o acesso aos hosts;



Utiliza linguagem JINJA2 para os templates;



Utiliza a linguagem YAML para escrever os playbooks – YAML é uma linguagem que é facilmente entendida por seres humanos;



Vasta quantidade de módulos e códigos no github – Através do site https://galaxy.ansible.com/ ou do comando ansible-galaxy, é possível baixar e reutilizar playbooks escritos por outros usuários.

Outra característica importante é que o Ansible funciona de forma idempotent, isso significa que um comando só será aplicado quando ele realmente necessitar ser aplicado. Para entender melhor o que significa ser

idempotent, imagine que foi escrita uma tarefa para instalar um determinado pacote, ao ser executada primeiramente o Ansible irá verificar se o pacote existe no host remoto, caso não exista a tarefa será executada e o pacote será instalado, caso exista a tarefa não será executada. Esse comportamento vale para o Ansible de uma forma geral, apenas a tarefa de instalação de pacotes.

Instalação O Ansible não necessita ser instalado em todos os hosts do seu parque de servidores, apenas no host que irá gerenciar os outros. É necessário apenas que nos servidores que serão gerenciados, também chamados de hosts remotos, se tenha instalado um interpretador python. Caso o interpretador python instalado na máquina remota seja inferior a versão 2.5, é necessário a instalação do pacote python-simplejson A instalação do Ansible no host de gerência é bem simples, não são exigidos daemons ou banco de dados. Mesmo sendo possível a instalação do Ansible através do código fonte, só irei abordar a instalação através dos gerenciadores de pacotes YUM e APT, que é a forma sugerida pelo próprio site da ferramenta.

Sistema Operacionais Red Hat Like Para instalação do Ansible em sistema operacionais baseados em Red Hat (Red Hat, Fedora, CentOS), é necessário adicionar ao gerenciador de pacotes YUM o repositório EPEL e em seguida, executar o seguinte comando: $ yum install ansible

Sistemas Operacionais Debian Like Para instalação do Ansible em sistema operacionais baseados em Debian (Debian, Ubuntu), é necessário executar os seguintes comandos: $ sudo apt-get install software-properties-common $ sudo apt-add-repository ppa:ansible/ansible $ sudo apt-get update

$ sudo apt-get install ansible

Após a instalação, o comando “ $anisble –version ” poderá ser executado para verificar qual a versão do Ansible foi instalada. Para maiores informações sobre a instalação do Ansible em outras plataformas, ou até utilizando o código fonte, basta acessar a página da documentação oficinal da ferramenta cujo endereço é: http://docs.ansible.com/ansible/intro_installation.html

Comandos Com a instalação do pacote ansible alguns comandos, listados logo abaixo, são adicionados ao path do sistema operacional. Iremos detalhar cada um dos comandos e termos apresentandos posteriormente. •

ansible – Executa tasks (tarefas) em hosts



ansible-doc – Exibe a documentação dos módulos do ansible



ansible-galaxy – Gerencia roles utilizando a comunidade galaxy.ansible.com



ansible-playbook - Executa um ansible playbook



ansible-pull – É utilizado para configurar uma cópia remota do ansible em cada host gerenciado.



ansible-vault – Criptografa e gerência arquivos criptografados YAML

Conceitos Importantes O Ansible não é uma ferramenta complexa, porém existem muitos termos e conceitos que são importantes para a sua correta utilização. Acredito que para começarmos a utiliza-lo é importante aprendermos os itens listados a seguir:



Inventory – Lista de hosts que irão receber os comandos executados pelo servidor Ansible;



Modules – Controlam os recursos (serviços, pacotes, arquivos, etc.) do

host remoto; •

Tasks – Tarefa que será executada no(s) host(s);



Playbook - Conjunto de tarefas que serão executadas no(s) host(s);



Roles - São maneiras de carregar automaticamente determinados arquivos como: vars_files, tasks e handles com base numa estrutura de arquivo conhecidos.

Inventory O inventário é uma parte importante na arquitetura do Ansible, é nele que será definida a lista de hosts que irão receber os comandos do servidor Ansible. Por padrão, o inventário está localizado em /etc/ansible/hosts, mas nada impede que você informe o inventário de hosts em outro lugar, utilizando a opção -i ao executar playbooks e comandos adhoc. Além de hosts, o inventário pode se utilizado para declaração de variáveis e parâmetros para acesso do Ansible ao host remoto. Lembrando que o Ansible sempre utiliza os hosts definidos no arquivo de inventário para execução de playbooks e comandos ad-hoc. Em seguida é apresentado um exemplo de arquivo /etc/ansible/hosts e no Anexo I desse documento são listados alguns parâmetros que podem ser declarados no arquivo de inventário.

mail.example.com #Definindo grupo de servidores webservers [webservers] foo.example.com bar.example.com host1 http_port=80 maxRequestsPerChild=808 #Definindo grupo de servidores dbservers [dbservers] one.example.com two.example.com # Definindo grupo global web no inventory [web:children] webservers dbservers

# Definindo variáveis para o grupo webservers no inventory [webservers:vars] ntp_server=ntp.example.com proxy=proxy.example.com

Módulos O Ansible possui uma grande quantidade de módulos predefinidos que podem ser utilizados para executar tarefas nos hosts remotos tanto através de comandos ad-hoc (executam apenas uma tarefa) como de playbooks (executam várias tarefas), além disso, os usuários podem escrever seus próprios módulos. Para obter mais informações sobre os módulos do Ansible, basta acessar o endereço http://docs.ansible.com/ansible/modules.html ou utilizar os seguintes comandos: •

$ansible-doc -l : Lista todos os módulos predefinidos do Ansible



$ansible-doc [nome_do_módulo]: Exibe informações específicas de um módulo

Comandos Ansible Ad-Hoc

Lembrando que os hosts que irão receber as alterações realizadas pelo Ansibles, devem estar cadastrados no arquivo de inventário /etc/ansible/hosts ou em qualquer outro arquivo desde que ao executar o comando ad-hoc ou playbook seja expecificado o arquivo de hosts com a opção -i Segue o comando Ansible para executar tarefas $ansible [opções] - Host ou grupo de hosts que serão afetados pelo comando, all pode ser definido para referenciar todos os hosts do arquivo de inventário. Seguem algumas opções importantes do comando ansible

-i [inventário] – Especificando um arquivo de inventário ex: -i /ansible/hosts -m [módulo] – Especificando módulo -u [usuário] – Especificando usuário SSH para acesso remoto -k – A senha do usuário ssh será solicitada após a execução do comando -s – O modo super usuário (sudo) irá ser utilizado para execução do comando -K – A senha sudo do usuário irá será solicitada após execução do comando -a [“modules_args”] - Define algumentos dos módulos -a [“comando linux”] - Comando Linux a ser executado num host remoto -- version – Exibe a versão instalada do Ansible

Segue o comando Ansible para executar tarefas utilizando módulos: $ansible -m -a “” Com a execução do comando, você deverá receber no prompt de comando algumas mensagens informando o resultado e se ele foi realizado com sucesso ou falha. O quadro abaixo apresenta a execução de um comando ansible especificando apenas o host chamado “wolverine” onde o comando linux hostname é executado no host remoto, e como resultado é mostrado que foi realizado com sucesso e na ultima linha o resultado de sua execução. $ansible wolverine -i hosts -a "hostname" wolverine | SUCCESS | rc=0 >> wolverine

Segue abaixo alguns exemplos de comandos ad-hoc Ansible utilizando os mais variados módulos:

Testando conectividade do Ansible #Executa um ping entre os hosts $ansible tomcat1 -i /ansible/hosts -m ping -u root -k

Gathering Facts Ansible #lista as veriáveis facts do host tomcat1 $ansible tomcat1 -i /ansible/hosts -m setup -u root -k

Execução de comandos linux #Lista informações de memória de todos os hosts cadastrados no arquivo host $ansible all -i /ansible/hosts -a “free -m” -u root -k #Lista informações de partições do host remoto server1 $ansible server1 -i /ansible/hosts -a “df -m” -u root -k #Reinicia o serviço httpd no host remoto webhost $ansible webhost -i /ansible/hosts -a “service httpd restart” -u root -k

Instalação de pacotes #Instala o pacote httpd(apache) em servidor Red Hat Like $ansible webservers -m yum -a "name=httpd state=present" -u root -k #Instala o pacote iptraf em servidor Debian Like $ansible webservers -m apt -a "name=iptraf state=present" -u root -k

Gerenciamento de serviços #Verifica se o serviço httpd está iniciado, caso não esteja ele será iniciado $ansible webservers -m service -a "name=httpd state=started" -u root -k

Gerenciamento de usuários #Cria o usuário de nome user1 em todos os hosts presentes no arquivo hosts $ansible all -m user -a "name=user1 password=" -u root -k

Gerencimento de arquivos e pastas #Copia o arquivo /etc/hosts do host local para o arquivo /tmp/hosts do host remoto atlanta. $ansible atlanta -m copy -a "src=/etc/hosts dest=/tmp/hosts" -u root -k #Cria o diretório /backup/mp3 no host remoto webserver setando alguns parâmetros de permissão. $ansible webserver -m file -a "dest=/backup/mp3 mode=755 owner=vamberto group=admin state=directory" -u root -k

Gerenciamento de Banco de Dados Mysql #Cria o database diretoria no mysql do host remoto dbserver $ansible dbserver -m mysql_db -a “ name=diretoria state=present” #Cria o usuário admin, define sua senha e privilégios no mysql do host remoto dbserver $ansible dbserver -m mysql_user -a “name=admin password=12345 priv=*.*:ALL state=present”

Uma lista com todos os módulos, e seus parâmetros, está disponível no endereço: http://docs.ansible.com/ansible/modules_by_category.html. É recomendável que você acesse o endereço e verifique os principais módulos, juntamente com os parâmetros para a sua utilização.

Playbooks Playbooks são o motivo pelo qual o Ansible ser uma ferramenta tão poderosa, são com eles que realizamos a automação da configuração e orquestração de servidores. Se com os comandos ad-hoc nós realizamos apenas uma tarefa por vez, com o uso de playbooks nós realizamos varias tarefas de uma só vez. Desde a instalação de pacotes, configuração e deploy de aplicações, verificação de serviços, atualização do sistema, etc.

Como foi dito anteriormente, os playbooks são escritos numa linguagem chamada YAML que é de fácil interpretação pelos humanos. Para criarmos o nosso primeiro playbook, primeiramente devemos criar um arquivo (com editor de texto de sua preferência) iniciando ele com os caracteres “ --- “, isso sinaliza que o arquivo é escrito com a linguagem YAML, em seguida declaramos quais os hosts ou grupos de hosts (de acordo com o inventário de hosts criado anteriormente) com a opção “ – hosts: “, utilizamos a opção “ tasks: “ e depois disso podemos declarar as tarefas (tasks) que o playbook irá executar nos hosts remotos.

--- hosts: tasks: - name: :

Algumas conciderações devem ser feitas: A indentação é uma parte fundamental da linguagem YAML, linhas de códigos com erro de indetação causarão falha ao tentar executar o playbook. É possível escrever tarefas (tasks) sem a opção “- name”, porém aconselho utilizá-la pois a descrição utilizada na opção irá aparecer durante a execução do playbook, tornando assim muito mais fácil de sabermos o que está sendo executado. O exemplo de código informado acima contém apenas o mínimo necessário para se escrever um playbook, variáveis, configuração de conexão, permissões, etc. Também podem ser declaradas no playbook. Exemplos mais detalhados serão apresentados posteriormente.

Utilização de playbooks (exemplo 1) Antes de partirmos para a criação do nosso primeiro playbook, irei apresentar o ambiente de teste criado. Instalei uma máquina de teste no virtualbox (ambiente virtual) cujo hostname é ansibletest com endereço ip 192.168.0.100/24, essa máquina receberá as configurações da máquina ansible, cujo endereço ip é 192.168.0.10/24. O host ansible utiliza o sistema operacional Ubuntu 14.04 e possui instalado o pacote ansible, enquanto o host ansibletest utiliza o sistema operacional CentOS 7.0 e terá o interpretador python instalado.

Figura 1: Topologia do ambiente de teste Na máquina Ansible criei uma entrada IP/hosname no arquivo /etc/hosts, referenciando a máquina ansibletest e configurei o uso do SSH sem senha da máquina ansible para a máquina ansibletest. 127.0.0.1 127.0.1.1

/etc/hosts da máquina ansible localhost ansible

192.168.0.100

ansibletest

A pasta /ansible foi criada para armazenar o arquivo de hosts e todos os playbooks criados. Primeiramente temos que criar um arquivo /ansible/hosts (com o editor de textos de sua escolha) que funcionará como nosso inventário, esse arquivo terá apenas o nome do host remoto que irá receber os comandos declarados no playbook, no nosso caso, esse arquivo terá apenas o nome ansibletest. Caso o host remoto não tenha uma entrada no DNS, você pode utilizar o endereço IP ao invés do nome. Em seguida, na mesma pasta onde o arquivo de hosts está criado, vamos criar um arquivo chamado playbook_apache.yml com as linhas apresentadas abaixo: /ansible/playbook_apache.yml --- hosts: all tasks: - name: Atualizando o sistema operacional yum: name=* state=latest - name: Instalando a versão mais atual do apache yum: name=httpd state=latest

- name: Garantindo que o apache está rodando service: name=httpd enabled=yes state=running

Esse playbook será aplicado em todos os servidores declarados no arquivo hosts e irá executar 3 tarefas: Atualização do sistema operacional, instalação da versão mais recente do servidor web Apache e garantir que o Apache esteja rodando e configurado para se iniciado automaticamente na inicialização do sistema operacional. É importante salientar que as tasks (tarefas) no ansible são executadas na ordem em que elas são declaradas no arquivo playbook. Para executar o playbook criado, basta acessar a pasta /ansible e digitar o seguinte comando: $ansible-playbook -i hosts playbook_apache.yml Na Figura Erro: Origem da referência não encontrada 2 é apresentado o resultado da execução do playbook_apache.yml. Na primeira task “Atualizando o sistema operacional” nenhuma alteração foi realizada, o Sistema Operacional já estava atualizado. Na segunda e terceira task “ Instalando a versão mais atual do apache” e “Garantido que o apache está rodando”

respectivamente,

podemos

perceber

que

o

alterações, instalando e inicializando o servidor web Apache.

Figura 2: Execução do playbook_apache.yml

Ansible

realizou

Observando melhor a imagem, além da execução das 3 tasks que declaramos no playbook, uma quarta task foi executada, a “setup”. A task setup é, por padrão, sempre executada e ela é utilizada na descoberta de variáveis chamadas de facts do host remoto. Iremos explicar melhor o que são e como fazer uso das facts posteriormente.

Utilização de playbooks (exemplo 2) No exemplo 2 nós iremos escrever um playbook que irá instalar o serviço Network Time Protocol (NTP) no host ansible teste e irá configura-lo para que ele busque a hora num suposto servidor ntp em nossa rede (ntpserver.minharede.com) no host ansibletest. O playbook apresentado abaixo será aplicado em todos os hosts do arquivo hosts e irá executar 3 tarefas: Instalação do pacote ntp, copiar o arquivo de configuração (ntp.conf) da máquina onde o ansible está executando para o host remoto e efetuar o restart do serviço ntp. Vamos utilizar a mesma topologia e arquivo hosts apresentados no exemplo 1. Na mesma pasta onde o arquivo de hosts está criado, vamos criar um arquivo chamado playbook_ntp.yml com o conteúdo apresentado abaixo:

/ansible/playbook_ntp.yml --- hosts: all tasks: - name: Instalando a versão mais atual do ntp yum: name=ntp state=latest - name: Copiando o arq de configuração do ntp copy: src=/ansible/files/ntp.conf dest=/etc/ntp.conf - name: Garantindo que o serviço ntp está rodando service: name=ntp state=reloaded

Além do arquivo playbook_ntp.yml, nós precisamos criar o arquivo ntp.conf na pasta /ansible/files para que ele seja copiado e substitua o

arquivo /etc/ntp.conf no host remoto. /ansible/files/ntp.conf driftfile /var/lib/ntp/ntp.drift statsdir /var/log/ntpstats/ statistics loopstats peerstats clockstats filegen loopstats file loopstats type day enable filegen peerstats file peerstats type day enable filegen clockstats file clockstats type day enable server ntpserver.minharede.com restrict 127.0.0.1 restrict ntpserver.minharede.com restrict ::1

Para executar o playbook criado, basta digitar o seguinte comando: $ansible-playbook -i hosts playbook_ntp.yml

Na Figura Erro: Origem da referência não encontrada 3 é apresentado o resultado da execução do playbook_ntp.yml. Na primeira task o Ansible irá instalar a versão mais atual do NTP, Na segunda e terceira task respectivamente o Ansible irá copiar o arquivo de configuração que criamos para o host ansibletest e reiniciar o serviço NTP.

Figura 3: Primeira execução do playbook_ntp.yml Como prova que o Ansible funciona de maneira idempotent, executei novamente o mesmo playbook e o resultado pode ser conferido na Figura Erro: Origem da referência não encontrada 4.

Figura 4: Segunda execução do playbook_ntp.yml

Como podemos perceber, o Ansible não realizou nenhuma alteração nas tarefas de instalação e copia do arquivo de configuração do NTP, pois ambos já tinham sido realizadas na primeira execução do playbook_ntp.yml

Conclusão Apensar do pouco apresentado até agora, podemos perceber o quão poderosa e útil é o Ansible no gerenciamento da configuração e osquestração dos servidores, nos exemplos apresentados nesse documento, executamos tarefas em apenas um host, mas e se tivéssemos dezenas, centenas ou até milhares de hosts para administrar ? Na próxima versão desse documento, ao qual já está em desenvolvimento, irei apresentar alguns conceitos mais avançados do Ansible, a utilização de variáveis, configuração de aplicações usando templates, notificação de serviços utilizando handlers, organização e execução de playbooks utilizando roles, criptografia utilizando o ansible-vault.

Anexo I No anexo I é apresentado uma lista com parâmetros que podem ser utilizados na comunicação entre o servidor Ansible e o(s) host(s) remoto(s). Todas esses parâmetros apresentados foram retirados do site da documentalção oficial do Ansible, que pode ser acessa através do endereço http://docs.ansible.com/ . ansible_connection - Connection type to the host. This can be the name of any of ansible’s connection plugins. Common connection types are local, smart, ssh or paramiko. The default is smart.

SSH connection: ansible_host - The name of the host to connect to, if different from the alias you wish to give to it. ansible_port - The ssh port number, if not 22 ansible_user -The default ssh user name to use. ansible_ssh_pass - The ssh password to use (this is insecure, we strongly recommend using --ask-pass or SSH keys) ansible_ssh_private_key_file - Private key file used by ssh. Useful if using multiple keys and you don’t want to use SSH agent. ansible_ssh_common_args - This setting is always appended to the default command line for sftp, scp, and ssh. Useful to configure a ProxyCommand for a certain host (or group). ansible_sftp_extra_args - This setting is always appended to the default sftp command line. ansible_scp_extra_args - This setting is always appended to the default scp command line. ansible_ssh_extra_args - This setting is always appended to the default ssh command line. ansible_ssh_pipelining - Determines whether or not to use SSH pipelining. This can override the pipelining setting in ansible.cfg.

Privilege escalation ansible_become - Equivalent to ansible_sudo or ansible_su, allows to force privilege escalation

ansible_become_method - Allows to set privilege escalation method ansible_become_user - Equivalent to ansible_sudo_user or ansible_su_user, allows to set the user you become through privilege escalation ansible_become_pass - Equivalent to ansible_sudo_pass or ansible_su_pass, allows you to set the privilege escalation password

Remote host environment parameters: ansible_shell_type - The shell type of the target system. You should not use this setting unless you have set the ansible_shell_executable to a non-Bourne (sh) compatible shell. By default commands are formatted using sh-style syntax. Setting this to csh or fish will cause commands executed on target systems to follow those shell’s syntax instead. ansible_python_interpreter - The target host python path. This is useful for systems with more than one Python or not located at /usr/bin/python such as *BSD, or where /usr/bin/python is not a 2.X series Python. We do not use the /usr/bin/env mechanism as that requires the remote user’s path to be set right and also assumes the python executable is named python, where the executable might be named something like python2.6. ansible_*_interpreter - Works for anything such as ruby or perl and works just like ansible_python_interpreter. This replaces shebang of modules which will run on that host.

View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF