Qanday qilib xatolarga yo'l qo'yiladi?

Ba'zan eslab siz xohlagan narsani qilmaydi. Vaznlarni ko'paytirish yordam bermaydi. Misol uchun, endi systemd (Debian Jessie) tizimida init script bilan birga keladigan coturn serverini ishga tushirishga harakat qilaman. Ko'rayapsizmi, u harakatni ko'rib chiqadi, lekin u emas. Kukun ostida nimalar bo'layotganiga qanday qarayman? Qaysi buyruqlar bajariladi va qanday chiqish/chiqish kodi?

10

6 javoblar

Moduli disk raskadrovka

  • The most basic way is to run ansible/ansible-playbook with an increased verbosity level by adding -vvv to the execution line.

  • The most thorough way for the modules written in Python (Linux/Unix) is to run ansible/ansible-playbook with an environment variable ANSIBLE_KEEP_REMOTE_FILES set to 1 (on the control machine).

    It causes Ansible to leave the exact copy of the Python scripts it executed (either successfully or not) on the target machine.

    The path to the scripts is printed in the Ansible log and for regular tasks they are stored under the SSH user's home directory: ~/.ansible/tmp/.

    The exact logic is embedded in the scripts and depends on each module. Some are using Python with standard or external libraries, some are calling external commands.

O'yinchoqlar disk raskadrovka

  • Similarly to Moduli disk raskadrovka increasing verbosity level with -vvv parameter causes more data to be printed to the Ansible log

  • Since Ansible 2.1 a Playbook Debugger allows to debug interactively failed tasks: check, modify the data; re-run the task.

Ulanishlarni tuzatish

  • -avvv parametrini esnek / o'qib-eshitib bo'lmaydigan chaqirishga qo'shish logga ulanishlar uchun disk raskadrovka ma'lumotlarini kiritish uchun sabab bo'ladi.
14
qo'shib qo'ydi
To'rtinchi -v qo'shib ishonch hosil qilasizmi? escort-playbook sahifasining man sahifasidan emas.
qo'shib qo'ydi muallif x-yuri, manba
"Aloqada xatolarni tuzatish" bo'limini batafsil muhokama qila olasizmi? ssh da -q ni -vvv ga o'zgartirganini bilaman, lekin boshqa hech qanday o'zgartirish yo'q. Farq nima?
qo'shib qo'ydi muallif x-yuri, manba
Shunday qilib, maqsadli tizimda systemd jurnalida qo'shimcha xabarlar paydo bo'ladi ... ANSIBLE_KEEP_REMOTE_FILES = 1 dan foydalanishda qo'shimcha harakatlar taklif qila olasizmi? Modul manbai zippur, to'g'rimi? Shunday qilib, uni o'zgartirishning oson yo'li yo'q.
qo'shib qo'ydi muallif x-yuri, manba
qaysi eslab versiyasidan foydalanasiz? mumkin emas boshlangan zip modullari.
qo'shib qo'ydi muallif x-yuri, manba
Albatta yo'q. Saqlangan fayllar python kodi bo'lgan fayllardir. Lekin kodni o'rnatish va ortiqcha zidlangan modul kodi. Foydali yuk siqilgan. Men shuni aytdim. Iltimos, ANSIBLE_KEEP_REMOTE_FILES = 1 dan foydalanishni kengaytiring. bu ilhom uchun :) Yoki faqat yaxshi javob bo'lishi mumkin bo'lgan javobni havolasini qo'shing.
qo'shib qo'ydi muallif x-yuri, manba
escort-playbook parametrini ishlatmasangiz, quyidagi kodni ko'rasiz: -v, --verbose: verbose rejimi (-vv uchun ko'proq, -vvvv aloqani tuzatishni yoqish uchun)
qo'shib qo'ydi muallif techraf, manba
qo'shib qo'ydi muallif techraf, manba
Hech narsa zipped emas. Haqiqatni buzma.
qo'shib qo'ydi muallif techraf, manba
@ x-yuri Python siqilgan skriptlarni sharhlayaptimi?
qo'shib qo'ydi muallif techraf, manba

Mana, men nimani boshladim.

