Como baixar arquivos de uma URL específica usando o módulo get_url do Ansible

AnsibleBeginner
Pratique Agora

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:

  1. Cria um diretório downloads para armazenar nossos arquivos baixados
  2. Usa o módulo get_url para 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 arquivo
  • dest: Define o caminho de destino onde o arquivo será salvo
  • mode: 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:

  1. 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
  2. Timeout e Retries:

    • timeout: Tempo máximo em segundos para a conclusão da solicitação HTTP
    • retries: Número de vezes para tentar novamente se o download falhar
    • delay: Atraso entre as tentativas em segundos
    • force: Se deve baixar o arquivo mesmo que ele já exista
  3. 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:

  1. Cria a estrutura de diretórios necessária para nosso aplicativo web
  2. Cria um arquivo index.html com conteúdo HTML básico
  3. Baixa um arquivo CSS e uma imagem do logotipo do Ansible usando o módulo get_url
  4. Instala um servidor HTTP Python
  5. 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_url para 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.