Capturando Diferentes Tipos de Saída
No passo anterior, capturamos e exibimos a saída padrão do nosso script. No entanto, ao executar scripts, existem vários tipos de saída que podemos querer capturar:
- Saída Padrão (stdout): A saída normal do script
- Erro Padrão (stderr): Mensagens de erro e avisos
- Código de Retorno (rc): O status de saída do script (0 normalmente significa sucesso, valores diferentes de zero indicam erros)
Vamos criar um novo playbook que captura e exibe todos os três tipos de saída.
Crie um novo arquivo chamado capture_all_output.yml no diretório ~/project/ansible-output-demo:
- Clique no menu "File" (Arquivo)
- Selecione "New File" (Novo Arquivo)
- Salve-o como
capture_all_output.yml no diretório ~/project/ansible-output-demo
Adicione o seguinte conteúdo ao arquivo capture_all_output.yml:
---
- name: Capture All Types of Script Output
hosts: local
gather_facts: no
tasks:
- name: Execute the info.sh script
command: "{{ playbook_dir }}/scripts/info.sh"
register: script_output
- name: Display standard output
debug:
msg: "Standard Output (stdout):"
- name: Display stdout content
debug:
var: script_output.stdout_lines
- name: Display standard error
debug:
msg: "Standard Error (stderr):"
- name: Display stderr content
debug:
var: script_output.stderr_lines
- name: Display return code
debug:
msg: "Return Code: {{ script_output.rc }}"
Este playbook executa nosso script e, em seguida, exibe:
- A saída padrão usando
script_output.stdout_lines
- O erro padrão usando
script_output.stderr_lines
- O código de retorno usando
script_output.rc
Executando o Playbook Aprimorado
Vamos executar nosso novo playbook:
cd ~/project/ansible-output-demo
ansible-playbook -i inventory capture_all_output.yml
Você deve ver uma exibição abrangente de todos os três tipos de saída:
PLAY [Capture All Types of Script Output] *****************************
TASK [Execute the info.sh script] *************************************
changed: [localhost]
TASK [Display standard output] ****************************************
ok: [localhost] => {
"msg": "Standard Output (stdout):"
}
TASK [Display stdout content] *****************************************
ok: [localhost] => {
"script_output.stdout_lines": [
"=== System Information ===",
"Hostname: ubuntu",
"Date: Tue Oct 17 12:40:22 UTC 2023",
"Kernel: 5.15.0-1031-aws",
"Memory:",
" total used free shared buff/cache available",
"Mem: 7.7Gi 1.2Gi 5.2Gi 12Mi 1.3Gi 6.3Gi",
"Swap: 0B 0B 0B",
"=== Standard Output ===",
"This is standard output",
"Hello from the script!"
]
}
TASK [Display standard error] *****************************************
ok: [localhost] => {
"msg": "Standard Error (stderr):"
}
TASK [Display stderr content] *****************************************
ok: [localhost] => {
"script_output.stderr_lines": [
"=== Standard Error ===",
"This is standard error",
"An example error message"
]
}
TASK [Display return code] ********************************************
ok: [localhost] => {
"msg": "Return Code: 0"
}
PLAY RECAP **********************************************************
localhost : ok=6 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Agora podemos ver todos os tipos de saída do nosso script:
- A saída padrão mostra informações do sistema e nossas mensagens regulares
- O erro padrão mostra nossas mensagens de erro
- O código de retorno é 0, indicando execução bem-sucedida
Criando um Script com Erros
Vamos criar um script que produzirá um erro e retornará um código de saída diferente de zero para ver como o Ansible o trata.
Crie um novo arquivo chamado error.sh no diretório scripts:
- Clique no menu "File" (Arquivo)
- Selecione "New File" (Novo Arquivo)
- Salve-o como
scripts/error.sh no diretório ~/project/ansible-output-demo
Adicione o seguinte conteúdo ao arquivo error.sh:
#!/bin/bash
## Print some standard output
echo "Starting error demonstration script"
echo "This will appear in stdout"
## Print some standard error
echo "This will appear in stderr" >&2
echo "Error: Something went wrong!" >&2
## Exit with a non-zero code to indicate error
exit 1
Torne o script executável:
chmod +x ~/project/ansible-output-demo/scripts/error.sh
Agora, vamos criar um playbook para executar este script e lidar com o erro. Crie um novo arquivo chamado handle_errors.yml:
- Clique no menu "File" (Arquivo)
- Selecione "New File" (Novo Arquivo)
- Salve-o como
handle_errors.yml no diretório ~/project/ansible-output-demo
Adicione o seguinte conteúdo ao arquivo handle_errors.yml:
---
- name: Handle Script Errors
hosts: local
gather_facts: no
tasks:
- name: Execute the error script
command: "{{ playbook_dir }}/scripts/error.sh"
register: script_output
ignore_errors: yes
- name: Display standard output
debug:
var: script_output.stdout_lines
- name: Display standard error
debug:
var: script_output.stderr_lines
- name: Display return code
debug:
msg: "Return Code: {{ script_output.rc }}"
- name: Check if script failed
debug:
msg: "The script failed with return code {{ script_output.rc }}"
when: script_output.rc != 0
Observe a adição de ignore_errors: yes, que informa ao Ansible para continuar executando o playbook mesmo que o comando falhe (retorne um código de saída diferente de zero).
Vamos executar este playbook:
ansible-playbook -i inventory handle_errors.yml
Você deve ver uma saída semelhante à seguinte:
PLAY [Handle Script Errors] *******************************************
TASK [Execute the error script] ***************************************
changed: [localhost]
TASK [Display standard output] ****************************************
ok: [localhost] => {
"script_output.stdout_lines": [
"Starting error demonstration script",
"This will appear in stdout"
]
}
TASK [Display standard error] *****************************************
ok: [localhost] => {
"script_output.stderr_lines": [
"This will appear in stderr",
"Error: Something went wrong!"
]
}
TASK [Display return code] ********************************************
ok: [localhost] => {
"msg": "Return Code: 1"
}
TASK [Check if script failed] *****************************************
ok: [localhost] => {
"msg": "The script failed with return code 1"
}
PLAY RECAP **********************************************************
localhost : ok=5 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Este exemplo demonstra como:
- Capturar a saída de um script que produz um erro
- Continuar a execução do playbook apesar do erro
- Executar condicionalmente tarefas com base no código de retorno do script
No próximo passo, exploraremos casos de uso mais avançados e as melhores práticas para trabalhar com a saída de scripts no Ansible.