Muvofiq modullarni maqsadli tizimga yuboradi va ularni o'sha erda ijro etadi. Shuning uchun, agar siz modulni mahalliy sifatida o'zgartirsangiz, sizning o'zgartirishlaringiz o'ynash daftarini ishlatishda kuchga kiradi. Mashina modullarida /usr/lib/python2.7/site-packages/ansible/modules ( mumkin-2.1.2.0 ) mavjud. Va service moduli < code> core/system/service.py ni bosing. Anisble Module (nusxalar Qabul qilishModuli module_utils/basic.py da e'lon qilingan kod) log usulida xabarlarni tizimd jurnaliga yuboradigan yoki syslog . Shunday qilib, maqsad sistemasidagi journalctl -f kodini ishga tushiring, mahalliy tizimda disk raskadrovka bo'yicha jadvallarni ( module.log (msg = 'test') ) qo'shing va o'ynatmani ishga tushiring. ansible-basic.py birlik nomi ostidagi disk raskadrovka so'zlarini ko'rasiz.

Bunga qo'shimcha ravishda, -svitavka kodini -vv bilan ishlayotganingizda systemd jurnalida ba'zi disk raskadrovka chiqimlarini, hech bo'lmasa chaqirish xabarlarini va xato xabarlar mavjud bo'lsa.

Yana bir narsa, agar pdb ( import pdb; pdb.set_trace() ) bilan ishlaydigan kodni disk raskadrovka qilmoqchi bo'lsangiz, siz BdbQuit istisnosiz. Buning sababi python yopiladi stdin ishini yaratishda ( mumkin emas ishchi). pdb.set_trace() kodini ishlatishdan oldin stdin funksiyasini qayta ochish tavsiya etiladi bu yerda:

sys.stdin = open('/dev/tty')
import pdb; pdb.set_trace()

7
qo'shib qo'ydi
Men izoh bermadim, yaxshi, bu juda yaxshi yozilgan, men haqiqatdan ham aslida xato ayg'oqchisini ishlatish kerak bo'lgan haqiqatni yaxshi ko'raman :) va shoyma, faqat mahalliy kod :)
qo'shib qo'ydi muallif mvk_il, manba
Stdin uchi uchun rahmat! Bu pdb bilan ishlagan, ammo ipdb bilan ishlamagan. Mahalliy ahvolda o'ynab o'ynashni boshlaganimda, 0, 1 va 2-FD-larim hali ham TTY-da ishlayotganini ko'rib turibman, shuning uchun sys.stdin = os.fdopen (0, 'r') o'rniga va ipdb bu bilan baxtli edi.
qo'shib qo'ydi muallif Dale, manba

Xatolarni tuzish/o'ynatmalar kitoblari

Asosan yirik tarmoqlar bo'ylab katta inventarizatsiyadan himoyalangan avtomatizatsiyani disk raskadrovka qilish, tarqalgan tarmoq dasturini disk raskadrovka qilishdan boshqa narsa emas. Bu juda zerikarli va nozik bo'lishi mumkin va foydalanuvchi uchun qulay vositalar mavjud emas.

Shunday qilib, sizning savolingizga javob mening + kichik qo'shimcha oldin barcha javoblarning birlashmasi deb hisoblayman. Shunday qilib:

  • absolutely mandatory: you have to want to know what's going on, i.e. what you're automating, what you are expecting to happen. e.g. ansible failing to detect service with systemd unit as running or as stopped usually means a bug in service unit file or service module, so you need to 1. identify the bug, 2. Report the bug to vendor/community, 3. Provide your workaround with TODO and link to bug. 4. When bug is fixed - delete your workaround

  • to make your code easier to debug use modules, as much as you can

  • give all tasks and variables meaningful names.

  • use static code analysis tools like ansible-lint. This saves you from really stupid small mistakes.

  • utilize verbosity flags and log path

  • use debug module wisely

  • "Know thy facts" - sometimes it is useful to dump target machine facts into file and pull it to ansible master

    • use strategy: debugin some cases you can fall into a task debugger at error. You then can eval all the params the task is using, and decide what to do next

    • the last resort would be using Python debugger, attaching it to local ansible run and/or to remote Python executing the modules. This is usually tricky: you need to allow additional port on machine to be open, and if the code opening the port is the one causing the problem?

Bundan tashqari, ba'zida "chetga qarab" foydalanganda - maqsadli kompyuterga ulanish va ularning disk raskadroviyligini oshirish (batafsilroq jurnal yozish)

Albatta, jurnalni yig'ish mumkin bo'lmagan operatsiyalar natijasida sodir bo'lgan o'zgarishlarni kuzatishni osonlashtiradi.

Ko'rib turganingizdek, boshqa har qanday tarqatilgan ilovalar va ramkalar kabi - disk raskadrovka qobiliyati biz istagandek emas.

Filtrlar/plaginlar

Bu, asosan, Pythonning rivojlanishi, har qanday Python ilovasi sifatida disk raskadrovka

Modullar

Texnologiyadan qat'iy nazar, va mahalliy sharoitda ham, uzoqdan ham sodir bo'lgan narsani ko'rishingiz kerak bo'lsa, siz masofadan turib disk raskadrovka qilishni osonlashtiradigan tilni tanlashingiz kerak.

2
qo'shib qo'ydi
@ x-yuri IDE-ni ishlatishingiz mumkin, masalan. pycharm yaxshi ishlaydi. Lekin, albatta, to'g'ri Python'a ishora qilish, port oching va hokazo.
qo'shib qo'ydi muallif mvk_il, manba

Ro'yxatdan o'tish moduli va qaytish qiymatlarini chop etish uchun disk raskadrovka modulidan foydalanishingiz mumkin. Misol uchun, men skript buyrug'ining qaytish kodi "somescript.sh" deb nomlanganini bilishni istayman, shuning uchun o'yinda o'z vazifalarim bo'ladi:

- name: my task
  shell: "bash somescript.sh"
  register: output

- debug:
  msg: "{{ output.rc }}"

For full return values you can access in Ansible, you can check this page: http://docs.ansible.com/ansible/latest/common_return_values.html

2
qo'shib qo'ydi

Bir nechta darajadagi disk raskadrovka talab qilinadi, lekin eng oson narsa ANSIBLE_STRATEGY = debug muhit o'zgaruvchini qo'shishdir, bu esa birinchi xatoda xato aygıtını beradi.

1
qo'shib qo'ydi

Xatolarni tuzatish Vazifalar sizniki bo'lmasa, javob beradigan vazifalar deyarli mumkin emas. Internet saytida aytilganlarning farqli o'laroq.

Maxsus kodlash qobiliyatlari kerak emas

Qabul qilish uchun yuqori darajadagi maxsus dasturiylikni talab qiladi , chunki u YAML yoki Python emas, balki ikkalasining ham aralashmasi.

Dasturlash uchun formatlash tilidan foydalanish g'oyasi avval sinab ko'rildi. xml bir vaqtning o'zida Java jamoalarida juda mashhur edi. XSLT ham yaxshi namuna.

Yodda qoladigan loyihalar o'sishi bilan murakkablik natija sifatida chidamli tarzda o'sib boradi. Misol uchun, quyidagi vazifalarni bajaradigan OpenShift Invalid loyihasini oling:

- name: Create the master server certificate
  command: >
    {{ hostvars[openshift_ca_host]['first_master_client_binary'] }} adm ca create-server-cert
    {% for named_ca_certificate in openshift.master.named_certificates | default([]) | lib_utils_oo_collect('cafile') %}
    --certificate-authority {{ named_ca_certificate }}
    {% endfor %}
    {% for legacy_ca_certificate in g_master_legacy_ca_result.files | default([]) | lib_utils_oo_collect('path') %}
    --certificate-authority {{ legacy_ca_certificate }}
    {% endfor %}
    --hostnames={{ hostvars[item].openshift.common.all_hostnames | join(',') }}
    --cert={{ openshift_generated_configs_dir }}/master-{{ hostvars[item].openshift.common.hostname }}/master.server.crt
    --key={{ openshift_generated_configs_dir }}/master-{{ hostvars[item].openshift.common.hostname }}/master.server.key
    --expire-days={{ openshift_master_cert_expire_days }}
    --signer-cert={{ openshift_ca_cert }}
    --signer-key={{ openshift_ca_key }}
    --signer-serial={{ openshift_ca_serial }}
    --overwrite=false
  when: item != openshift_ca_host
  with_items: "{{ hostvars
                  | lib_utils_oo_select_keys(groups['oo_masters_to_config'])
                  | lib_utils_oo_collect(attribute='inventory_hostname', filters={'master_certs_missing':True}) }}"
  delegate_to: "{{ openshift_ca_host }}"
  run_once: true

