Crie e colete as folhas de contato

AnsibleBeginner
Pratique Agora

Introdução

O editor do Field Notes tem duas estações fotográficas com seleções diferentes para processar. Uma folha de contato e sua lista correspondente tornam as fotos úteis para seleção, mas um trabalho iniciado em segundo plano ou um arquivo antigo com o mesmo nome não é uma entrega concluída. Crie um pequeno exemplo e depois use o Ansible para esperar e coletar os resultados atuais reais de cada estação.

Você precisa de navegação básica no terminal e prática com um pequeno inventário Ansible, variáveis e tarefas command/file. O acesso SSH, as fotografias licenciadas e a ferramenta de imagens estão preparados. Este laboratório explica listas de argumentos, loops, identificadores por host, verificações de conclusão e destinos fetch antes de utilizá-los. A duração é uma estimativa do autor que inclui leitura e correções comuns, não um tempo medido com iniciantes reais.

Crie uma pequena folha de contato

Nesta etapa, você executará um pequeno trabalho fotográfico pelo Ansible, coletará sua imagem e lista reais e usará o resultado como modelo para o trabalho maior.

Abra a aba Photo Desk. Em A previous walk, clique em Open contact sheet. Uma folha de contato reúne versões pequenas de várias fotos em uma página, permitindo comparar os enquadramentos sem abrir todos os originais. Este exemplo histórico está marcado como previous-walk: é uma referência, não o trabalho concluído de hoje. Em uma tela estreita, role dentro da moldura da imagem para ler os nomes. Clique em Back to photo desk para voltar à página na mesma aba.

A história e a atribuição das estações são fictícias. As fotos de paisagens formam uma coleção didática licenciada; Photo credits lista os fotógrafos e as fontes reais. A ferramenta preparada lê arquivos JPEG reais e cria uma folha PNG e uma lista CSV. Você automatizará essa ferramenta em vez de escrever código de processamento de imagens.

Mude para a aba Controller. Ela começa em /home/labex/project. O controlador executa o Ansible. Seus dois destinos SSH são contêineres que compartilham o kernel desta VM de treinamento, não duas VMs independentes. Cada destino tem seus próprios arquivos, mesmo quando os caminhos têm nomes iguais.

pwd mostra o diretório atual e cat mostra um arquivo. Leia o inventário e as variáveis preparados:

pwd
cat inventory.yml
cat group_vars/all.yml
cat host_vars/camera-north.yml
cat host_vars/camera-south.yml

O grupo cameras do inventário contém camera-north e camera-south com suas configurações SSH reais. O ansible.cfg do projeto seleciona este inventory.yml e as configurações preparadas de confiança dos hosts. O inventory.ini original da imagem não é o inventário do curso. Preserve a configuração, o inventário e os arquivos de variáveis.

As chaves no estilo JSON desses arquivos são YAML válido. group_vars/all.yml fornece variáveis compartilhadas: input_root é /srv/photo-sheets/batches, output_root é /srv/photo-sheets/rendered e collection_root é o diretório collected do controlador, ao lado do playbook. Um arquivo em host_vars se aplica ao host com o mesmo nome. Aqui, photo_batch seleciona morning-walk na estação norte e afternoon-walk na sul. As seleções de hoje diferem em conteúdo e tamanho.

Primeiro use a entrada sample preparada com duas fotos na estação norte. O módulo command do Ansible executa o programa preparado nesse destino SSH. Sua lista argv passa um argumento por item, sem pedir a um shell que interprete uma string de comando. A opção --input escolhe o diretório de origem, --output o de resultados e --station identifica a estação no resultado. Nenhuma foto de origem é editada.

{{ variable }} insere um valor do Ansible. inventory_hostname é o nome do host atual no inventário; playbook_dir é o diretório do playbook no controlador. gather_facts: false pula informações da máquina que este trabalho fotográfico não precisa coletar.

