Ansible rolleri veya playbooklar yazarken, bolca koşullar ile uğraşmak, kaynaklanan hataları handle etmek gerekiyor. Bu yazıda yapılan iş, her ne kadar ufak gibi gözükse de her koşulda ve durumda kullanılabilecek bir iskelet sistemi anlatacağım.
Bash ile programlama yaparken, ki ben bu türdeki dilleri text işleme olarak değerlendiriyorum.
Çünkü bu dili kulllanırken olarak sistemi sed, awk gibi toollar ile kontrol edip gelen çıktıya göre şunu yap diye sistemi yönlendiriyoruz.
Ancak Ansible kullanırken bunlara ek olarak, sistemin biraz daha OOP yapısında olmasına sağlıyor ve gelen cevapların normal bash çıktısına oran ile biraz daha standarda sahip olduğu JSON yapısında cevaplar döndürüyor dönüyor.
Örnek vermek gerekirse
echo "Ansible çok güzel sende gel" ansible karşılığı
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
ok: [127.0.0.1] => { "output": { "changed": true, "cmd": "echo \"Ansible çok güzel sende gel\"", "delta": "0:00:00.001711", "end": "2016-08-18 14:57:12.184408", "rc": 0, "start": "2016-08-18 14:57:12.182697", "stderr": "", "stdout": "Ansible çok güzel sende gel", "stdout_lines": [ "Ansible çok güzel sende gel" ], "warnings": [] } } |
Eğer kodu yazmış olsaydınız return code(rc) çıktısını echo $? diye sorarak öğrenecek ve işlemi bu şekilde devam ettirecektiniz.
Gördüğünüz gibi bir çok cevabı tek bir json paketi içinde verebiliyor. Yani uzun lafın kısası output.[end|stdout|start] gibi elemanları daha fazla çıktı ile kontrol edebilme yeteneğine sahip oluyorsunuz.
Aşağıdaki örneği az biraz kurcalarsanız, ne yapıp yapmadığını kavrayıp ve kullanmaya devam edebilirsiniz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
- hosts: localhost gather_facts: no tasks: - name: run this command and ignore the result shell: ping -c 1 8.8.8.8 register: pingout ignore_errors: yes - debug: msg="{{ pingout.rc }}" #- debug: var=pingout - name: run this command if everything is okey raw: echo "What a wonderful world" register: output when: pingout.rc == 0 - debug: var=output - name: run this command and ignore the result raw: ping -c 1 8.8.8.7 register: pingout2 ignore_errors: yes - debug: msg="{{ pingout2.rc }}" #- debug: var=pingout2 - name: run this command if something wrong shell: echo "Something goes wrong :)" register: output2 when: pingout2.rc != 0 - debug: var=output2 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
PLAY [localhost] *************************************************************** TASK [run this command and ignore the result] ********************************** changed: [127.0.0.1] TASK [debug] ******************************************************************* ok: [127.0.0.1] => { "msg": "0" } TASK [run this command if everything is okey] ********************************** changed: [127.0.0.1] TASK [debug] ******************************************************************* ok: [127.0.0.1] => { "output": { "changed": true, "cmd": "echo \"What a wonderful world\"", "delta": "0:00:00.001372", "end": "2016-08-18 11:16:11.745843", "rc": 0, "start": "2016-08-18 11:16:11.744471", "stderr": "", "stdout": "What a wonderful world", "stdout_lines": [ "What a wonderful world" ], "warnings": [] } } TASK [run this command and ignore the result] ********************************** fatal: [127.0.0.1]: FAILED! => {"changed": false, "failed": true, "rc": 1, "stderr": "", "stdout": "PING 8.8.8.7 (8.8.8.7) 56(84) bytes of data.\r\n\r\n--- 8.8.8.7 ping statistics ---\r\n1 packets transmitted, 0 received, 100% packet loss, time 0ms\r\n\r\n", "stdout_lines": ["PING 8.8.8.7 (8.8.8.7) 56(84) bytes of data.", "", "--- 8.8.8.7 ping statistics ---", "1 packets transmitted, 0 received, 100% packet loss, time 0ms", ""]} ...ignoring TASK [debug] ******************************************************************* ok: [127.0.0.1] => { "msg": "1" } TASK [run this command if something wrong] ************************************* ok: [127.0.0.1] TASK [debug] ******************************************************************* ok: [127.0.0.1] => { "output2": { "changed": false, "rc": 0, "stderr": "", "stdout": "Something goes wrong :)\r\n", "stdout_lines": [ "Something goes wrong :)" ] } } PLAY RECAP ********************************************************************* 127.0.0.1 : ok=8 changed=2 unreachable=0 failed=0 |
Gördüğünüz gibi normalde hata almamız gerekirken kodun çıktısında failed=0 olduğunu ve playbook’un sorunsuz çalıştığını görüyorsunuz.
Umarım işinize yarar.
Daha fazlası için:
- ansible statements
- ansible debug
- ansible test debug