Criar Scripts de Administração Simples

ShellBeginner
Pratique Agora

Introdução

Administradores frequentemente transformam verificações repetitivas em pequenos scripts de shell. O scripting no estilo RHCSA não se trata de escrever grandes programas, mas sim de usar o Bash com segurança suficiente para automatizar tarefas comuns, validar entradas, iterar sobre alvos, retornar códigos de saída úteis e gerar saídas que outro administrador possa compreender.

Neste laboratório, você construirá um script de resumo de diretórios, passo a passo. O script aceitará caminhos de diretórios, verificará se cada caminho é utilizável, coletará informações básicas de arquivos, escreverá uma saída legível e salvará essa mesma saída em um arquivo de log.

Criar um Script Executável

Nesta etapa, você inspecionará os diretórios de exemplo e criará a primeira versão executável de um script de administração. Um script deve começar com um shebang para que o sistema saiba qual interpretador usar.

Entre no diretório do projeto.

cd /home/labex/project

Inspecione a árvore de exemplo. O comando find lista arquivos e diretórios, e o sort torna a ordem estável.

find /home/labex/project/script-practice -maxdepth 2 -print | sort

Crie a primeira versão do admin-summary.sh. A linha #!/bin/bash diz ao Linux para executar o arquivo com o Bash. A opção set -u faz com que o script falhe caso utilize uma variável não definida, o que ajuda a detectar muitos erros de digitação.

cat > /home/labex/project/admin-summary.sh <<'EOF'
#!/bin/bash
set -u

echo "RHCSA admin summary"
echo "RUN_AS=$(id -un)"
echo "HOST=$(hostname -s)"
EOF

Torne o script executável. Sem a permissão de execução, o arquivo é apenas texto.

chmod 755 /home/labex/project/admin-summary.sh

Execute o script.

/home/labex/project/admin-summary.sh

Você deverá ver o título do script, o usuário atual e o hostname curto. O hostname exato pode variar.

Aceitar Argumentos de Diretório

Nesta etapa, você adicionará parâmetros posicionais. Um script usa $# para contar argumentos e "$@" para representar todos os argumentos exatamente como foram passados.

Substitua o script por uma versão que exige pelo menos um argumento de diretório.

cat > /home/labex/project/admin-summary.sh <<'EOF'
#!/bin/bash
set -u

if [ "$#" -eq 0 ]; then
  echo "Usage: $0 DIRECTORY [DIRECTORY...]"
  exit 2
fi

echo "RHCSA admin summary"
echo "RUN_AS=$(id -un)"
echo "HOST=$(hostname -s)"

for target in "$@"; do
  echo "TARGET=$target"
done
EOF

Mantenha o script executável.

chmod 755 /home/labex/project/admin-summary.sh

Execute-o sem argumentos. O comando deve imprimir o texto de uso e retornar o status de saída 2. O operador || executa o comando à direita apenas quando o script à esquerda falha, o que permite exibir o status diferente de zero intencionalmente.

/home/labex/project/admin-summary.sh || echo "exit status: $?"

Agora, execute-o com dois argumentos de diretório.

/home/labex/project/admin-summary.sh /home/labex/project/script-practice/app /home/labex/project/script-practice/logs

A saída deve incluir uma linha TARGET= para cada argumento.

Testar Cada Alvo e Retornar um Status Útil

Nesta etapa, você adicionará um teste condicional para cada argumento. O teste [ -d "$target" ] só é bem-sucedido quando o caminho existe e é um diretório.

Substitua o script por uma versão que relata OK para diretórios e MISSING para qualquer outra coisa.

cat > /home/labex/project/admin-summary.sh <<'EOF'
#!/bin/bash
set -u

if [ "$#" -eq 0 ]; then
  echo "Usage: $0 DIRECTORY [DIRECTORY...]"
  exit 2
fi

echo "RHCSA admin summary"
echo "RUN_AS=$(id -un)"
echo "HOST=$(hostname -s)"

exit_status=0