Menimcha, bu dastur YAML dasturiyasidir. Juda yaxshi fikr emas. Ushbu maxsus snippet kabi xabar bilan muvaffaqiyatsiz bo'lishi mumkin

fatal: [master0]: FAILED! => {"msg": "The conditional check 'item != openshift_ca_host' failed. The error was: error while evaluating conditional (item != openshift_ca_host): 'item' is undefined\n\nThe error appears to have been in '/home/user/openshift-ansible/roles/openshift_master_certificates/tasks/main.yml': line 39, column 3, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n- name: Create the master server certificate\n ^ here\n"}

Agar siz mahkum bo'lsangiz, xuddi shunday xabarni ursangiz. Lekin xatolarni tuzatuvchi bizda bormi? Yaxshiyamki, nima bo'layotganini ko'rib chiqaylik.

master0] TASK: openshift_master_certificates : Create the master server certificate (debug)> p task.args
{u'_raw_params': u"{{ hostvars[openshift_ca_host]['first_master_client_binary'] }} adm ca create-server-cert {% for named_ca_certificate in openshift.master.named_certificates | default([]) | lib_utils_oo_collect('cafile') %} --certificate-authority {{ named_ca_certificate }} {% endfor %} {% for legacy_ca_certificate in g_master_legacy_ca_result.files | default([]) | lib_utils_oo_collect('path') %} --certificate-authority {{ legacy_ca_certificate }} {% endfor %} --hostnames={{ hostvars[item].openshift.common.all_hostnames | join(',') }} --cert={{ openshift_generated_configs_dir }}/master-{{ hostvars[item].openshift.common.hostname }}/master.server.crt --key={{ openshift_generated_configs_dir }}/master-{{ hostvars[item].openshift.common.hostname }}/master.server.key --expire-days={{ openshift_master_cert_expire_days }} --signer-cert={{ openshift_ca_cert }} --signer-key={{ openshift_ca_key }} --signer-serial={{ openshift_ca_serial }} --overwrite=false"}
[master0] TASK: openshift_master_certificates : Create the master server certificate (debug)> exit

