Open britho opened 3 years ago
Neste exercício, você realizará a solução de problemas de um playbook fornecido que não funciona corretamente.
Resultados
Você deverá ser capaz de solucionar problemas em playbooks.
Faça login na workstation como student usando a senha student.
Na workstation, execute o script lab troubleshoot-playbook start. Ele verifica se o Ansible está instalado na workstation. Ele também cria o diretório /home/student/troubleshoot-playbook/ e faz download ali dos arquivos inventory, samba.yml e samba.conf.j2 a partir de http://materials.example.com/labs/troubleshoot-playbook/.
[student@workstation ~]$ lab troubleshoot-playbook start
Na workstation, acesse o diretório /home/student/troubleshoot-playbook/.
[student@workstation ~]$ cd ~/troubleshoot-playbook/
Crie um arquivo chamado ansible.cfg no diretório atual. Ele deve definir o parâmetro log_path para gravar logs do Ansible para o arquivo /home/student/troubleshoot-playbook/ansible.log. Ele deve definir o parâmetro inventory para usar o arquivo /home/student/troubleshoot-playbook/inventory implantado pelo script de laboratório.
Quando você terminar, ansible.cfg deverá ter os seguintes conteúdos:
[defaults]
log_path = /home/student/troubleshoot-playbook/ansible.log
inventory = /home/student/troubleshoot-playbook/inventory
Execute o playbook. Ele falhará com um erro.
Se tudo estivesse correto, esse playbook configuraria um servidor Samba. No entanto, ocorrerá uma falha na execução devido à falta de aspas na definição de variável random_var. Leia a mensagem de erro para ver como ansible-playbook relata o problema. Um valor com dois-pontos e sem aspas é atribuído à variável random_var.
[student@workstation troubleshoot-playbook]$ ansible-playbook samba.yml
ERROR! Syntax Error while loading YAML.
mapping values are not allowed in this context
The error appears to have been in '/home/student/troubleshoot-playbook/samba.yml': line 8, column 30, but may
be elsewhere in the file depending on the exact syntax problem.
The offending line appears to be:
install_state: installed
random_var: This is colon: test
^ here
Confirme se o erro foi registrado adequadamente no arquivo /home/student/troubleshoot-playbook/ansible.log.
[student@workstation troubleshoot-playbook]$ tail ansible.log
The error appears to have been in '/home/student/troubleshoot-playbook/samba.yml': line 8, column 30, but may
be elsewhere in the file depending on the exact syntax problem.
The offending line appears to be:
install_state: installed
random_var: This is colon: test
^ here
Edite o playbook para corrigir o erro adicionando aspas ao valor inteiro sendo atribuído a random_var. A versão corrigida de samba.yml deverá conter o seguinte conteúdo:
...output omitted...
vars:
install_state: installed
random_var: "This is colon: test"
...output omitted...
Verifique o playbook usando a opção --syntax-check. Outro erro ocorrerá devido ao espaço extra no recuo na última tarefa, deliver samba config.
[student@workstation troubleshoot-playbook]$ ansible-playbook --syntax-check \
> samba.yml
ERROR! Syntax Error while loading YAML.
did not find expected key
The error appears to have been in '/home/student/troubleshoot-playbook/samba.yml': line 44, column 4, but may
be elsewhere in the file depending on the exact syntax problem.
The offending line appears to be:
- name: deliver samba config
^ here
Edite o playbook e remova o espaço extra de todas as linhas na tarefa. O playbook corrigido deve aparecer conforme segue:
...output omitted...
- name: configure firewall for samba
firewalld:
state: enabled
permanent: true
immediate: true
service: samba
- name: deliver samba config
template:
src: templates/samba.conf.j2
dest: /etc/samba/smb.conf
owner: root
group: root
mode: 0644
Execute o playbook usando a opção --syntax-check. Ocorrerá um erro porque a variável install_state é usada como parâmetro na tarefa install samba. Não tem aspas.
[student@workstation troubleshoot-playbook]$ ansible-playbook --syntax-check \
> samba.yml
ERROR! Syntax Error while loading YAML.
found unacceptable key (unhashable type: 'AnsibleMapping')
The error appears to have been in '/home/student/troubleshoot-playbook/samba.yml': line 14, column 15, but may
be elsewhere in the file depending on the exact syntax problem.
The offending line appears to be:
name: samba
state: {{ install_state }}
^ here
We could be wrong, but this one looks like it might be an issue with
missing quotes. Always quote template expression brackets when they
start a value. For instance:
with_items:
- {{ foo }}
Should be written as:
with_items:
- "{{ foo }}"
Edite o playbook e corrija a tarefa install samba. A referência à variável install_state deve estar entre aspas. O conteúdo do arquivo resultante deve parecer-se com o seguinte:
...output omitted...
tasks:
- name: install samba
yum:
name: samba
state: "{{ install_state }}"
...output omitted...
Execute o playbook usando a opção --syntax-check. Ele não deve exibir erro algum de sintaxe adicional.
[student@workstation troubleshoot-playbook]$ ansible-playbook --syntax-check \
> samba.yml
playbook: samba.yml
Execute o playbook. Um erro, relacionado a SSH, será emitido.
[student@workstation troubleshoot-playbook]$ ansible-playbook samba.yml
PLAY [Install a samba server] **************************************************
TASK [Gathering Facts] *********************************************************
fatal: [servera.lab.exammple.com]: UNREACHABLE! => {"changed": false, "msg":"Failed to connect to the host via ssh: ssh: Could not resolve hostname servera.lab.exammple.com: Name or service not known\r\n", "unreachable": true}
PLAY RECAP *********************************************************************
servera.lab.exammple.com : ok=0 changed=0 unreachable=1 failed=0
Certifique-se de que o host gerenciado servera.lab.example.com esteja em execução usando o comando ping.
[student@workstation troubleshoot-playbook]$ ping -c3 servera.lab.example.com
PING servera.lab.example.com (172.25.250.10) 56(84) bytes of data.
64 bytes from servera.lab.example.com (172.25.250.10): icmp_seq=1 ttl=64 time=0.247 ms
64 bytes from servera.lab.example.com (172.25.250.10): icmp_seq=2 ttl=64 time=0.329 ms
64 bytes from servera.lab.example.com (172.25.250.10): icmp_seq=3 ttl=64 time=0.320 ms
--- servera.lab.example.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 0.247/0.298/0.329/0.041 ms
Verifique se você consegue se conectar ao host gerenciado servera.lab.example.com como o usuário devops usando SSH e se as chaves SSH corretas estão em funcionamento. Faça logout novamente quando terminar.
[student@workstation troubleshoot-playbook]$ ssh devops@servera.lab.example.com
Warning: Permanently added 'servera.lab.example.com,172.25.250.10' (ECDSA) to the list of known hosts.
...output omitted...
[devops@servera ~]$ exit
Connection to servera.lab.example.com closed.
Execute novamente o playbook com -vvvv para obter mais informações sobre a execução. Ocorrerá um erro porque o host gerenciado servera.lab.example.com não é atingível.
[student@workstation troubleshoot-playbook]$ ansible-playbook -vvvv samba.yml
...output omitted...
PLAYBOOK: samba.yml ******************************************************
1 plays in samba.yml
PLAY [Install a samba server] ********************************************
TASK [Gathering Facts] ***************************************************
task path: /home/student/troubleshoot-playbook/samba.yml:2
<servera.lab.exammple.com> ESTABLISH SSH CONNECTION FOR USER: devops
...output omitted...
fatal: [servera.lab.exammple.com]: UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: OpenSSH_7.8p1, OpenSSL 1.1.1 FIPS 11 Sep 2018\r\ndebug1: Reading configuration data /home/student/.ssh/config\r\ndebug1: /home/student/.ssh/config line 1: Applying options for *\r\ndebug1: Reading configuration data /etc/ssh/ssh_config\r\ndebug3: /etc/ssh/ssh_config line 52: Including file /etc/ssh/ssh_config.d/01-training.conf depth 0\r\ndebug1: Reading configuration data /etc/ssh/ssh_config.d/01-training.conf\r\ndebug1: /etc/ssh/ssh_config.d/01-training.conf line 1: Applying options for *\r\ndebug3: /etc/ssh/ssh_config line 52: Including file /etc/ssh/ssh_config.d/05-redhat.conf depth 0\r\ndebug1: Reading configuration data /etc/ssh/ssh_config.d/05-redhat.conf\r\ndebug3: /etc/ssh/ssh_config.d/05-redhat.conf line 2: Including file /etc/crypto-policies/back-ends/openssh.config depth 1\r\ndebug1: Reading configuration data /etc/crypto-policies/back-ends/openssh.config\r\ndebug3: gss kex names ok: [gss-gex-sha1-,gss-group14-sha1-]\r\ndebug3: kex names ok: [curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha256,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512,diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1]\r\ndebug1: /etc/ssh/ssh_config.d/05-redhat.conf line 8: Applying options for *\r\ndebug1: auto-mux: Trying existing master\r\ndebug1: Control socket \"/home/student/.ansible/cp/d4775f48c9\" does not exist\r\ndebug2: resolving \"servera.lab.exammple.com\" port 22\r\ndebug2: ssh_connect_direct\r\ndebug1: Connecting to servera.lab.exammple.com [18.211.9.206] port 22.\r\ndebug2: fd 6 setting O_NONBLOCK\r\ndebug1: connect to address 18.211.9.206 port 22: Connection timed out\r\nssh: connect to host servera.lab.exammple.com port 22: Connection timed out",
"unreachable": true
}
...output omitted...
PLAY RECAP ***************************************************************
servera.lab.exammple.com : ok=0 changed=0 unreachable=1 failed=0
Quando você usa o nível de detalhes mais alto com o Ansible, o arquivo de log do Ansible é uma opção melhor para verificar a saída do que o console. Revise a saída dos comandos anteriores no arquivo /home/student/troubleshoot-playbook/ansible.log.
[student@workstation troubleshoot-playbook]$ tail ansible.log
2018-12-17 19:22:50,508 p=18287 u=student | task path: /home/student/troubleshoot-playbook/samba.yml:2
2018-12-17 19:22:50,549 p=18287 u=student | fatal: [servera.lab.exammple.com]: UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: OpenSSH_7.8p1, OpenSSL 1.1.1 FIPS 11 Sep 2018\r\ndebug1: Reading configuration data /home/student/.ssh/config\r\ndebug1: /home/student/.ssh/config line 1: Applying options for *\r\ndebug1: Reading configuration data /etc/ssh/ssh_config\r\ndebug3: /etc/ssh/ssh_config line 52: Including file /etc/ssh/ssh_config.d/01-training.conf depth 0\r\ndebug1: Reading configuration data /etc/ssh/ssh_config.d/01-training.conf\r\ndebug1: /etc/ssh/ssh_config.d/01-training.conf line 1: Applying options for *\r\ndebug3: /etc/ssh/ssh_config line 52: Including file /etc/ssh/ssh_config.d/05-redhat.conf depth 0\r\ndebug1: Reading configuration data /etc/ssh/ssh_config.d/05-redhat.conf\r\ndebug3: /etc/ssh/ssh_config.d/05-redhat.conf line 2: Including file /etc/crypto-policies/back-ends/openssh.config depth 1\r\ndebug1: Reading configuration data /etc/crypto-policies/back-ends/openssh.config\r\ndebug3: gss kex names ok: [gss-gex-sha1-,gss-group14-sha1-]\r\ndebug3: kex names ok: [curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha256,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512,diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1]\r\ndebug1: /etc/ssh/ssh_config.d/05-redhat.conf line 8: Applying options for *\r\ndebug1: auto-mux: Trying existing master\r\ndebug1: Control socket \"/home/student/.ansible/cp/d4775f48c9\" does not exist\r\ndebug2: resolving \"servera.lab.exammple.com\" port 22\r\ndebug2: ssh_connect_direct\r\ndebug1: Connecting to servera.lab.exammple.com [18.211.9.206] port 22.\r\ndebug2: fd 6 setting O_NONBLOCK\r\ndebug1: connect to address 18.211.9.206 port 22: Connection timed out\r\nssh: connect to host servera.lab.exammple.com port 22: Connection timed out",
"unreachable": true
}
2018-12-17 19:22:50,550 p=18287 u=student | to retry, use: --limit @/home/student/troubleshoot-playbook/samba.retry
2018-12-17 19:22:50,550 p=18287 u=student | PLAY RECAP ******************
2018-12-17 19:22:50,550 p=18287 u=student | servera.lab.exammple.com : ok=0 changed=0 unreachable=1 failed=0
Verifique se há erros no arquivo inventory. O grupo [samba_servers] escreveu o nome de servera.lab.example.com errado. Corrija esse erro conforme mostrado abaixo:
...output omitted...
[samba_servers]
servera.lab.example.com
...output omitted...
Execute o playbook novamente. A tarefa debug install_state variable retorna a mensagem The state for the samba service is installed. Essa tarefa usa o módulo debug e exibe o valor da variável install_state. Um erro também é exibido na tarefa deliver samba config porque não há um arquivo samba.j2 disponível no diretório de trabalho /home/student/troubleshoot-playbook/.
[student@workstation troubleshoot-playbook]$ ansible-playbook samba.yml
PLAY [Install a samba server] **************************************************
...output omitted...
TASK [debug install_state variable] ********************************************
ok: [servera.lab.example.com] => {
"msg": "The state for the samba service is installed"
}
...output omitted...
TASK [deliver samba config] ****************************************************
fatal: [servera.lab.example.com]: FAILED! => {"changed": false, "msg": "Could not find or access 'samba.j2'\nSearched in:\n\t/home/student/troubleshoot-playbook/templates/samba.j2\n\t/home/student/troubleshoot-playbook/samba.j2\n\t/home/student/troubleshoot-playbook/templates/samba.j2\n\t/home/student/troubleshoot-playbook/samba.j2 on the Ansible Controller.\nIf you are using a module and expect the file to exist on the remote, see the remote_src option"}
...output omitted...
PLAY RECAP *********************************************************************
servera.lab.example.com : ok=7 changed=3 unreachable=0 failed=1
Edite o playbook e corrija o parâmetro src na tarefa deliver samba config para que fique samba.conf.j2. Quando você terminar, ele deverá parecer-se com o seguinte:
...output omitted...
- name: deliver samba config
template:
src: samba.conf.j2
dest: /etc/samba/smb.conf
owner: root
...output omitted...
Execute o playbook novamente. Execute o playbook usando a opção --step. Ele deverá funcionar sem erros.
[student@workstation troubleshoot-playbook]$ ansible-playbook samba.yml --step
PLAY [Install a samba server] ************************************************
Perform task: TASK: Gathering Facts (N)o/(y)es/(c)ontinue: y
...output omitted...
Perform task: TASK: install samba (N)o/(y)es/(c)ontinue: y
...output omitted...
Perform task: TASK: install firewalld (N)o/(y)es/(c)ontinue: y
...output omitted...
Perform task: TASK: debug install_state variable (N)o/(y)es/(c)ontinue: y
...output omitted...
Perform task: TASK: start samba (N)o/(y)es/(c)ontinue: y
...output omitted...
Perform task: TASK: start firewalld (N)o/(y)es/(c)ontinue: y
...output omitted...
Perform task: TASK: configure firewall for samba (N)o/(y)es/(c)ontinue: y
...output omitted...
Perform task: TASK: deliver samba config (N)o/(y)es/(c)ontinue: y
...output omitted...
PLAY RECAP *********************************************************************
servera.lab.example.com : ok=8 changed=1 unreachable=0 failed=0
Encerramento
Na workstation, execute o script lab troubleshoot-playbook finish para limpar este exercício.
[student@workstation ~]$ lab troubleshoot-playbook finish
Isso conclui o exercício orientado.
Objetivos
Depois de concluir esta seção, você deverá ser capaz de solucionar falhas em hosts gerenciados ao executar um playbook. Uso do modo de verificação como ferramenta de teste
Você pode usar o comando ansible-playbook --check para executar testes smoke em um playbook. Essa opção executa o playbook sem fazer alterações na configuração dos hosts gerenciados. Se um módulo usado dentro do playbook der suporte ao check mode, as alterações que teriam sido feitas nos hosts gerenciados serão exibidas, mas não realizadas. Se o modo de verificação não for suportado por um módulo, as alterações não serão exibidas, mas o módulo ainda não executará nenhuma ação.
[student@demo ~]$ ansible-playbook --check playbook.yml
O comando ansible-playbook --check poderá não funcionar corretamente se as suas tarefas usarem condicionais.
Você também pode controlar se as tarefas individuais são executadas no modo de verificação com a configuração check_mode. Se uma tarefa tiver check_mode: yes definido, ela sempre será executada no modo de verificação, independentemente de você ter passado a opção --check para ansible-playbook. Da mesma forma, se uma tarefa tiver check_mode: no definido, ela sempre será executada normalmente, mesmo se você passar --check para ansible-playbook.
A tarefa a seguir é sempre executada no modo de verificação e não faz alterações.
tasks:
A tarefa a seguir sempre é executada normalmente, mesmo quando iniciada com ansible-playbook --check.
tasks:
Isso pode ser útil porque você pode executar a maior parte de um playbook normalmente ao testar tarefas individuais com check_mode: yes. Da mesma forma, você pode fazer as execuções de teste no modo de verificação serem mais propensas a fornecer resultados razoáveis executando tarefas selecionadas que coletam fatos ou definem variáveis para condicionais, mas não alteram os hosts gerenciados com check_mode: no.
Uma tarefa pode determinar se o playbook está sendo executado no modo de verificação testando o valor da variável mágica ansible_check_mode. Essa variável booleana é definida como verdadeira se o playbook estiver sendo executado no modo de verificação.
Tarefas que têm check_mode: no definido serão executadas mesmo quando o playbook é executado com ansible-playbook --check. Portanto, você não pode confiar que a opção --check não fará alterações nos hosts gerenciados sem confirmar que esse é o caso inspecionando o playbook e quaisquer funções ou tarefas associadas a ele.
Se você tiver playbooks mais antigos que usam always_run: yes para forçar as tarefas a serem executadas normalmente mesmo no modo de verificação, você precisará substituir esse código com check_mode: no no Ansible2.6 e posteriores.
O comando ansible-playbook também fornece uma opção --diff. Essa opção relata as alterações feitas nos arquivos de modelo em hosts gerenciados. Se forem usadas com a opção --check, essas alterações serão exibidas na saída do comando, mas, na verdade, não serão feitas.
[student@demo ~]$ ansible-playbook --check --diff playbook.yml
Testes com módulos
Alguns módulos podem fornecer informações adicionais sobre qual é o status de um host gerenciado. A lista a seguir inclui alguns dos módulos do Ansible que podem ser usados para problemas de teste e depuração em hosts gerenciados.
O módulo uri fornece um modo de verificar se uma API RESTful está retornando o conteúdo necessário.
tasks:
- uri:
url: http://api.myapp.com
return_content: yes
register: apiresponse
- fail:
msg: 'version was not provided'
when: "'version' not in apiresponse.content"
O módulo script dá suporte à execução de um script em hosts gerenciados e apresentará falha se o código de retorno desse script for diferente de zero. O script deve existir no nó de controle e é transferido e executado nos hosts gerenciados.
tasks:
- script: check_free_memory
O módulo stat reúne fatos para um arquivo, de forma muito semelhante ao comando stat. Você pode usá-lo para registrar uma variável e, depois, testar para determinar se o arquivo existe ou para obter outras informações sobre o arquivo. Se o arquivo não existir, a tarefa stat não apresentará falha, mas sua variável registrada relatará falso para *.stat.exists.
Neste exemplo, um aplicativo ainda está em execução se /var/run/app.lock existe, caso em que a ação deve ser cancelada.
tasks:
- name: Check if /var/run/app.lock exists
stat:
path: /var/run/app.lock
register: lock
- name: Fail if the application is running
fail:
when: lock.stat.exists
O módulo assert é uma alternativa para o módulo failed. O módulo assert é compatível com uma opção that que recebe uma lista de condicionais. Se alguma dessas condicionais for falsa, a tarefa falhará. Você pode usar as opções success_msg e fail_msg para personalizar a mensagem impressa para quando ela reportar sucesso ou falha.
O exemplo a seguir repete o anterior, mas usa assert em vez de fail.
tasks:
- name: Check if /var/run/app.lock exists
stat:
path: /var/run/app.lock
register: lock
- name: Fail if the application is running
assert:
that:
- not lock.stat.exists
Solução de problemas de conexões
Muitos problemas comuns ao usar o Ansible para gerenciar hosts estão associados a conexões com o host e a problemas de configuração em relação ao escalonamento de privilégios e usuários remotos.
Se você estiver enfrentando problemas ao autenticação em um host gerenciado, certifique-se de que definiu remote_user corretamente no arquivo de configuração ou na ação. Você também deve confirmar se tem as chaves SSH corretas configuradas ou se está fornecendo a senha correta para esse usuário.
Certifique-se de que become está definido corretamente e que você está usando o become_user correto (ou seja, root por padrão). Você deve confirmar que está inserindo a senha sudo corretamente e que o sudo no host gerenciado está configurado corretamente.
Há um problema mais sutil relacionado às configurações de inventário. Para um servidor complexo com vários endereços de rede, talvez seja necessário usar um endereço específico ou um nome DNS ao se conectar a esse sistema. Talvez não seja recomendado usar esse endereço como nome de inventário da máquina para melhor legibilidade. Você pode definir uma variável de inventário de host, ansible_host, que substituirá o nome do inventário por um nome ou endereço IP diferente e será usado pelo Ansible para se conectar a esse host. Essa variável pode ser definida no arquivo host_vars ou diretório para esse host, ou pode ser definida no próprio arquivo de inventário.
Por exemplo, a seguinte entrada de inventário configura o Ansible para se conectar a 192.0.2.4 ao processar o host web4.phx.example.com:
web4.phx.example.com ansible_host=192.0.2.4
Essa é uma maneira útil de controlar como o Ansible se conecta a hosts gerenciados. No entanto, ela também pode causar problemas se o valor de ansible_host estiver incorreto. Teste de hosts gerenciados usando comandos ad hoc
Os exemplos a seguir mostram algumas das verificações que podem ser feitas em um host gerenciado pelo uso de comandos ad hoc.
Você usou o módulo ping para testar se você pode se conectar a hosts gerenciados. Dependendo das opções que você passar, você também pode usá-lo para testar se o escalonamento de privilégios e as credenciais estão configurados corretamente.
[student@demo ~]$ ansible demohost -m ping demohost | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": false, "ping": "pong" } [student@demo ~]$ ansible demohost -m ping --become demohost | FAILED! => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": false, "module_stderr": "sudo: a password is required\n", "module_stdout": "", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 1 }
Esse exemplo retorna o espaço atualmente disponível nos discos configurados no host gerenciado demohost. Isso pode ser útil para confirmar que o sistema de arquivos no host gerenciado não está cheio.
[student@demo ~]$ ansible demohost -m command -a 'df'
Esse exemplo retorna a memória livre que está atualmente disponível no host gerenciado demohost.
[student@demo ~]$ ansible demohost -m command -a 'free -m'
O nível correto de teste
O Ansible foi projetado para garantir que a configuração incluída nos playbooks e realizada por seus módulos esteja correta. Ela monitora todos os módulos para falhas relatadas e interrompe o playbook imediatamente se alguma falha é encontrada. Isso ajuda a garantir que qualquer tarefa executada antes da falha não tenha erros.
Por causa disso, geralmente não há necessidade de verificar se o resultado de uma tarefa gerenciada pelo Ansible foi corretamente aplicada aos hosts gerenciados. Uma opção é adicionar algumas verificações de integridade a playbooks ou executá-las diretamente como comandos ad hoc quando uma solução de problemas mais direta é necessária. Mas você deve ter cuidado ao adicionar muita complexidade às suas tarefas e ações a fim de verificar novamente os testes realizados pelos próprios módulos.
Check Mode ("Dry Run") -- Ansible Documentation
Testing Strategies -- Ansible Documentation
Neste exercício, você solucionará as falhas de tarefas que estão ocorrendo em um dos seus hosts gerenciados ao executar um playbook.
Resultados
Você deve ser capaz de solucionar problemas de hosts gerenciados.
Faça login na workstation como student usando a senha student.
Na workstation, execute o script lab troubleshoot-host start. Ele garante que o Ansible seja instalado na workstation. Ele também faz o download dos arquivos inventory, mailrelay.yml e postfix-relay-main.conf.j2 do http://materials.example.com/troubleshoot-host/ para o diretório /home/student/troubleshoot-host/.
[student@workstation ~]$ lab troubleshoot-host start
Em workstation, acesse o diretório /home/student/troubleshoot-host/.
[student@workstation ~]$ cd ~/troubleshoot-host/
Execute o playbook mailrelay.yml no modo de verificação.
[student@workstation troubleshoot-host]$ ansible-playbook mailrelay.yml --check
PLAY [create mail relay servers] ***********************************************
...output omitted...
TASK [check main.cf file] ******************************************************
ok: [servera.lab.example.com]
TASK [verify main.cf file exists] **********************************************
ok: [servera.lab.example.com] => {
"msg": "The main.cf file exists"
}
...output omitted...
TASK [email notification of always_bcc config] *********************************
fatal: [servera.lab.example.com]: FAILED! => {"msg": "The conditional check 'bcc_state.stdout != 'always_bcc ='' failed. The error was: error while evaluating conditional (bcc_state.stdout != 'always_bcc ='): 'dict object' has no attribute 'stdout'\n\nThe error appears to have been in '/home/student/troubleshoot-host/mailrelay.yml': line 42, column 7, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n - name: email notification of always_bcc config\n ^ here\n"}
...output omitted...
PLAY RECAP *********************************************************************
servera.lab.example.com : ok=6 changed=3 unreachable=0 failed=1
A tarefa verify main.cf file exists usa o módulo stat. Ela confirmou que o main.cf existe no servera.lab.example.com.
A tarefa email notification of always_bcc config apresentou falha. Ela não recebeu a saída da tarefa check for always_bcc porque o playbook foi executado com o modo de verificação.
Usando um comando ad hoc, verifique o cabeçalho do arquivo /etc/postfix/main.cf.
[student@workstation troubleshoot-host]$ ansible servera.lab.example.com \
> -u devops -b -a "head /etc/postfix/main.cf"
servera.lab.example.com | FAILED | rc=1 >>
head: cannot open ‘/etc/postfix/main.cf’ for reading: No such file or directorynon-zero return code
Ocorreu falha no comando porque o playbook foi executado usando o modo de verificação. O Postfix não está instalado no servera.lab.example.com
Execute novamente o playbook, mas sem especificar o modo de verificação. O erro na tarefa email notification of always_bcc config deve desaparecer.
[student@workstation troubleshoot-host]$ ansible-playbook mailrelay.yml
PLAY [create mail relay servers] ***********************************************
...output omitted...
TASK [check for always_bcc] ****************************************************
changed: [servera.lab.example.com]
TASK [email notification of always_bcc config] *********************************
skipping: [servera.lab.example.com]
RUNNING HANDLER [restart postfix] **********************************************
changed: [servera.lab.example.com]
PLAY RECAP *********************************************************************
servera.lab.example.com : ok=8 changed=5 unreachable=0 failed=0
skipped=1 rescued=0 ignored=0
Usando um comando ad hoc, exiba a parte superior do arquivo /etc/postfix/main.cf.
[student@workstation troubleshoot-host]$ ansible servera.lab.example.com \
> -u devops -b -a "head /etc/postfix/main.cf"
servera.lab.example.com | SUCCESS | rc=0 >>
# Ansible managed
#
# Global Postfix configuration file. This file lists only a subset
# of all parameters. For the syntax, and for a complete parameter
# list, see the postconf(5) manual page (command: "man 5 postconf").
#
# For common configuration examples, see BASIC_CONFIGURATION_README
# and STANDARD_CONFIGURATION_README. To find these documents, use
# the command "postconf html_directory readme_directory", or go to
# http://www.postfix.org/BASIC_CONFIGURATION_README.html etc.
Agora, ele começa com uma linha que contém a string Ansible managed. Esse arquivo foi atualizado e agora é gerenciado pelo Ansible.
Adicione uma tarefa para habilitar o serviço smtp pelo firewall.
[student@workstation troubleshoot-host]$ vim mailrelay.yml
...output omitted...
- name: postfix firewalld config
firewalld:
state: enabled
permanent: true
immediate: true
service: smtp
...output omitted...
Execute o playbook. A tarefa postfix firewalld config deve ser executada sem erros.
[student@workstation troubleshoot-host]$ ansible-playbook mailrelay.yml
PLAY [create mail relay servers] ***********************************************
...output omitted...
TASK [postfix firewalld config] ************************************************
changed: [servera.lab.example.com]
PLAY RECAP *********************************************************************
servera.lab.example.com : ok=8 changed=2 unreachable=0 failed=0
skipped=1 rescued=0 ignored=0
Usando um comando ad hoc, verifique se o serviço smtp agora está configurado no firewall no servera.lab.example.com.
[student@workstation troubleshoot-host]$ ansible servera.lab.example.com \
> -u devops -b -a "firewall-cmd --list-services"
servera.lab.example.com | CHANGED | rc=0 >>
cockpit dhcpv6-client samba smtp ssh
Use telnet para testar se o serviço SMTP está ouvindo na porta TCP/25 no servera.lab.example.com. Desconecte-o depois de concluir.
[student@workstation troubleshoot-host]$ telnet servera.lab.example.com 25
Trying 172.25.250.10...
Connected to servera.lab.example.com.
Escape character is '^]'.
220 servera.lab.example.com ESMTP Postfix
quit
221 2.0.0 Bye
Connection closed by foreign host.
Encerramento
Na workstation, execute o script lab troubleshoot-host finish para limpar este exercício.
[student@workstation ~]$ lab troubleshoot-host finish
Isso conclui o exercício orientado.
Lista de verificação de desempenho
Neste laboratório, você solucionará problemas que ocorrem ao tentar executar um playbook que foi fornecido a você.
Resultados
Você deverá ser capaz de:
Solucionar problemas de playbooks.
Solucionar problemas de hosts gerenciados.
Faça login na workstation como student usando a senha student. Execute o comando lab troubleshoot-review start.
[student@workstation ~]$ lab troubleshoot-review start
Esse script verifica se o Ansible está instalado na workstation e cria o diretório ~student/troubleshoot-review/html/. Ele faz o download dos arquivos ansible.cfg, inventory-lab, secure-web.yml e vhosts.conf do http://materials.example.com/labs/troubleshoot-review/ para o diretório /home/student/troubleshoot-review/. Ele também faz o download do arquivo index.html para o diretório /home/student/troubleshoot-review/html/.
No diretório ~/troubleshoot-review, verifique a sintaxe do playbook secure-web.yml. Este manual contém uma ação que configura o Apache HTTPD com TLS/SSL para hosts no grupo webservers. Corrija o problema relatado.
Na workstation, mude para o diretório do projeto /home/student/troubleshoot-review.
[student@workstation ~]$ cd ~/troubleshoot-review/
Verifique a sintaxe do playbook secure-web.yml. Este playbook configura o Apache HTTPD com TLS/SSL para hosts no grupo webservers quando tudo está correto.
[student@workstation troubleshoot-review]$ ansible-playbook --syntax-check \
> secure-web.yml
ERROR! Syntax Error while loading YAML.
mapping values are not allowed in this context
The error appears to have been in '/home/student/Ansible-course/troubleshoot-review/secure-web.yml': line 7, column 30, but may
be elsewhere in the file depending on the exact syntax problem.
The offending line appears to be:
vars:
random_var: This is colon: test
^ here
Corrija o problema de sintaxe na definição da variável random_var adicionando aspas duplas à string This is colon: test. A alteração resultante deve aparecer da seguinte maneira:
...output omitted...
vars:
random_var: "This is colon: test"
...output omitted...
Verifique a sintaxe do playbook secure-web.yml novamente. Corrija o problema relatado.
Verifique a sintaxe de secure-web.yml usando ansible-playbook --syntax-check novamente.
[student@workstation troubleshoot-review]$ ansible-playbook --syntax-check \
> secure-web.yml
ERROR! Syntax Error while loading YAML.
did not find expected '-' indicator
The error appears to have been in '/home/student/Ansible-course/troubleshoot-review/secure-web.yml': line 38, column 10, but may
be elsewhere in the file depending on the exact syntax problem.
The offending line appears to be:
- name: start and enable web services
^ here
Corrija todos os problemas de sintaxe no recuo. Remova o espaço adicional no início dos elementos da tarefa start and enable web services. A alteração resultante deve aparecer da seguinte maneira:
...output omitted...
args:
creates: /etc/pki/tls/certs/serverb.lab.example.com.crt
- name: start and enable web services
service:
name: httpd
state: started
enabled: yes
- name: deliver content
copy:
dest: /var/www/vhosts/serverb-secure
src: html/
...output omitted...
Verifique a sintaxe do playbook secure-web.yml uma terceira vez. Corrija o problema relatado.
Verifique a sintaxe do playbook secure-web.yml.
[student@workstation troubleshoot-review]$ ansible-playbook --syntax-check \
> secure-web.yml
ERROR! Syntax Error while loading YAML.
found unacceptable key (unhashable type: 'AnsibleMapping')
The error appears to have been in '/home/student/Ansible-course/troubleshoot-review/secure-web.yml': line 13, column 20, but may
be elsewhere in the file depending on the exact syntax problem.
The offending line appears to be:
yum:
name: {{ item }}
^ here
We could be wrong, but this one looks like it might be an issue with
missing quotes. Always quote template expression brackets when they
start a value. For instance:
with_items:
- {{ foo }}
Should be written as:
with_items:
- "{{ foo }}"
Corrija a variável item na tarefa install web server packages. Adicione aspas duplas ao {{ item }}. A alteração resultante deve aparecer da seguinte maneira:
...output omitted...
- name: install web server packages
yum:
name: "{{ item }}"
state: latest
notify:
- restart services
loop:
- httpd
- mod_ssl
...output omitted...
Verifique a sintaxe do playbook secure-web.yml uma quarta vez. Ele não deve exibir erro algum de sintaxe.
Verifique a sintaxe do playbook secure-web.yml. Ele não deve exibir erro algum de sintaxe.
[student@workstation troubleshoot-review]$ ansible-playbook --syntax-check \
> secure-web.yml
playbook: secure-web.yml
Execute o playbook secure-web.yml. O Ansible não consegue se conectar a serverb.lab.example.com. Corrija esse problema.
Execute o playbook secure-web.yml. Ele falhará com um erro.
[student@workstation troubleshoot-review]$ ansible-playbook secure-web.yml
PLAY [create secure web service] ***********************************************
TASK [Gathering Facts] *********************************************************
fatal: [serverb.lab.example.com]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: students@serverc.lab.example.com: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).", "unreachable": true}
PLAY RECAP *********************************************************************
serverb.lab.example.com : ok=0 changed=0 unreachable=1 failed=0
Execute o playbook secure-web.yml novamente, adicionando o parâmetro -vvvv para aumentar o detalhamento da saída.
Observe que a conexão parece estar estabelecida com serverc.lab.example.com em vez de serverb.lab.example.com.
[student@workstation troubleshoot-review]$ ansible-playbook secure-web.yml -vvvv
...output omitted...
TASK [Gathering Facts] *********************************************************
task path: /home/student/troubleshoot-review/secure-web.yml:3
<serverc.lab.example.com> ESTABLISH SSH CONNECTION FOR USER: students
<serverc.lab.example.com> SSH: EXEC ssh -vvv -C -o ControlMaster=auto -o ControlPersist=60s -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o User=students -o ConnectTimeout=10 -o ControlPath=/home/student/.ansible/cp/bc0c05136a serverc.lab.example.com '/bin/sh -c '"'"'echo ~students && sleep 0'"'"''
...output omitted...
Corrija a linha no arquivo inventory-lab. Exclua a variável de host ansible_host para que o arquivo apareça conforme mostrado abaixo:
[webservers]
serverb.lab.example.com
Execute o playbook secure-web.yml novamente. O Ansible deve autenticar como usuário remoto devops no host gerenciado. Corrija esse problema.
Execute o playbook secure-web.yml.
[student@workstation troubleshoot-review]$ ansible-playbook secure-web.yml -vvvv
...output omitted...
TASK [Gathering Facts] *********************************************************
task path: /home/student/troubleshoot-review/secure-web.yml:3
<serverb.lab.example.com> ESTABLISH SSH CONNECTION FOR USER: students
<serverb.lab.example.com> EXEC ssh -C -vvv -o ControlMaster=auto
-o ControlPersist=60s -o Port=22 -o KbdInteractiveAuthentication=no
-o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey
-o PasswordAuthentication=no -o User=students -o ConnectTimeout=10
-o ControlPath=/home/student/.ansible/cp/ansible-ssh-%C -tt
serverb.lab.example.com '/bin/sh -c '"'"'( umask 22 && mkdir -p "`
echo $HOME/.ansible/tmp/ansible-tmp-1460241127.16-3182613343880 `" &&
echo "` echo $HOME/.ansible/tmp/ansible-tmp-1460241127.16-3182613343880 `" )'"'"''
...output omitted...
fatal: [serverb.lab.example.com]: UNREACHABLE! => {
...output omitted...
Edite o playbook secure-web.yml para se certificar de que o devops é o remote_user para a ação. As primeiras linhas do playbook deverão ser exibidas como a seguir:
---
# start of secure web server playbook
- name: create secure web service
hosts: webservers
remote_user: devops
...output omitted...
Execute o playbook secure-web.yml uma terceira vez. Corrija o problema relatado.
Execute o playbook secure-web.yml.
[student@workstation troubleshoot-review]$ ansible-playbook secure-web.yml -vvvv
...output omitted...
failed: [serverb.lab.example.com] (item=mod_ssl) => {
"ansible_loop_var": "item",
"changed": false,
"invocation": {
"module_args": {
"allow_downgrade": false,
"autoremove": false,
...output omitted...
"validate_certs": true
}
},
"item": "mod_ssl",
"msg": "This command has to be run under the root user.",
"results": []
}
...output omitted...
Edite a ação para se certificar de que ela tem become: true ou become: yes definido. A alteração resultante deve aparecer da seguinte maneira:
---
# start of secure web server playbook
- name: create secure web service
hosts: webservers
remote_user: devops
become: true
...output omitted...
Execute o playbook secure-web.yml mais uma vez. Ele deve ser concluído com êxito. Use um comando ad hoc para verificar se o serviço httpd está em execução.
Execute o playbook secure-web.yml.
[student@workstation troubleshoot-review]$ ansible-playbook secure-web.yml
PLAY [create secure web service] ***********************************************
...output omitted...
TASK [install web server packages] *********************************************
changed: [serverb.lab.example.com] => (item=httpd)
changed: [serverb.lab.example.com] => (item=mod_ssl)
...output omitted...
TASK [httpd_conf_syntax variable] **********************************************
ok: [serverb.lab.example.com] => {
"msg": "The httpd_conf_syntax variable value is {'stderr_lines': [u'Syntax OK'], u'changed': True, u'end': u'2018-12-17 23:31:53.191871', 'failed': False, u'stdout': u'', u'cmd': [u'/sbin/httpd', u'-t'], u'rc': 0, u'start': u'2018-12-17 23:31:53.149759', u'stderr': u'Syntax OK', u'delta': u'0:00:00.042112', 'stdout_lines': [], 'failed_when_result': False}"
}
...output omitted...
RUNNING HANDLER [restart services] *********************************************
changed: [serverb.lab.example.com]
PLAY RECAP *********************************************************************
serverb.lab.example.com : ok=10 changed=7 unreachable=0 failed=0
Use um comando ad hoc para determinar o estado do serviço httpd no serverb.lab.example.com. O serviço httpd agora deve estar em execução no serverb.lab.example.com.
[student@workstation troubleshoot-review]$ ansible all -u devops -b \
> -m command -a 'systemctl status httpd'
serverb.lab.example.com | CHANGED | rc=0 >>
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
Active: active (running) since Thu 2019-04-11 03:22:34 EDT; 28s ago
...output omitted...
Avaliação
Na workstation, execute o script lab troubleshoot-review grade para confirmar a conclusão com êxito deste exercício.
[student@workstation ~]$ lab troubleshoot-review grade
Encerramento
Na workstation, execute o script lab troubleshoot-review finish para limpar este laboratório.
[student@workstation ~]$ lab troubleshoot-review finish
Isso conclui o laboratório.
Lista de verificação de desempenho
Neste laboratório, você solucionará problemas que ocorrem ao tentar executar um playbook que foi fornecido a você.
Resultados
Você deverá ser capaz de:
Solucionar problemas de playbooks.
Solucionar problemas de hosts gerenciados.
Faça login na workstation como student usando a senha student. Execute o comando lab troubleshoot-review start.
[student@workstation ~]$ lab troubleshoot-review start
Esse script verifica se o Ansible está instalado na workstation e cria o diretório ~student/troubleshoot-review/html/. Ele faz o download dos arquivos ansible.cfg, inventory-lab, secure-web.yml e vhosts.conf do http://materials.example.com/labs/troubleshoot-review/ para o diretório /home/student/troubleshoot-review/. Ele também faz o download do arquivo index.html para o diretório /home/student/troubleshoot-review/html/.
No diretório ~/troubleshoot-review, verifique a sintaxe do playbook secure-web.yml. Este manual contém uma ação que configura o Apache HTTPD com TLS/SSL para hosts no grupo webservers. Corrija o problema relatado.
Na workstation, mude para o diretório do projeto /home/student/troubleshoot-review.
[student@workstation ~]$ cd ~/troubleshoot-review/
Verifique a sintaxe do playbook secure-web.yml. Este playbook configura o Apache HTTPD com TLS/SSL para hosts no grupo webservers quando tudo está correto.
[student@workstation troubleshoot-review]$ ansible-playbook --syntax-check \
> secure-web.yml
ERROR! Syntax Error while loading YAML.
mapping values are not allowed in this context
The error appears to have been in '/home/student/Ansible-course/troubleshoot-review/secure-web.yml': line 7, column 30, but may
be elsewhere in the file depending on the exact syntax problem.
The offending line appears to be:
vars:
random_var: This is colon: test
^ here
Corrija o problema de sintaxe na definição da variável random_var adicionando aspas duplas à string This is colon: test. A alteração resultante deve aparecer da seguinte maneira:
...output omitted...
vars:
random_var: "This is colon: test"
...output omitted...
Verifique a sintaxe do playbook secure-web.yml novamente. Corrija o problema relatado.
Verifique a sintaxe de secure-web.yml usando ansible-playbook --syntax-check novamente.
[student@workstation troubleshoot-review]$ ansible-playbook --syntax-check \
> secure-web.yml
ERROR! Syntax Error while loading YAML.
did not find expected '-' indicator
The error appears to have been in '/home/student/Ansible-course/troubleshoot-review/secure-web.yml': line 38, column 10, but may
be elsewhere in the file depending on the exact syntax problem.
The offending line appears to be:
- name: start and enable web services
^ here
Corrija todos os problemas de sintaxe no recuo. Remova o espaço adicional no início dos elementos da tarefa start and enable web services. A alteração resultante deve aparecer da seguinte maneira:
...output omitted...
args:
creates: /etc/pki/tls/certs/serverb.lab.example.com.crt
- name: start and enable web services
service:
name: httpd
state: started
enabled: yes
- name: deliver content
copy:
dest: /var/www/vhosts/serverb-secure
src: html/
...output omitted...
Verifique a sintaxe do playbook secure-web.yml uma terceira vez. Corrija o problema relatado.
Verifique a sintaxe do playbook secure-web.yml.
[student@workstation troubleshoot-review]$ ansible-playbook --syntax-check \
> secure-web.yml
ERROR! Syntax Error while loading YAML.
found unacceptable key (unhashable type: 'AnsibleMapping')
The error appears to have been in '/home/student/Ansible-course/troubleshoot-review/secure-web.yml': line 13, column 20, but may
be elsewhere in the file depending on the exact syntax problem.
The offending line appears to be:
yum:
name: {{ item }}
^ here
We could be wrong, but this one looks like it might be an issue with
missing quotes. Always quote template expression brackets when they
start a value. For instance:
with_items:
- {{ foo }}
Should be written as:
with_items:
- "{{ foo }}"
Corrija a variável item na tarefa install web server packages. Adicione aspas duplas ao {{ item }}. A alteração resultante deve aparecer da seguinte maneira:
...output omitted...
- name: install web server packages
yum:
name: "{{ item }}"
state: latest
notify:
- restart services
loop:
- httpd
- mod_ssl
...output omitted...
Verifique a sintaxe do playbook secure-web.yml uma quarta vez. Ele não deve exibir erro algum de sintaxe.
Verifique a sintaxe do playbook secure-web.yml. Ele não deve exibir erro algum de sintaxe.
[student@workstation troubleshoot-review]$ ansible-playbook --syntax-check \
> secure-web.yml
playbook: secure-web.yml
Execute o playbook secure-web.yml. O Ansible não consegue se conectar a serverb.lab.example.com. Corrija esse problema.
Execute o playbook secure-web.yml. Ele falhará com um erro.
[student@workstation troubleshoot-review]$ ansible-playbook secure-web.yml
PLAY [create secure web service] ***********************************************
TASK [Gathering Facts] *********************************************************
fatal: [serverb.lab.example.com]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: students@serverc.lab.example.com: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).", "unreachable": true}
PLAY RECAP *********************************************************************
serverb.lab.example.com : ok=0 changed=0 unreachable=1 failed=0
Execute o playbook secure-web.yml novamente, adicionando o parâmetro -vvvv para aumentar o detalhamento da saída.
Observe que a conexão parece estar estabelecida com serverc.lab.example.com em vez de serverb.lab.example.com.
[student@workstation troubleshoot-review]$ ansible-playbook secure-web.yml -vvvv
...output omitted...
TASK [Gathering Facts] *********************************************************
task path: /home/student/troubleshoot-review/secure-web.yml:3
<serverc.lab.example.com> ESTABLISH SSH CONNECTION FOR USER: students
<serverc.lab.example.com> SSH: EXEC ssh -vvv -C -o ControlMaster=auto -o ControlPersist=60s -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o User=students -o ConnectTimeout=10 -o ControlPath=/home/student/.ansible/cp/bc0c05136a serverc.lab.example.com '/bin/sh -c '"'"'echo ~students && sleep 0'"'"''
...output omitted...
Corrija a linha no arquivo inventory-lab. Exclua a variável de host ansible_host para que o arquivo apareça conforme mostrado abaixo:
[webservers]
serverb.lab.example.com
Execute o playbook secure-web.yml novamente. O Ansible deve autenticar como usuário remoto devops no host gerenciado. Corrija esse problema.
Execute o playbook secure-web.yml.
[student@workstation troubleshoot-review]$ ansible-playbook secure-web.yml -vvvv
...output omitted...
TASK [Gathering Facts] *********************************************************
task path: /home/student/troubleshoot-review/secure-web.yml:3
<serverb.lab.example.com> ESTABLISH SSH CONNECTION FOR USER: students
<serverb.lab.example.com> EXEC ssh -C -vvv -o ControlMaster=auto
-o ControlPersist=60s -o Port=22 -o KbdInteractiveAuthentication=no
-o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey
-o PasswordAuthentication=no -o User=students -o ConnectTimeout=10
-o ControlPath=/home/student/.ansible/cp/ansible-ssh-%C -tt
serverb.lab.example.com '/bin/sh -c '"'"'( umask 22 && mkdir -p "`
echo $HOME/.ansible/tmp/ansible-tmp-1460241127.16-3182613343880 `" &&
echo "` echo $HOME/.ansible/tmp/ansible-tmp-1460241127.16-3182613343880 `" )'"'"''
...output omitted...
fatal: [serverb.lab.example.com]: UNREACHABLE! => {
...output omitted...
Edite o playbook secure-web.yml para se certificar de que o devops é o remote_user para a ação. As primeiras linhas do playbook deverão ser exibidas como a seguir:
---
# start of secure web server playbook
- name: create secure web service
hosts: webservers
remote_user: devops
...output omitted...
Execute o playbook secure-web.yml uma terceira vez. Corrija o problema relatado.
Execute o playbook secure-web.yml.
[student@workstation troubleshoot-review]$ ansible-playbook secure-web.yml -vvvv
...output omitted...
failed: [serverb.lab.example.com] (item=mod_ssl) => {
"ansible_loop_var": "item",
"changed": false,
"invocation": {
"module_args": {
"allow_downgrade": false,
"autoremove": false,
...output omitted...
"validate_certs": true
}
},
"item": "mod_ssl",
"msg": "This command has to be run under the root user.",
"results": []
}
...output omitted...
Edite a ação para se certificar de que ela tem become: true ou become: yes definido. A alteração resultante deve aparecer da seguinte maneira:
---
# start of secure web server playbook
- name: create secure web service
hosts: webservers
remote_user: devops
become: true
...output omitted...
Execute o playbook secure-web.yml mais uma vez. Ele deve ser concluído com êxito. Use um comando ad hoc para verificar se o serviço httpd está em execução.
Execute o playbook secure-web.yml.
[student@workstation troubleshoot-review]$ ansible-playbook secure-web.yml
PLAY [create secure web service] ***********************************************
...output omitted...
TASK [install web server packages] *********************************************
changed: [serverb.lab.example.com] => (item=httpd)
changed: [serverb.lab.example.com] => (item=mod_ssl)
...output omitted...
TASK [httpd_conf_syntax variable] **********************************************
ok: [serverb.lab.example.com] => {
"msg": "The httpd_conf_syntax variable value is {'stderr_lines': [u'Syntax OK'], u'changed': True, u'end': u'2018-12-17 23:31:53.191871', 'failed': False, u'stdout': u'', u'cmd': [u'/sbin/httpd', u'-t'], u'rc': 0, u'start': u'2018-12-17 23:31:53.149759', u'stderr': u'Syntax OK', u'delta': u'0:00:00.042112', 'stdout_lines': [], 'failed_when_result': False}"
}
...output omitted...
RUNNING HANDLER [restart services] *********************************************
changed: [serverb.lab.example.com]
PLAY RECAP *********************************************************************
serverb.lab.example.com : ok=10 changed=7 unreachable=0 failed=0
Use um comando ad hoc para determinar o estado do serviço httpd no serverb.lab.example.com. O serviço httpd agora deve estar em execução no serverb.lab.example.com.
[student@workstation troubleshoot-review]$ ansible all -u devops -b \
> -m command -a 'systemctl status httpd'
serverb.lab.example.com | CHANGED | rc=0 >>
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
Active: active (running) since Thu 2019-04-11 03:22:34 EDT; 28s ago
...output omitted...
Avaliação
Na workstation, execute o script lab troubleshoot-review grade para confirmar a conclusão com êxito deste exercício.
[student@workstation ~]$ lab troubleshoot-review grade
Encerramento
Na workstation, execute o script lab troubleshoot-review finish para limpar este laboratório.
[student@workstation ~]$ lab troubleshoot-review finish
Isso conclui o laboratório.
Neste capítulo, você aprendeu que:
O Ansible fornece registro integrado. Esse recurso não está habilitado por padrão.
O parâmetro log_path na seção default do arquivo de configuração ansible.cfg especifica o local do arquivo de log para o qual a saída do Ansible é redirecionada.
O módulo debug oferece informações adicionais para depuração ao executar um playbook (por exemplo, valor atual de uma variável).
Objetivos
Depois de concluir esta seção, você deverá ser capaz de solucionar problemas genéricos com um novo playbook e repará-los.
Arquivos de log para o Ansible
Por padrão, o RedHat Ansible Engine não está configurado para registrar sua saída em nenhum arquivo de log. Ele fornece uma infraestrutura de registro integrada que pode ser configurada por meio do parâmetro
log_path
na seçãodefault
do arquivo de configuraçãoansible.cfg
ou por meio da variável de ambiente$ANSIBLE_LOG_PATH
. Se qualquer um deles ou ambos forem configurados, o Ansible armazena a saída dos comandos ansible e ansible-playbook no arquivo de log configurado, por meio do arquivo de configuraçãoansible.cfg
ou por meio da variável de ambiente$ANSIBLE_LOG_PATH
.Se você configurar o Ansible para gravar arquivos de log em
/var/log
, a RedHat recomenda que você configure logrotate para gerenciar os arquivos de log do Ansible.O módulo de depuração
O módulo
debug
fornece informações sobre o que está acontecendo na ação. Esse módulo pode exibir o valor de uma determinada variável em um determinado ponto da ação. Esse recurso é essencial para depurar tarefas que usam variáveis para se comunicarem (por exemplo, usando a saída de uma tarefa como a entrada de outra).Os exemplos a seguir usam as configurações
msg
evar
dentro das tarefasdebug
. O primeiro exemplo exibe o valor no tempo de execução do fatoansible_facts['memfree_mb']
como parte de uma mensagem impressa na saída de ansible-playbook. O segundo exemplo exibe o valor da variáveloutput
.Gerenciamento de erros
Há vários problemas que podem ocorrer durante a execução de um playbook, principalmente relacionados à sintaxe do playbook ou de qualquer um dos modelos que ele usa, ou devido a problemas de conectividade com os hosts gerenciados (por exemplo, um erro no nome do host gerenciado no arquivo de inventário). Esses erros são emitidos pelo comando ansible-playbook no tempo de execução.
Anteriormente, neste curso, você aprendeu sobre a opção
--syntax-check
, que verifica a sintaxe do YAML para o playbook. É uma boa prática executar uma verificação de sintaxe no seu playbook antes de usá-lo ou caso você venha a ter problemas com ele.Você também pode usar a opção
--step
para repassar uma tarefa do playbook por vez. O comando ansible-playbook --step solicita interativamente a confirmação de que você deseja que cada tarefa seja executada.A opção
--start-at-task
permite iniciar a execução de um manual de uma tarefa específica. Ela recebe como argumento o nome da tarefa na qual começar.Depuração
A saída dada pela execução de um playbook com o comando ansible-playbook é um bom ponto de partida para a solução de problemas relacionados a hosts gerenciados pelo Ansible. Considere a seguinte saída de uma execução de playbook:
PLAY [Service Deployment] *************************************************** ...output omitted... TASK: [Install a service] *************************************************** ok: [demoservera] ok: [demoserverb] PLAY RECAP ****************************************************************** demoservera : ok=2 changed=0 unreachable=0 failed=0 demoserverb : ok=2 changed=0 unreachable=0 failed=0
A saída anterior exibe um cabeçalho
PLAY
com a mesma ação a ser executada, seguida de um ou mais cabeçalhosTASK
. Cada um desses cabeçalhos representa sua task associada no playbook e é executado em todos os hosts gerenciados pertencentes ao grupo incluído no playbook no parâmetro hosts.Como cada host gerenciado executa as tarefas de cada ação, o nome do host gerenciado é exibido no cabeçalho
TASK
correspondente, juntamente com o estado da tarefa no host gerenciado. Os estados da tarefa podem aparecer comook
,fatal
,changed
ouskipping
.Na parte inferior do playbook de cada ação, a seção
PLAY RECAP
exibe o número de tarefas executadas para cada host gerenciado.Como discutido anteriormente no curso, você pode aumentar o detalhamento da saída de ansible-playbook adicionando uma ou mais opções
-v
. O comando ansible-playbook -v oferece informações adicionais para depuração, com um total de quatro níveis.Práticas recomendadas para gerenciamento de playbooks
Apesar de as ferramentas discutidas anteriormente ajudarem a identificar e corrigir problemas nos playbooks, ao desenvolver novos playbooks, é importante lembrar-se de algumas práticas recomendadas que podem ajudar a facilitar o processo de solução de problemas. Veja abaixo algumas práticas recomendadas para o desenvolvimento de playbooks:
Use uma descrição concisa da finalidade da ação ou da tarefa para nomear as ações e tarefas. O nome da ação ou da tarefa é exibido quando o playbook é executado. Isso também ajuda a documentar o que cada ação ou tarefa deve realizar e, possivelmente, por que ela é necessária.
Inclua comentários para adicionar mais documentos em linha sobre as tarefas.
Use os espaços em branco verticais de maneira efetiva. Em geral, organize os atributos da tarefa verticalmente para facilitar a leitura.
É essencial que o recuo horizontal seja consistente. Use espaços, não a tecla Tab, para evitar erros de recuo. Configure seu editor de texto para inserir espaços ao pressionar a tecla Tab para facilitar.
Tente manter o playbook o mais simples possível. Use apenas os recursos necessários.
Configuring Ansible — Ansible Documentation
debug — Print statements during execution — Ansible Documentation
Best Practices — Ansible Documentation