O módulo fetch transfere um arquivo do destino SSH para o controlador, no sentido contrário de copy. Um loop repete a operação para os dois nomes listados; {{ item }} é o nome atual. Por padrão, fetch conserva uma árvore de diretórios com o host e o caminho de origem. Aqui, flat: true remove o caminho de origem, então o destino inclui explicitamente inventory_hostname. Isso separa arquivos homônimos de estações diferentes. fetch cria os diretórios de destino necessários.

Crie sample.yml. cat > filename escreve um arquivo e substitui qualquer arquivo existente com o mesmo nome. <<'YAML' inicia um here-document: cole até o YAML final, sozinho em sua linha. O delimitador entre aspas mantém o texto colado literal; o Ansible processa as expressões ao executar o playbook. A indentação YAML usa espaços:

cat > sample.yml <<'YAML'
- name: Build a small selection before scheduling both workstations
  hosts: camera-north
  gather_facts: false
  tasks:
    - name: Build the two-photo practice sheet
      ansible.builtin.command:
        argv:
          - /usr/local/bin/photo-sheet
          - --input
          - "{{ input_root }}/sample"
          - --output
          - "{{ output_root }}/sample"
          - --station
          - "{{ inventory_hostname }}"
    - name: Collect the practice image and file list
      ansible.builtin.fetch:
        src: "{{ output_root }}/sample/{{ item }}"
        dest: "{{ playbook_dir }}/sample/{{ inventory_hostname }}/"
        flat: true
      loop:
        - contact-sheet.png
        - files.csv
YAML

Verifique a sintaxe antes de executar. --syntax-check verifica a estrutura do playbook, sem processar fotografias:

ansible-playbook sample.yml --syntax-check

Se houver um erro de digitação ou indentação, copie novamente o playbook inteiro e repita a verificação. Agora execute:

ansible-playbook sample.yml

A tarefa de imagem é síncrona por padrão: o Ansible espera o programa terminar antes de buscar arquivos. O resumo deve mostrar failed=0 e unreachable=0. Um trabalho fotográfico realiza processamento e pode informar changed; repetir o processamento de imagens não garante ausência de mudanças.

Leia a lista coletada:

cat sample/camera-north/files.csv

O cabeçalho é station,batch,position,filename,sha256,width,height. Deve haver duas linhas para camera-north e sample, na mesma ordem da esquerda para a direita das imagens. Os nomes são frame-01.jpg e frame-02.jpg. SHA256 é uma impressão digital do conteúdo de cada arquivo de origem; você não precisa memorizar os valores longos. As dimensões descrevem a foto original, não sua pequena prévia.

Mude para Photo Desk e recarregue. Em Small practice sheet, use Open contact sheet para examinar seu resultado real de duas fotos. Volte com Back to photo desk e depois use Download contact sheet (PNG) e Download file list (CSV) nessa ficha de prática. Abra a imagem e o CSV baixados: as duas fotos, os nomes e a ordem das linhas devem corresponder. O navegador pode acrescentar um número ao nome de um download repetido.

A ficha abaixo mostra a imagem real de duas fotos e ambos os links de download. Confira a estação e a marca sample antes de usar os arquivos.

Folha de prática e downloads PNG e CSV correspondentes

Se um comando informar “No such file or directory”, ls lista o diretório atual para conferir a escrita. Use cd /home/labex/project para voltar à área de trabalho e repita o comando apropriado. Preserve todas as fotos de origem, referências históricas, notas do editor e conexões preparadas. As seleções atuais maiores ainda não foram criadas.

Aguarde cada trabalho antes da coleta

Nesta etapa, você iniciará as seleções atuais nas duas estações, aguardará o resultado bem-sucedido de cada host e coletará os arquivos correspondentes sem colisões.

Permaneça em Controller, em /home/labex/project. O grupo cameras seleciona os dois destinos; o photo_batch de cada um continua escolhendo sua entrada preparada. Use essas variáveis para que o mesmo fluxo aceite outros membros, lotes e diretórios sem fixar os nomes das duas estações nem seus caminhos de entrada.

