Introdução
Ansible é uma ferramenta de automação de TI amplamente utilizada que simplifica o gerenciamento e a implantação de infraestrutura. Neste laboratório, exploraremos como listar arquivos e diretórios em formato longo usando Ansible. Você aprenderá como configurar o Ansible, criar playbooks e usar os módulos embutidos para listar informações de arquivos de sistemas remotos. Ao final deste laboratório, você terá experiência prática com comandos e técnicas do Ansible que podem aprimorar seus fluxos de trabalho de automação.
Instalando e Configurando o Ansible
Nesta etapa, instalaremos o Ansible em nosso sistema e criaremos um arquivo de inventário básico para gerenciar nosso ambiente local.
Instalando o Ansible
Primeiramente, vamos instalar o Ansible usando o gerenciador de pacotes:
sudo apt update
sudo apt install -y ansible
Após a conclusão da instalação, verifique se o Ansible foi instalado corretamente, verificando sua versão:
ansible --version
Você deve ver uma saída semelhante a esta:
ansible [core 2.12.0]
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
ansible collection location = /home/labex/.ansible/collections:/usr/share/ansible/collections
executable location = /usr/bin/ansible
python version = 3.10.x (default, Ubuntu 22.04)
jinja version = 3.0.3
libyaml = True
Criando um Inventário Ansible
Um arquivo de inventário é uma lista de nós gerenciados com os quais o Ansible pode trabalhar. Para este laboratório, criaremos um arquivo de inventário simples que inclui nossa máquina local.
Crie um diretório para nosso projeto Ansible:
mkdir -p ~/project/ansible-lab
cd ~/project/ansible-lab
Agora, crie um arquivo de inventário usando o editor VS Code:
- Clique no ícone "Explorer" na barra lateral esquerda
- Navegue até o diretório
~/project/ansible-lab - Clique com o botão direito e selecione "New File" (Novo Arquivo)
- Nomeie o arquivo
inventory.ini - Adicione o seguinte conteúdo ao arquivo:
[local]
localhost ansible_connection=local
Este arquivo de inventário define um grupo chamado local que inclui apenas nosso localhost e especifica que o Ansible deve se conectar localmente, em vez de usar SSH.
Criando o Arquivo de Configuração do Ansible
Vamos criar um arquivo de configuração básico do Ansible para especificar as configurações padrão:
- No painel Explorer, clique com o botão direito no diretório
ansible-labe selecione "New File" (Novo Arquivo) - Nomeie o arquivo
ansible.cfg - Adicione o seguinte conteúdo:
[defaults]
inventory = inventory.ini
host_key_checking = False
Este arquivo de configuração informa ao Ansible para usar nosso arquivo inventory.ini por padrão e desabilita a verificação da chave do host SSH, o que é útil para ambientes de laboratório.
Testando a Configuração
Vamos testar nossa configuração do Ansible executando um comando simples:
cd ~/project/ansible-lab
ansible local -m ping
Você deve ver uma saída semelhante a esta:
localhost | SUCCESS => {
"changed": false,
"ping": "pong"
}
Isso confirma que o Ansible está configurado corretamente e pode se comunicar com nossa máquina local.
Criando um Playbook Ansible Básico para Listar Arquivos
Nesta etapa, criaremos um playbook Ansible básico para listar arquivos e diretórios. Playbooks são arquivos YAML que definem um conjunto de tarefas a serem executadas em nós gerenciados.
Entendendo Playbooks Ansible
Antes de começarmos a criar nosso playbook, vamos entender o que é um playbook:
- Um playbook é um arquivo YAML que contém uma lista de plays
- Cada play define um conjunto de tarefas a serem executadas em um grupo específico de hosts
- Tarefas são ações individuais que chamam módulos Ansible
- Módulos são unidades de código reutilizáveis que executam operações específicas
Criando Nosso Primeiro Playbook
Vamos criar um playbook simples para listar o conteúdo do diretório /etc:
- No painel Explorer, navegue até o diretório
~/project/ansible-lab - Clique com o botão direito e selecione "New File" (Novo Arquivo)
- Nomeie o arquivo
list_files.yml - Adicione o seguinte conteúdo:
---
- name: List files and directories
hosts: local
tasks:
- name: Get directory listing
command: ls -l /etc
register: directory_contents
- name: Display directory contents
debug:
var: directory_contents.stdout_lines
Vamos entender o que este playbook faz:
- A primeira linha (
---) indica o início de um documento YAML name: List files and directoriesé um nome descritivo para o playhosts: localespecifica que este play será executado em hosts no grupolocal(definido em nosso inventário)tasks:inicia a lista de tarefas a serem executadas- A primeira tarefa executa o comando
ls -l /etce armazena o resultado em uma variável chamadadirectory_contents - A segunda tarefa exibe o conteúdo da variável
directory_contents.stdout_lines
Executando o Playbook
Agora vamos executar nosso playbook:
cd ~/project/ansible-lab
ansible-playbook list_files.yml
Você deve ver uma saída semelhante a esta:
PLAY [List files and directories] *****************************************************
TASK [Gathering Facts] ****************************************************************
ok: [localhost]
TASK [Get directory listing] **********************************************************
changed: [localhost]
TASK [Display directory contents] *****************************************************
ok: [localhost] => {
"directory_contents.stdout_lines": [
"total 1088",
"drwxr-xr-x 2 root root 4096 Apr 15 12:34 acpi",
"drwxr-xr-x 3 root root 4096 Apr 15 12:34 alternatives",
"-rw-r--r-- 1 root root 3028 Aug 1 2017 bash.bashrc",
"drwxr-xr-x 2 root root 4096 Apr 15 12:34 bash_completion.d",
"... [more files and directories] ..."
]
}
PLAY RECAP ***************************************************************************
localhost : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
A saída mostra o conteúdo do diretório /etc no formato longo, que inclui permissões, proprietário, grupo, tamanho e data de modificação.
Usando um Diretório Diferente
Agora vamos modificar nosso playbook para listar o conteúdo do diretório /home/labex:
- Abra o arquivo
list_files.ymlno editor - Altere o caminho no comando de
/etcpara/home/labex - Salve o arquivo com o seguinte conteúdo:
---
- name: List files and directories
hosts: local
tasks:
- name: Get directory listing
command: ls -l /home/labex
register: directory_contents
- name: Display directory contents
debug:
var: directory_contents.stdout_lines
Execute o playbook novamente:
ansible-playbook list_files.yml
A saída agora mostrará o conteúdo do diretório /home/labex em vez de /etc.
Usando o Módulo File do Ansible para Listagem em Formato Longo
Na etapa anterior, usamos o módulo command para executar o comando ls -l. Embora isso funcione, o Ansible fornece um módulo mais dedicado para trabalhar com arquivos e diretórios: o módulo ansible.builtin.file. Nesta etapa, aprenderemos como usar este módulo junto com o módulo ansible.builtin.find para listar arquivos de uma maneira mais nativa do Ansible.
Usando o Módulo find
O módulo ansible.builtin.find foi projetado para localizar arquivos que correspondem a critérios específicos. Ele fornece uma maneira mais poderosa e flexível de listar arquivos em comparação com o módulo command.
Vamos criar um novo playbook que usa o módulo find:
- No painel Explorer, navegue até o diretório
~/project/ansible-lab - Clique com o botão direito e selecione "New File" (Novo Arquivo)
- Nomeie o arquivo
find_files.yml - Adicione o seguinte conteúdo:
---
- name: Find files with Ansible
hosts: local
tasks:
- name: Find all files in /etc
ansible.builtin.find:
paths: /etc
file_type: any
register: found_files
- name: Display the first 10 files
debug:
var: found_files.files[:10]
Este playbook usa o módulo find para localizar todos os arquivos e diretórios no diretório /etc e, em seguida, exibe os primeiros 10 itens.
Vamos executar o playbook:
cd ~/project/ansible-lab
ansible-playbook find_files.yml
Você deve ver uma saída que contém informações detalhadas sobre cada arquivo, incluindo:
- Path (Caminho)
- Mode (Modo - permissões)
- Owner and group (Proprietário e grupo)
- Size (Tamanho)
- Modified time (Tempo de modificação)
Criando um Playbook com Detalhes em Formato Longo
Agora, vamos criar um playbook mais abrangente que exibe arquivos em um formato longo com todos os detalhes:
- No painel Explorer, clique com o botão direito e selecione "New File" (Novo Arquivo)
- Nomeie o arquivo
long_format.yml - Adicione o seguinte conteúdo:
---
- name: List files in long format
hosts: local
tasks:
- name: Find files in /etc
ansible.builtin.find:
paths: /etc
file_type: any
recurse: no
register: found_files
- name: Create a formatted list of files
set_fact:
formatted_files: "{{ formatted_files | default([]) + [item] }}"
loop: "{{ found_files.files }}"
loop_control:
label: "{{ item.path }}"
vars:
item_info: >-
{{ item.mode }} {{ item.uid | string | ljust(5) }}
{{ item.gid | string | ljust(5) }} {{ item.size | string | ljust(10) }}
{{ item.mtime | string | ljust(11) }} {{ item.path }}
- name: Display files in long format
debug:
msg: "{{ formatted_files[:10] }}"
Este playbook:
- Usa o módulo
findpara localizar arquivos no diretório/etc - Cria uma lista formatada que se assemelha à saída do comando
ls -l - Exibe os primeiros 10 arquivos na lista
Vamos executar o playbook:
ansible-playbook long_format.yml
A saída mostrará os detalhes do arquivo em um formato semelhante ao comando ls -l.
Filtrando Arquivos com Base em Critérios
Uma vantagem de usar os módulos do Ansible é a capacidade de filtrar arquivos com base em vários critérios. Vamos criar um playbook que lista apenas os arquivos de configuração (arquivos terminados em .conf):
- No painel Explorer, clique com o botão direito e selecione "New File" (Novo Arquivo)
- Nomeie o arquivo
filter_files.yml - Adicione o seguinte conteúdo:
---
- name: List filtered files in long format
hosts: local
tasks:
- name: Find configuration files in /etc
ansible.builtin.find:
paths: /etc
patterns: "*.conf"
file_type: file
register: conf_files
- name: Display configuration files
debug:
msg: "{{ item.mode }} {{ item.uid }} {{ item.gid }} {{ item.size }} {{ item.mtime }} {{ item.path }}"
loop: "{{ conf_files.files }}"
loop_control:
label: "{{ item.path }}"
Este playbook:
- Usa o módulo
findpara localizar arquivos no diretório/etcque terminam com.conf - Exibe cada arquivo com seus detalhes
Vamos executar o playbook:
ansible-playbook filter_files.yml
A saída mostrará detalhes apenas para arquivos .conf no diretório /etc.
Comparando com o Módulo Command
Vamos criar mais um playbook para comparar a saída do módulo find com o comando tradicional ls -l:
- No painel Explorer, clique com o botão direito e selecione "New File" (Novo Arquivo)
- Nomeie o arquivo
compare_methods.yml - Adicione o seguinte conteúdo:
---
- name: Compare listing methods
hosts: local
tasks:
- name: Get directory listing with ls command
command: ls -l /etc/passwd
register: ls_output
- name: Get file info with find module
ansible.builtin.find:
paths: /etc
patterns: "passwd"
file_type: file
register: find_output
- name: Display ls command output
debug:
var: ls_output.stdout_lines
- name: Display find module output
debug:
var: find_output.files[0]
Este playbook:
- Usa o módulo
commandpara executarls -lno arquivo/etc/passwd - Usa o módulo
findpara localizar o mesmo arquivo - Exibe ambas as saídas para comparação
Vamos executar o playbook:
ansible-playbook compare_methods.yml
Agora você pode ver a diferença entre os dois métodos:
- O comando
ls -lfornece uma única linha de texto no formato Unix tradicional - O módulo
findfornece um objeto de dados estruturado que você pode manipular no Ansible
Criando um Role Reutilizável para Listagem de Arquivos
Nesta etapa, aprenderemos como criar um role Ansible para listagem de arquivos. Roles são uma maneira de organizar playbooks e torná-los mais reutilizáveis. Isso é especialmente útil quando você precisa executar a mesma tarefa em vários playbooks ou projetos.
Entendendo Roles Ansible
Um role Ansible é um conjunto de tarefas, variáveis, arquivos, templates e outros recursos que são agrupados em uma estrutura de diretórios padrão. Roles facilitam a reutilização de código e o compartilhamento com outras pessoas.
A estrutura de diretórios padrão para um role se parece com isto:
roles/
rolename/
tasks/ ## Tarefas principais para o role
handlers/ ## Handlers acionados por tarefas
defaults/ ## Variáveis padrão
vars/ ## Variáveis do role
files/ ## Arquivos estáticos
templates/ ## Templates
meta/ ## Metadados para o role
Criando um Role de Listagem de Arquivos
Vamos criar um role para listar arquivos em formato longo:
- Primeiro, crie a estrutura de diretórios para nosso role:
cd ~/project/ansible-lab
mkdir -p roles/file_lister/tasks
- Crie o arquivo de tarefa principal para nosso role:
cd ~/project/ansible-lab
- No painel Explorer, navegue até
~/project/ansible-lab/roles/file_lister/tasks - Clique com o botão direito e selecione "New File" (Novo Arquivo)
- Nomeie o arquivo
main.yml - Adicione o seguinte conteúdo:
---
## Tasks for file_lister role
- name: Find files in the specified directory
ansible.builtin.find:
paths: "{{ path | default('/etc') }}"
patterns: "{{ patterns | default('*') }}"
file_type: "{{ file_type | default('any') }}"
recurse: "{{ recurse | default(false) }}"
register: found_files
- name: Display files in long format
debug:
msg: "{{ item.mode }} {{ item.uid }} {{ item.gid }} {{ item.size }} {{ item.mtime }} {{ item.path }}"
loop: "{{ found_files.files | sort(attribute='path') }}"
loop_control:
label: "{{ item.path }}"
when: show_details | default(true)
- name: Display only file paths
debug:
msg: "{{ item.path }}"
loop: "{{ found_files.files | sort(attribute='path') }}"
loop_control:
label: "{{ item.path }}"
when: not (show_details | default(true))
Este role:
- Encontra arquivos em um diretório especificado com base em parâmetros
- Exibe os arquivos em formato longo ou apenas os caminhos
- Usa valores padrão para parâmetros se eles não forem especificados
Usando Nosso Role em um Playbook
Agora, vamos criar um playbook que usa nosso novo role:
- No painel Explorer, navegue até o diretório
~/project/ansible-lab - Clique com o botão direito e selecione "New File" (Novo Arquivo)
- Nomeie o arquivo
use_role.yml - Adicione o seguinte conteúdo:
---
- name: Use file listing role
hosts: local
roles:
- role: file_lister
vars:
path: "/etc"
patterns: "*.conf"
file_type: "file"
show_details: true
Este playbook:
- É executado no host local
- Usa nosso role
file_lister - Define variáveis para o role para personalizar seu comportamento
Vamos executar o playbook:
cd ~/project/ansible-lab
ansible-playbook use_role.yml
Você deve ver a saída mostrando os detalhes de todos os arquivos .conf no diretório /etc.
Personalizando Variáveis do Role
Uma das vantagens dos roles é que podemos personalizar facilmente seu comportamento alterando as variáveis. Vamos criar outro playbook que usa nosso role com parâmetros diferentes:
- No painel Explorer, clique com o botão direito e selecione "New File" (Novo Arquivo)
- Nomeie o arquivo
custom_listing.yml - Adicione o seguinte conteúdo:
---
- name: Custom file listing
hosts: local
roles:
- role: file_lister
vars:
path: "/home/labex"
patterns: "*.yml"
file_type: "file"
show_details: false
Este playbook:
- Usa nosso role
file_lister - Define-o para procurar no diretório
/home/labex - Filtra por arquivos YAML (*.yml)
- Mostra apenas os caminhos dos arquivos (não os detalhes completos)
Vamos executar o playbook:
ansible-playbook custom_listing.yml
Você deve ver uma lista de todos os arquivos YAML no diretório /home/labex, sem as informações detalhadas.
Uso Avançado: Criando um Relatório
Finalmente, vamos criar um playbook mais avançado que usa nosso role para gerar um relatório de arquivos:
- No painel Explorer, clique com o botão direito e selecione "New File" (Novo Arquivo)
- Nomeie o arquivo
generate_report.yml - Adicione o seguinte conteúdo:
---
- name: Generate file listing report
hosts: local
vars:
report_path: "~/project/ansible-lab/file_report.txt"
tasks:
- name: Find files in the specified directory
ansible.builtin.find:
paths: "/etc"
patterns: "*.conf"
file_type: "file"
register: found_files
- name: Create report header
copy:
dest: "{{ report_path }}"
content: |
File Listing Report
Generated on: {{ ansible_date_time.date }} at {{ ansible_date_time.time }}
-----------------------------------------------------------
Mode Owner Group Size Modified Path
-----------------------------------------------------------
force: yes
- name: Append file information to report
lineinfile:
path: "{{ report_path }}"
line: "{{ item.mode }} {{ item.uid }} {{ item.gid }} {{ item.size | string | ljust(10) }} {{ item.mtime }} {{ item.path }}"
loop: "{{ found_files.files | sort(attribute='path') }}"
loop_control:
label: "{{ item.path }}"
- name: Display report location
debug:
msg: "Report generated at {{ report_path }}"
Este playbook:
- Encontra arquivos
.confno diretório/etc - Cria um arquivo de texto com um cabeçalho
- Anexa informações sobre cada arquivo ao relatório
- Exibe a localização do relatório
Vamos executar o playbook:
ansible-playbook generate_report.yml
Após executar o playbook, você pode visualizar o relatório:
cat ~/project/ansible-lab/file_report.txt
Você deve ver um relatório formatado listando todos os arquivos .conf no diretório /etc.
Resumo
Neste laboratório, você aprendeu como usar o Ansible para listar arquivos e diretórios em formato longo. Você adquiriu experiência prática com:
- Configuração do Ansible, instalando o software e criando um arquivo de inventário
- Criação de playbooks básicos que usam o módulo command para executar o comando
ls -l - Uso dos módulos file e find integrados do Ansible para obter informações detalhadas sobre arquivos
- Criação de um role Ansible reutilizável para listar arquivos com várias opções
- Geração de relatórios formatados com base em informações de arquivos
Essas habilidades ajudarão você a automatizar tarefas de gerenciamento de arquivos em sua infraestrutura e integrar listagens de arquivos em fluxos de trabalho de automação maiores. À medida que você continua trabalhando com o Ansible, pode construir sobre esses conceitos para criar automações mais complexas que gerenciam arquivos, diretórios e suas permissões em todo o seu ambiente.