for target in "$@"; do
  if [ -d "$target" ]; then
    echo "OK $target"
  else
    echo "MISSING $target"
    exit_status=1
  fi
done

exit "$exit_status"
EOF

Execute o script com um diretório válido. O status de saída final deve ser 0.

/home/labex/project/admin-summary.sh /home/labex/project/script-practice/app
echo "exit status: $?"

Execute-o novamente com um diretório inexistente. Desta vez, o script deve imprimir MISSING e retornar o status de saída 1.

/home/labex/project/admin-summary.sh /home/labex/project/script-practice/missing || echo "exit status: $?"

Coletar Informações Práticas do Diretório

Nesta etapa, você adicionará a substituição de comandos. A substituição de comandos executa um comando dentro de $() e armazena sua saída em uma variável.

Substitua o script por uma versão que relata a contagem de arquivos, o tamanho aparente e o proprietário para cada diretório válido.

cat > /home/labex/project/admin-summary.sh <<'EOF'
#!/bin/bash
set -u

if [ "$#" -eq 0 ]; then
  echo "Usage: $0 DIRECTORY [DIRECTORY...]"
  exit 2
fi

echo "RHCSA admin summary"
echo "RUN_AS=$(id -un)"
echo "HOST=$(hostname -s)"

exit_status=0

for target in "$@"; do
  if [ -d "$target" ]; then
    file_count="$(find "$target" -type f | wc -l)"
    size="$(du -sh "$target" | awk '{print $1}')"
    owner="$(stat -c '%U:%G' "$target")"
    echo "OK $target FILES=$file_count SIZE=$size OWNER=$owner"
  else
    echo "MISSING $target"
    exit_status=1
  fi
done

exit "$exit_status"
EOF

Execute o script nos três diretórios preparados.

/home/labex/project/admin-summary.sh /home/labex/project/script-practice/app /home/labex/project/script-practice/logs /home/labex/project/script-practice/cache

O diretório app deve mostrar FILES=3, logs deve mostrar FILES=2 e cache deve mostrar FILES=1.

Salvar a Saída em um Arquivo de Log

Nesta etapa, você adicionará uma pequena função auxiliar e um arquivo de log. Uma função evita a repetição de código, e o tee -a exibe a saída enquanto anexa a mesma linha a um arquivo.

Substitua o script pela versão final.

cat > /home/labex/project/admin-summary.sh <<'EOF'
#!/bin/bash
set -u

LOG="/home/labex/project/admin-summary.log"
: > "$LOG"

emit() {
  echo "$*" | tee -a "$LOG"
}

if [ "$#" -eq 0 ]; then
  emit "Usage: $0 DIRECTORY [DIRECTORY...]"
  exit 2
fi

emit "RHCSA admin summary"
emit "RUN_AS=$(id -un)"
emit "HOST=$(hostname -s)"

exit_status=0

for target in "$@"; do
  if [ -d "$target" ]; then
    file_count="$(find "$target" -type f | wc -l)"
    size="$(du -sh "$target" | awk '{print $1}')"
    owner="$(stat -c '%U:%G' "$target")"
    emit "OK $target FILES=$file_count SIZE=$size OWNER=$owner"
  else
    emit "MISSING $target"
    exit_status=1
  fi
done

exit "$exit_status"
EOF

Execute o script final com dois diretórios válidos e um diretório inexistente.

/home/labex/project/admin-summary.sh /home/labex/project/script-practice/app /home/labex/project/script-practice/logs /home/labex/project/script-practice/missing || echo "exit status: $?"

Inspecione o log salvo.

sed -n '1,8p' /home/labex/project/admin-summary.log

A saída do terminal e o arquivo de log devem conter as mesmas linhas de resumo. Como um alvo está faltando, o status de saída deve ser 1.

Resumo

Você criou um script de administração Bash prático. Você utilizou shebang, permissões de execução, parâmetros posicionais, contagem de argumentos, loops, testes de diretório, substituição de comandos, status de saída explícitos, uma função auxiliar e um arquivo de log. Estes são os padrões de scripting mais úteis para pequenas tarefas de administração no estilo RHCSA.