Uma tarefa síncrona espera antes de o Ansible passar à próxima. Com async: 120, o Ansible concede à operação remota um limite de execução de 120 segundos. poll: 0 inicia a operação sem esperar sua conclusão nessa tarefa. Iniciar com sucesso não significa processar com sucesso: o trabalho remoto ainda pode terminar com um erro.

register: photo_job guarda o resultado do início separadamente para cada host do inventário. Seu ansible_job_id identifica esse trabalho nesse host. Um JID de uma estação não permite consultar o resultado na outra. O módulo debug imprime as observações guardadas para mostrar as atribuições distintas.

async_status consulta o mesmo host sobre seu JID e salva cada resposta em photo_result. until: photo_result is finished repete a consulta até o indicador nativo de conclusão ser verdadeiro; retries: 60 limita as tentativas e delay: 1 espera um segundo entre elas. São repetições da consulta de estado, não novos trabalhos fotográficos. SSH e processamento acrescentam tempo real. Um lote pequeno já pode ter terminado quando chega a primeira consulta; este exercício não adiciona atraso artificial.

A conclusão sozinha não comprova sucesso. O rc do programa remoto é seu código de saída: zero significa sucesso. Por padrão, async_status propaga um resultado diferente de zero como falha. O assert adicional torna explícita a exigência de saída zero; ele não transforma um erro em sucesso. A saída de depuração seguinte permite ler os valores reais de finished e rc antes da coleta. Um fluxo equivalente pode confiar na propagação nativa de falhas sem essa asserção extra.

Ambos os hosts produzem os mesmos nomes, contact-sheet.png e files.csv, em seus próprios sistemas de arquivos. Busque-os apenas após o sucesso e guarde cada par em seu diretório de host do inventário no controlador. Photo Desk lê tanto essa disposição plana explícita quanto a hierarquia padrão de host e caminho de origem dentro da pasta da estação. Ele nunca preenche uma coleção ausente com arquivos de referência.

Escreva process-photos.yml com o mesmo here-document entre aspas da etapa anterior:

cat > process-photos.yml <<'YAML'
- name: Build and collect each workstation's current photo selection
  hosts: cameras
  gather_facts: false
  tasks:
    - name: Start this workstation's contact sheet
      ansible.builtin.command:
        argv:
          - /usr/local/bin/photo-sheet
          - --input
          - "{{ input_root }}/{{ photo_batch }}"
          - --output
          - "{{ output_root }}"
          - --station
          - "{{ inventory_hostname }}"
      async: 120
      poll: 0
      register: photo_job
    - name: Show the job assigned to this workstation
      ansible.builtin.debug:
        msg:
          workstation: "{{ inventory_hostname }}"
          job: "{{ photo_job.ansible_job_id }}"
    - name: Wait for this workstation's own job
      ansible.builtin.async_status:
        jid: "{{ photo_job.ansible_job_id }}"
      register: photo_result
      until: photo_result is finished
      retries: 60
      delay: 1
    - name: Require successful processing before collecting
      ansible.builtin.assert:
        that: photo_result.rc == 0
    - name: Read the actual completion result
      ansible.builtin.debug:
        msg:
          workstation: "{{ inventory_hostname }}"
          finished: "{{ photo_result.finished }}"
          rc: "{{ photo_result.rc }}"
    - name: Collect the image and its file list by workstation
      ansible.builtin.fetch:
        src: "{{ output_root }}/{{ item }}"
        dest: "{{ collection_root }}/{{ inventory_hostname }}/"
        flat: true
      loop:
        - contact-sheet.png
        - files.csv
YAML

Verifique a sintaxe:

ansible-playbook process-photos.yml --syntax-check

Inicie o trabalho real:

ansible-playbook process-photos.yml