Bu qanday yordam beradi? Yo'q.

Bu erda, YAML dasturiy til sifatida foydalanish juda yomon fikr. Bu chalkashlikdir. Va biz yaratgan chalkashlik alomatlari hamma joyda.

Ba'zi qo'shimcha ma'lumotlar. Openshift Ta'sirlanishning Azure of pre-qualitiy bosqichini taqdim etish +50 minut davom etadi. O'rnatish bosqichi +70 daqiqadan ortiq davom etadi. Har safar! Birinchi ishga tushirish yoki keyingi ishga tushirish. Va bir nodaga ajratishni cheklashning hech qanday usuli yo'q. Ushbu limit muammosi 2012 yilda o'qilishi mumkin bo'lgan qismi bo'lib, bugungi kunda ham ushbu hujjatning bir qismi hisoblanadi. Bu haqiqat bizga biror narsa aytadi.

Bu erda ta'kidlanishicha, Imtiyozni niyat qilganidek ishlatish kerak. YAML dasturlashtirmasdan oddiy vazifalar uchun. Ko'p server uchun nozik, lekin murakkab konfiguratsiya boshqaruvi vazifalari uchun ishlatilmasligi kerak.

Qabul qilish mumkin emas, chunki Infrastructure Code (IaC) vositasi.

Mumkin bo'lgan masalalarni qanday qilib disk raskadrovka qilishni so'rasangiz, uni ishlatish uchun mo'ljallanmagan tarzda ishlatasiz. Buni IAc vositasi sifatida ishlatmang.

1
qo'shib qo'ydi
Sizning namunangiz kodi haqida siz buyruqni bajarishdan oldin ( set_fact ) buyrug'ini bajarishdan oldin uning qismlarini baholash orqali soddalashtira olasiz. Va bir nodaga ajratishni cheklashning hech qanday usuli yo'q. Men ko'pincha bitta tugunni taqdim qilaman. Bu sizning plyonkalaringiz bilan aloqada bo'ladimi? uni murakkab konfiguratsiya boshqaruvi vazifalari uchun ishlatmaslik kerak Boshqa vositalarni tavsiya qila olasizmi? Qabul qiladigan kodi (IaC) vositasi emas, balki infratuzilmani. Menimcha, faqat IAC, faqat konfiguratsiya boshqaruvining oddiy vazifalari uchun.
qo'shib qo'ydi muallif x-yuri, manba
Openshift Litsenziyasida old shartlar fazasini taqdim etish +50 minutdan ortiq davom etadi. Nimani uzoq davom etadiganligi aniq emas. Yana sezilarli tezroq bo'lgan boshqa echimlar bormi? Bu haqiqat bizga biror narsa aytadi. Bundan tashqari, CodeTriage ustida ikkinchi o'rinda turadi. Men shaxsan yoqtirmaydigan narsa, odatda konfiguratsiya faylida ma'lum bir sozlamani o'zgartirishning oson yo'li yo'qligi. Siz konfiguratsiya faylini vaqti-vaqti bilan almashtirishingiz yoki kompleks kod yozishingiz kerak.
qo'shib qo'ydi muallif x-yuri, manba
Agar mumkin bo'lgan muammolarni qanday qilib disk raskadrovka qilishni so'rasangiz, uni ishlatish uchun mo'ljallanmagan tarzda ishlatasiz. esnek tushunaman. Ehtimol, siz uni hujjatlarda topa olmadingiz, yoki bu faqat xato bo'lishi mumkin. Lekin sizda haqiqiy nuqta bor. Umuman olganda, tutarsiz faqat nomukammal hisoblanadi. Fikr juda yaxshi, lekin uni amalga oshirish uchun funktsiyalar, plaginlar, modullar, rollar yo'q.
qo'shib qo'ydi muallif x-yuri, manba