Saat saya menentukan tugas untuk dijalankan di beberapa server jarak jauh, jika tugas berjalan di server satu dan keluar dengan kesalahan, Fabric akan menghentikan dan membatalkan tugas. Tetapi saya ingin membuat fabric mengabaikan kesalahan dan menjalankan tugas di server berikutnya. Bagaimana saya bisa membuatnya melakukan ini?
Sebagai contoh:
$ fab site1_service_gw
[site1rpt1] Executing task 'site1_service_gw'
[site1fep1] run: echo 'Nm123!@#' | sudo -S route
[site1fep1] err:
[site1fep1] err: We trust you have received the usual lecture from the local System
[site1fep1] err: Administrator. It usually boils down to these three things:
[site1fep1] err:
[site1fep1] err: #1) Respect the privacy of others.
[site1fep1] err: #2) Think before you type.
[site1fep1] err: #3) With great power comes great responsibility.
[site1fep1] err: root's password:
[site1fep1] err: sudo: route: command not found
Fatal error: run() encountered an error (return code 1) while executing 'echo 'Nm123!@#' | sudo -S route '
Aborting.
from fabric.api settings
Mulai Fabric 1.5, ada ContextManager yang membuatnya lebih mudah:
Pembaruan: Saya menegaskan kembali bahwa ini berfungsi di ipython menggunakan kode berikut.
sumber
with hide('everything'):
Anda juga dapat menyetel seluruh setelan warn_only skrip menjadi true dengan
sumber
Anda harus menyetel
abort_exception
variabel lingkungan dan menangkap pengecualian.Sebagai contoh:
Anda juga dapat mengaturnya di blok dengan. Lihat dokumentasinya di sini .
sumber
fabric.api.env
dalamexcept
blok Anda ?env.abort_exception=MyException
sehingga saya bisa menjalankan kegagalan saya sendiri. Ini semacam "berfungsi" jika saya menggunakan fungsi alih-alih kelas (memenuhi persyaratan yang dapat dipanggil untukabort_exception
) tetapi saya masih mengerjakan beberapa masalah lain dengan pendekatan itu.fabric.api.env
.Setidaknya di Fabric 1.3.2, Anda dapat memulihkan pengecualian tersebut dengan menangkap
SystemExit
pengecualian tersebut. Itu berguna jika Anda memiliki lebih dari satu perintah untuk dijalankan dalam satu batch (seperti penerapan) dan ingin membersihkan jika salah satunya gagal.sumber
SystemExit
pesan atau kode itu untuk lebih jelasnya.SystemExit
, setelabort_exception
ke pengecualian yang berbeda, sehingga Anda tidak secara tidak sengaja menangkap pengecualian yang tidak ada hubungannya dengan Fabric. Lihat jawaban saya untuk contoh: stackoverflow.com/a/27990242/901641Di Fabric 2.x Anda hanya dapat menggunakan Invoke 's run dengan memperingatkan = True argumen. Bagaimanapun, pemanggilan adalah ketergantungan dari Fabric 2.x :
Dari dalam tugas:
sumber
Dalam kasus saya, pada Fabric> = 1.4 jawaban ini adalah yang benar.
Anda dapat melewati host yang buruk dengan menambahkan ini:
Atau mengoper
--skip-bad-hosts
bendera /sumber