Introdução
Ansible é uma poderosa ferramenta de automação de código aberto que simplifica o gerenciamento da infraestrutura de TI. Neste tutorial, exploraremos o módulo get_url do Ansible, que permite baixar arquivos de uma URL específica. Este módulo é essencial para tarefas de automação como instalação de software, gerenciamento de configuração e implantação de conteúdo.
Ao longo deste tutorial, você aprenderá como configurar o Ansible, usar o módulo get_url com opções básicas e avançadas e implementar exemplos práticos para automatizar downloads de arquivos. Ao final deste guia, você terá uma sólida compreensão de como aproveitar este módulo para otimizar seus processos de gerenciamento de arquivos.
Instalando e Configurando o Ansible
Antes de podermos usar o módulo get_url, precisamos garantir que o Ansible esteja devidamente instalado e configurado em nosso sistema.
Instalando o Ansible
Vamos começar instalando o Ansible no ambiente LabEx:
sudo apt update
sudo apt install -y ansible
Após executar esses comandos, verifique se o Ansible está instalado corretamente, checando sua versão:
ansible --version
Você deve ver uma saída semelhante a esta, mostrando a versão do Ansible e os detalhes da configuração:
ansible [core 2.12.x]
config file = /etc/ansible/ansible.cfg
configured module search path = ['/home/labex/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python3/dist-packages/ansible
executable location = /usr/bin/ansible
python version = 3.10.x (default, ...) [GCC 11.x]
Criando um Diretório de Trabalho
Em seguida, vamos criar um diretório dedicado para nosso projeto Ansible:
mkdir -p ~/project/ansible-get-url
cd ~/project/ansible-get-url
Configurando um Inventário Simples
O Ansible precisa saber quais hosts gerenciar. Para este tutorial, criaremos um arquivo de inventário simples que direciona a máquina local:
echo "localhost ansible_connection=local" > inventory.ini
Este arquivo de inventário especifica que queremos executar o Ansible contra o localhost usando uma conexão local.
Criando o Arquivo de Configuração do Ansible
Para personalizar o comportamento do Ansible, vamos criar um arquivo de configuração simples:
cat > ansible.cfg << EOF
[defaults]
inventory = inventory.ini
host_key_checking = False
EOF
Este arquivo de configuração diz ao Ansible para usar nosso arquivo de inventário e desabilita a verificação da chave do host, o que simplifica as conexões em um ambiente de teste.
Testando a Configuração do Ansible
Vamos verificar se nossa configuração do Ansible funciona corretamente executando um comando ping simples:
ansible localhost -m ping
Você deve ver uma resposta bem-sucedida como:
localhost | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"ping": "pong"
}
Esta saída confirma que o Ansible está corretamente instalado e pode se comunicar com o localhost. Agora estamos prontos para usar o módulo get_url no próximo passo.
Criando um Playbook Básico com o Módulo get_url
Agora que temos o Ansible configurado, vamos criar um playbook simples que usa o módulo get_url para baixar um arquivo de uma URL.
Entendendo Playbooks do Ansible
Um playbook do Ansible é um arquivo YAML que define um conjunto de tarefas a serem executadas em hosts gerenciados. Os playbooks são organizados como uma série de plays, onde cada play consiste em:
- Um conjunto de hosts para direcionar
- Um conjunto de tarefas para executar
Criando Nosso Primeiro Playbook
Vamos criar um playbook básico que usa o módulo get_url. Crie um arquivo chamado download-file.yml em seu diretório de projeto:
cd ~/project/ansible-get-url
Abra o editor de arquivos e crie o arquivo com o seguinte conteúdo:
---
- name: Download a file from URL
hosts: localhost
become: no
tasks:
- name: Create downloads directory
file:
path: ~/project/ansible-get-url/downloads
state: directory
mode: "0755"
- name: Download a sample text file
get_url:
url: https://raw.githubusercontent.com/ansible/ansible/devel/README.md
dest: ~/project/ansible-get-url/downloads/ansible-readme.md
mode: "0644"
Este playbook faz o seguinte:
- Cria um diretório
downloadspara armazenar nossos arquivos baixados - Usa o módulo
get_urlpara baixar o arquivo README.md do Ansible do GitHub
Entendendo os Parâmetros do Módulo get_url
Vamos detalhar os principais parâmetros na tarefa get_url:
url: Especifica a URL da qual baixar o arquivodest: Define o caminho de destino onde o arquivo será salvomode: Define as permissões do arquivo (0644 significa leitura e escrita para o proprietário, leitura para o grupo e outros)
Executando o Playbook
Agora que criamos nosso playbook, vamos executá-lo usando o comando ansible-playbook:
ansible-playbook download-file.yml
Você deve ver uma saída semelhante a esta:
PLAY [Download a file from URL] ***********************************************
TASK [Gathering Facts] ********************************************************
ok: [localhost]
TASK [Create downloads directory] *********************************************
changed: [localhost]
TASK [Download a sample text file] ********************************************
changed: [localhost]
PLAY RECAP ********************************************************************
localhost : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Verificando o Arquivo Baixado
Vamos verificar se o arquivo foi baixado corretamente:
ls -l ~/project/ansible-get-url/downloads/
Você deve ver o arquivo baixado:
-rw-r--r-- 1 labex labex 3154 Mar 15 12:34 ansible-readme.md
Você também pode visualizar o conteúdo do arquivo baixado:
head -n 10 ~/project/ansible-get-url/downloads/ansible-readme.md
Isso exibirá as primeiras 10 linhas do arquivo README.md do Ansible, confirmando que ele foi baixado com sucesso.
Parabéns! Você criou e executou com sucesso seu primeiro playbook do Ansible usando o módulo get_url para baixar um arquivo de uma URL.
Trabalhando com Opções Avançadas do get_url
Agora que cobrimos o básico, vamos explorar algumas opções avançadas do módulo get_url que podem ser úteis em cenários do mundo real.
Criando um Playbook Avançado
Vamos criar um novo playbook chamado advanced-download.yml que demonstra várias opções avançadas:
cd ~/project/ansible-get-url
Abra o editor de arquivos e crie o arquivo com o seguinte conteúdo:
---
- name: Advanced get_url Module Options
hosts: localhost
become: no
tasks:
- name: Create advanced downloads directory
file:
path: ~/project/ansible-get-url/advanced-downloads
state: directory
mode: "0755"
- name: Download with checksum validation
get_url:
url: https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64
dest: ~/project/ansible-get-url/advanced-downloads/jq
mode: "0755"
checksum: sha256:af986793a515d500ab2d35f8d2aecd656e764504b789b66d7e1a0b727a124c44
- name: Download with timeout and retries
get_url:
url: https://raw.githubusercontent.com/ansible/ansible-examples/master/README.md
dest: ~/project/ansible-get-url/advanced-downloads/examples-readme.md
timeout: 30
retries: 3
delay: 5
force: yes
- name: Download only if file doesn't exist
get_url:
url: https://raw.githubusercontent.com/ansible/ansible/devel/examples/ansible.cfg
dest: ~/project/ansible-get-url/advanced-downloads/ansible-example.cfg
force: no
Entendendo os Parâmetros Avançados
Vamos examinar os parâmetros avançados usados neste playbook:
Validação de Checksum:
checksum: Especifica o checksum esperado do arquivo baixado (formato: algoritmo:checksum)- Isso garante a integridade do arquivo baixado e impede o download se o arquivo já existir com o checksum correto
Timeout e Retries:
timeout: Tempo máximo em segundos para a conclusão da solicitação HTTPretries: Número de vezes para tentar novamente se o download falhardelay: Atraso entre as tentativas em segundosforce: Se deve baixar o arquivo mesmo que ele já exista
Download Condicional:
force: no: O arquivo só será baixado se não existir no destino
Executando o Playbook Avançado
Vamos executar nosso playbook avançado:
ansible-playbook advanced-download.yml
Você deve ver uma saída semelhante a esta:
PLAY [Advanced get_url Module Options] ****************************************
TASK [Gathering Facts] ********************************************************
ok: [localhost]
TASK [Create advanced downloads directory] ************************************
changed: [localhost]
TASK [Download with checksum validation] **************************************
changed: [localhost]
TASK [Download with timeout and retries] **************************************
changed: [localhost]
TASK [Download only if file doesn't exist] ************************************
changed: [localhost]
PLAY RECAP ********************************************************************
localhost : ok=5 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Verificando os Downloads Avançados
Vamos verificar os arquivos que baixamos com as opções avançadas:
ls -l ~/project/ansible-get-url/advanced-downloads/
Você deve ver todos os arquivos baixados:
-rwxr-xr-x 1 labex labex 3773448 Mar 15 12:45 jq
-rw-r--r-- 1 labex labex 426 Mar 15 12:45 examples-readme.md
-rw-r--r-- 1 labex labex 1690 Mar 15 12:45 ansible-example.cfg
Vamos testar se o binário jq baixado funciona:
~/project/ansible-get-url/advanced-downloads/jq --version
Você deve ver uma saída indicando a versão do jq (por exemplo, jq-1.6), confirmando que o executável foi devidamente baixado com o checksum correto.
Você agora usou com sucesso várias opções avançadas do módulo get_url para baixar arquivos com diferentes requisitos e restrições.
Implementando uma Implantação Prática de Aplicativo Web
Vamos aplicar o que aprendemos em um cenário mais prático: implantando um aplicativo web simples usando o módulo get_url do Ansible.
Configurando o Projeto do Aplicativo Web
Primeiro, vamos criar uma estrutura de diretórios para nosso aplicativo web:
mkdir -p ~/project/ansible-get-url/webapp/public
cd ~/project/ansible-get-url
Criando o Playbook de Implantação do Aplicativo Web
Agora, criaremos um playbook chamado deploy-webapp.yml que fará o download dos arquivos necessários para nosso aplicativo web:
---
- name: Deploy Web Application Files
hosts: localhost
become: no
vars:
webapp_dir: ~/project/ansible-get-url/webapp
assets_base_url: https://raw.githubusercontent.com/ansible/ansible-documentation/devel/docs/docsite/rst/_static
tasks:
- name: Ensure webapp directories exist
file:
path: "{{ item }}"
state: directory
mode: "0755"
loop:
- "{{ webapp_dir }}"
- "{{ webapp_dir }}/public"
- "{{ webapp_dir }}/public/css"
- "{{ webapp_dir }}/public/images"
- name: Create index.html
copy:
dest: "{{ webapp_dir }}/public/index.html"
content: |
<!DOCTYPE html>
<html>
<head>
<title>Ansible Demo App</title>
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<div class="container">
<h1>Welcome to Ansible Demo</h1>
<p>This site was deployed using Ansible's get_url module!</p>
<img src="images/ansible-logo.png" alt="Ansible Logo">
</div>
</body>
</html>
- name: Download CSS file
get_url:
url: "{{ assets_base_url }}/css/ansible.css"
dest: "{{ webapp_dir }}/public/css/style.css"
mode: "0644"
timeout: 30
retries: 3
- name: Download Ansible logo
get_url:
url: "{{ assets_base_url }}/images/ansible_logo.svg"
dest: "{{ webapp_dir }}/public/images/ansible-logo.png"
mode: "0644"
timeout: 30
retries: 3
- name: Install Python HTTP server
apt:
name: python3-http.server
state: present
become: yes
- name: Display information about running the web server
debug:
msg: |
Web application has been deployed!
To start the web server, run:
cd {{ webapp_dir }}/public && python3 -m http.server 8080
Then access it at: http://localhost:8080
Este playbook:
- Cria a estrutura de diretórios necessária para nosso aplicativo web
- Cria um arquivo index.html com conteúdo HTML básico
- Baixa um arquivo CSS e uma imagem do logotipo do Ansible usando o módulo
get_url - Instala um servidor HTTP Python
- Exibe informações sobre como executar o servidor web
Executando o Playbook de Implantação do Aplicativo Web
Vamos executar o playbook:
ansible-playbook deploy-webapp.yml
Você deve ver uma saída indicando que o aplicativo web foi implantado com sucesso.
Iniciando o Servidor Web
Agora, vamos iniciar o servidor web para testar nosso aplicativo implantado:
cd ~/project/ansible-get-url/webapp/public
python3 -m http.server 8080 &
O servidor web agora está sendo executado em segundo plano na porta 8080. Se você estivesse em um ambiente normal com acesso ao navegador, poderia acessar o aplicativo web em http://localhost:8080.
Verificando os Arquivos Implantados
Vamos verificar se todos os arquivos necessários foram implantados corretamente:
ls -la ~/project/ansible-get-url/webapp/public/
Você deve ver o arquivo index.html e os diretórios que criamos.
ls -la ~/project/ansible-get-url/webapp/public/css/
Isso deve mostrar o arquivo CSS baixado.
ls -la ~/project/ansible-get-url/webapp/public/images/
Isso deve mostrar a imagem do logotipo do Ansible baixada.
Visualizando o Conteúdo HTML
Vamos verificar o conteúdo do arquivo index.html:
cat ~/project/ansible-get-url/webapp/public/index.html
Você deve ver o conteúdo HTML que criamos no playbook.
Parando o Servidor Web
Quando terminar os testes, você pode parar o servidor web encontrando seu ID de processo e matando-o:
pkill -f "python3 -m http.server 8080"
Parabéns! Você implantou com sucesso um aplicativo web simples usando o módulo get_url do Ansible para baixar os arquivos necessários.
Resumo
Neste tutorial, você adquiriu experiência prática usando o módulo get_url do Ansible para baixar arquivos de URLs específicas. Você aprendeu:
- Como instalar e configurar o Ansible para desenvolvimento local
- Como criar playbooks básicos usando o módulo
get_urlpara baixar arquivos - Como utilizar opções avançadas como validação de checksum, timeouts, retries e downloads condicionais
- Como implementar um cenário prático de implantação de aplicativo web usando o módulo
get_url
Essas habilidades são fundamentais para automatizar tarefas de gerenciamento de arquivos em várias operações de TI, incluindo implantação de software, gerenciamento de conteúdo e configuração de sistema. O módulo get_url é uma ferramenta versátil que pode ser integrada a fluxos de trabalho Ansible mais complexos para otimizar seus processos de gerenciamento de infraestrutura.
Ao continuar sua jornada no Ansible, considere explorar módulos relacionados, como uri, unarchive e synchronize, que complementam o módulo get_url para uma automação de gerenciamento de arquivos mais abrangente.