Cada estação deve mostrar seu próprio identificador e depois finished: true e rc: 0 na mensagem de conclusão. O resumo final deve ter failed=0 e unreachable=0 para ambos os hosts. A seleção norte tem três fotos; a sul, seis. Os trabalhos podem terminar em momentos diferentes. Esta execução demonstra processamento assíncrono real, não uma garantia de desempenho para cargas maiores.

Leia as duas listas coletadas:

cat collected/camera-north/files.csv
cat collected/camera-south/files.csv

Os campos station e batch devem corresponder à atribuição de cada host. Nomes iguais não significam fotografias de origem iguais. A posição, o nome, a impressão digital e as dimensões de cada linha descrevem uma imagem real de entrada; a folha usa a mesma ordem.

Mude para Photo Desk e recarregue. Em Current collections, abra Open contact sheet de cada estação. Examine as folhas de três e seis fotos em tamanho real e use Back to photo desk entre elas. Baixe PNG e CSV de cada estação, abra ambos e confira as imagens e as linhas completas. A referência e a pequena coleção de prática devem continuar disponíveis.

Compare as etiquetas de host e lote nas duas fichas. A folha norte tem uma linha de três imagens; a sul tem duas linhas de três, com seleções de origem diferentes.

Coleções atuais separadas das estações norte e sul

Um trabalho concluído ainda pode falhar

Volte para Controller. Agora selecione de propósito uma entrada inexistente apenas na estação norte. --limit camera-north limita a invocação a esse host do inventário. --extra-vars photo_batch=missing substitui a variável do lote somente nesta invocação, sem editar o arquivo preparado. O trabalho será iniciado e depois informará uma falha de processamento concluída. Os arquivos corretos existentes não devem ser tratados como um novo resultado bem-sucedido.

Espera-se que este comando falhe:

ansible-playbook process-photos.yml --limit camera-north --extra-vars photo_batch=missing

Imprima imediatamente o estado do comando anterior. $? guarda o código de saída do último comando e echo o imprime. Executar outro comando antes substituiria esse valor:

echo $?

Espere um estado diferente de zero da CLI do Ansible, normalmente 2. Na mensagem de falha, o resultado remoto terminou, o rc do programa é 2 e o erro menciona /srv/photo-sheets/batches/missing. O estado da CLI e o código remoto são valores separados; aqui ambos coincidem em 2. Um trabalho terminado com falha não é uma coleta bem-sucedida. A tarefa fetch não deve executar nessa tentativa. A estação sul está fora desta invocação.

Corrija a seleção voltando ao valor preparado e repita apenas a estação norte:

ansible-playbook process-photos.yml --limit camera-north

A execução deve funcionar e coletar o resultado real de morning-walk. A coleção sul continua disponível desde seu trabalho bem-sucedido. Volte ao Photo Desk, recarregue e baixe novamente o PNG e CSV do norte para confirmar as três fotos corretas. Mantenha process-photos.yml reutilizável, as fotografias originais e saídas históricas intactas e as notas do editor privadas.

Para um erro comum de YAML ou nome, use ls, o retorno ao diretório e a correção do bloco completo aprendidos na etapa anterior, depois verifique a sintaxe novamente. Não reinicie a VM nem altere uma foto original para esconder um erro de entrada. Repetir um trabalho correto realiza o processamento novamente; uma soma de verificação fetch igual não significa ausência de processamento.

O Ansible deixa um cache de estado depois de poll: 0. Após examinar um trabalho terminado, async_status com mode: cleanup e o jid desse host pode remover sua entrada. Aqui essa manutenção é opcional. Limpar o cache não cancela um trabalho em execução nem apaga a folha de contato.

Resumo

Você criou uma pequena folha de contato real e depois usou o Ansible para iniciar e esperar dois trabalhos assíncronos pertencentes aos respectivos hosts. Coletou cada par completo de imagem/CSV por estação, distinguiu uma falha encerrada de um sucesso e corrigiu uma entrada ausente repetindo apenas o host afetado.