Inspecionar hosts com comandos ad hoc

AnsibleBeginner
Pratique Agora

Introdução

Um comando pontual do Ansible pode inspecionar um conjunto de máquinas ou aplicar um pequeno estado de configuração explícito. Escolher o módulo certo torna seu comportamento e os resultados retornados mais fáceis de entender.

Você inspecionará dois destinos Linux, preparará um diretório gerenciado e distribuirá um arquivo de origem do controlador. Comparará a execução de comandos com módulos que informam se o estado solicitado realmente precisou de uma alteração. O inventário e as conexões SSH já estão preparados.

Inspecionar um grupo de hosts com módulos

Nesta etapa, você escolherá módulos Ansible para inspecionar pontualmente os dois nós gerenciados preparados.

Abra o Terminal e selecione o espaço de trabalho:

cd /home/labex/project

Um comando ad hoc executa um módulo diretamente nos hosts selecionados do inventário, sem um playbook. Sua estrutura básica é ansible PATTERN -m MODULE -a ARGUMENTS. O laboratório fornece um grupo webservers contendo os dois destinos SSH. Visualize previamente esse grupo:

ansible webservers --list-hosts

Espere ver exatamente web1 e web2. Use o módulo command do laboratório anterior para executar uname -s, que imprime o nome do kernel do sistema operacional:

ansible webservers -m ansible.builtin.command -a 'uname -s'

Cada host deve imprimir Linux. O módulo command normalmente informa CHANGED mesmo em uma consulta somente leitura. Inspecione stdout e o status de retorno, em vez de interpretar esse rótulo como uma alteração de configuração.

O módulo setup coleta fatos, informações estruturadas descobertas em um nó gerenciado. O argumento filter do módulo restringe os fatos retornados. Inspecione o nome da distribuição:

ansible webservers -m ansible.builtin.setup -a 'filter=ansible_distribution'

Cada resultado bem-sucedido deve incluir um objeto ansible_facts contendo "ansible_distribution": "Ubuntu". setup geralmente informa changed: false para essa inspeção. Os fatos descrevem o destino, não o controlador; laboratórios posteriores os usarão na automação.

Um resultado de tarefa diferente de zero é uma falha, e UNREACHABLE indica um problema de conexão. Dois hosts esperados exigem dois resultados bem-sucedidos. Não confunda uma seleção vazia com uma inspeção concluída.

Declarar um diretório gerenciado

Nesta etapa, você usará um módulo orientado a estado para preparar o mesmo diretório nos dois destinos.

O módulo file gerencia o estado do sistema de arquivos. Seu path identifica o caminho no destino, e state=directory solicita um diretório em vez de um arquivo vazio. mode=0750 concede acesso completo ao proprietário, leitura e busca ao grupo e nenhum acesso aos demais. O zero inicial denota um valor de permissão octal.

As tarefas comuns são executadas como a conta automation preparada. Crie um diretório dentro do diretório pessoal desse usuário, para que become não seja necessário:

ansible webservers -m ansible.builtin.file -a 'path=/home/automation/ops state=directory mode=0750'

Os dois hosts devem informar changed: true quando o diretório for criado pela primeira vez, com um campo path ou dest identificando /home/automation/ops. O diretório pertence a automation porque essa conta o cria.

Execute novamente a mesma declaração:

ansible webservers -m ansible.builtin.file -a 'path=/home/automation/ops state=directory mode=0750'

Agora espere changed: false nos dois hosts: o estado solicitado já existe. Isso difere de emitir repetidamente um comando genérico como touch, que ainda pode atualizar carimbos de data e hora.

Copiar um arquivo do controlador para os dois destinos

Nesta etapa, você criará um pequeno arquivo de origem no controlador e implantará seu conteúdo exato com permissões explícitas no destino.

printf grava o texto e uma quebra de linha final; > cria ou substitui a origem no projeto atual. O formato entre aspas mantém a mensagem unida, enquanto \n solicita a quebra de linha:

printf 'Managed by Ansible\n' > message.txt

O módulo copy transfere uma origem do controlador para um destino gerenciado. src fica no controlador, enquanto dest fica em cada destino. Para um arquivo regular, mode=0640 concede leitura e escrita ao proprietário, leitura ao grupo e nenhum acesso aos demais:

ansible webservers -m ansible.builtin.copy -a 'src=/home/labex/project/message.txt dest=/home/automation/ops/message.txt mode=0640'

Cada destino deve informar changed: true na cópia inicial. Execute a mesma transferência novamente:

ansible webservers -m ansible.builtin.copy -a 'src=/home/labex/project/message.txt dest=/home/automation/ops/message.txt mode=0640'

Espere changed: false quando os bytes e as permissões solicitadas já corresponderem. O módulo file preparou o diretório pai; copiar um arquivo não substitui essa etapa de criação do diretório.

Leia o conteúdo remoto real com o módulo command:

ansible webservers -m ansible.builtin.command -a 'cat /home/automation/ops/message.txt'

Os dois resultados de stdout devem mostrar Managed by Ansible. A consulta com command pode informar CHANGED, mas o resultado changed:false anterior do módulo copy descreve um arquivo gerenciado que já corresponde ao solicitado. Sua origem no controlador permanece separada das duas cópias remotas.

Resumo

Você executou módulos ad hoc em um grupo real de dois hosts, interpretou a saída de comandos e descobriu fatos sobre a distribuição. Declarou um diretório, copiou uma origem separada do controlador com permissões explícitas e observou resultados sem alterações quando módulos orientados a estado encontraram o estado correspondente em uma execução repetida.