যখন ফ্যাব্রিক একটি ত্রুটি পেয়ে থাকে তখন কীভাবে কোনও কাজ চালিয়ে যেতে পারেন


94

আমি যখন বেশ কয়েকটি রিমোট সার্ভারে চালনার জন্য কোনও কার্য সংজ্ঞায়িত করি, যদি টাস্কটি একটি সার্ভারে চালিত হয় এবং ত্রুটিযুক্ত হয়ে প্রস্থান করে, ফ্যাব্রিক বন্ধ করে কার্যটি বাতিল করে দেবে। তবে আমি ত্রুটিটিকে উপেক্ষা করে পরবর্তী সার্ভারে টাস্কটি চালাতে চাই। আমি কীভাবে এটি এটি করতে পারি?

উদাহরণ স্বরূপ:

$ 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.

উত্তর:


146

দস্তাবেজগুলি থেকে :

... ফ্যাব্রিক একটি "ব্যর্থ-দ্রুত" আচরণের ধরণে ডিফল্ট: যদি কোনও সমস্যা হয়ে থাকে যেমন একটি রিমোট প্রোগ্রাম যেমন ননজারো রিটার্ন মান প্রদান করে বা আপনার ফ্যাবিলির পাইথন কোড ব্যতিক্রমের সাথে সংঘটিত হয়, তখনই মৃত্যুদন্ড কার্যকর হবে ha

এটি সাধারণত কাঙ্ক্ষিত আচরণ, তবে নিয়মটিতে অনেক ব্যতিক্রম রয়েছে, সুতরাং ফ্যাব্রিক env.warn_only, একটি বুলিয়ান সেটিংস সরবরাহ করে। এটি মিথ্যাতে ডিফল্ট হয়, এর অর্থ একটি ত্রুটির শর্তের ফলে প্রোগ্রামটি তত্ক্ষণাত বাতিল করতে হবে। যাইহোক, যদি env.warn_only ব্যর্থতার সময় সত্যতে সেট করা থাকে - সাথে, বলুন, সেটিংসের প্রসঙ্গ পরিচালক - ফ্যাব্রিক একটি সতর্কতা বার্তা প্রেরণ করবে তবে চালিয়ে যাওয়া চালিয়ে যাবে।

দেখে মনে হচ্ছে আপনি settingsপ্রাসঙ্গিক ব্যবস্থাপক ব্যবহার করে ত্রুটিগুলি উপেক্ষা করা হচ্ছে সেখান থেকে সূক্ষ্ম নিয়ন্ত্রণযুক্ত অনুশীলন করতে পারেন , এরকম কিছু:

from fabric.api import settings

sudo('mkdir tmp') # can't fail
with settings(warn_only=True):
    sudo('touch tmp/test') # can fail
sudo('rm tmp') # can't fail

13
আমদানি করতে ভুলবেন নাfrom fabric.api settings
সেভরিস

31

ফ্যাব্রিক 1.5 হিসাবে, একটি কনটেক্সট ম্যানেজার রয়েছে যা এটিকে সহজ করে তোলে:

from fabric.api import sudo, warn_only

with warn_only():
    sudo('mkdir foo')

আপডেট: আমি পুনরায় নিশ্চিত করেছি যে এটি নীচের কোডটি ব্যবহার করে আইপথনে কাজ করে।

from fabric.api import local, warn_only

#aborted with SystemExit after 'bad command'
local('bad command'); local('bad command 2')

#executes both commands, printing errors for each
with warn_only():
    local('bad command'); local('bad command 2')

আপনি কাপড়ের কোন সংস্করণ ব্যবহার করছেন? আমি কেবল ফ্যাব্রিক == 1.6.2 দিয়ে প্রতিক্রিয়া জানিয়েছি এবং এটি দুর্দান্ত কাজ করে।
ক্রিস মেরিনোস

সম্ভবত, আমি ফ্যাব্রিক ব্যবহার করছি == 1.9.0 এবং এটি আমার কাজ করে না
সেভরিস

মাত্র 1.9.0 এ পরীক্ষা করা হয়েছে। আপনি যখন আমার আপডেট করা মন্তব্য থেকে উদাহরণ কোডটি ব্যবহার করেন তখন আপনার আউটপুটটি কী?
ক্রিস মারিনোস 13

আপনি যদি সতর্কতাগুলি / ত্রুটিগুলি মুদ্রণ করতে না চান তবে আপনি গোপনীয়তা প্রসঙ্গে with hide('everything'):
পরিচালকও

13

আপনি সম্পূর্ণ স্ক্রিপ্টের সতর্কতা_ মাত্র সেটিংটি সত্য হতে সেট করতে পারেন

def local():
    env.warn_only = True

10

আপনার abort_exceptionপরিবেশ পরিবর্তনশীল সেট করা উচিত এবং ব্যতিক্রমটি ধরা উচিত ।

উদাহরণ স্বরূপ:

from fabric.api        import env
from fabric.operations import sudo

class FabricException(Exception):
    pass

env.abort_exception = FabricException
# ... set up the rest of the environment...

try:
    sudo('reboot')
except FabricException:
    pass  # This is expected, we can continue.

আপনি এটি একটি ব্লক সহ সেট করতে পারেন। ডকুমেন্টেশন এখানে দেখুন


এর জন্য ধন্যবাদ, তবে একটি প্রশ্ন - ব্যতিক্রম ঘটলে এটি কি বর্তমান ফ্যাব্রিক এনভি ডিকের সংজ্ঞায়িত হিসাবে অ্যাক্সেস / পাস সম্ভব? (সুতরাং আমি ব্যতিক্রম সহ কিছু নির্দিষ্ট সেটিংস মুদ্রণ করতে পারি))
ব্রায়ান

@ ব্রায়ান: আপনি কি কেবল fabric.api.envআপনার exceptব্লকের মধ্যে থাকা অংশটি পরীক্ষা করতে পারবেন না ?
আর্টঅফ ওয়ারফেয়ার

@ আর্টওফওয়ারফেয়ার আহ আহ আমাকে বোকা আমি চেষ্টা করেছিলাম আমার সমস্ত কাজকে চেষ্টা করে / বাদ দিয়ে এড়াতে এবং পরিবর্তে ঠিকঠাক env.abort_exception=MyExceptionকরেছিলাম যাতে আমি নিজের ব্যর্থতা চালাতে পারি। আমি শ্রেণীর পরিবর্তে কোনও ফাংশন ব্যবহার করি তবে এটি ধরণের "কাজ করে" (যার জন্য কলযোগ্য প্রশ্নটি সন্তুষ্ট করে abort_exception) তবে আমি এখনও সেই পদ্ধতির সাথে কিছু অন্যান্য বিষয়ে কাজ করছি।
ব্রায়ান

@ ব্রায়ান: সুতরাং সেই ফাংশনের দেহের ভিতরে যা আছে তা পরীক্ষা করুন fabric.api.env
আর্টঅফ ওয়ারফেয়ার

7

অন্তত ফেব্রিক 1.3.2 এ, আপনি ব্যতিক্রমটি ধরে ব্যতিক্রমটি পুনরুদ্ধার করতে পারেন SystemExit। ব্যাচে চালানোর জন্য যদি আপনার একাধিক কমান্ড থাকে (ডিপ্লয় করার মতো) এবং সেগুলির মধ্যে কোনওটি ব্যর্থ হয় তবে ক্লিনআপ করতে চাইলে এটি সহায়ক।


+1: পরীক্ষিত - এটি ফ্যাব্রিক 1.9.0 এও কাজ করে। এটি ধরা পরে, আপনি SystemExitআরও তথ্যের জন্য বার্তা বা কোড চেক করতে পারেন ।
আর্টঅফ ওয়ারফেয়ার

ধরার চেয়ে আরও ভাল SystemExit, abort_exceptionঅন্যরকম ব্যতিক্রম সেট করুন , যাতে আপনি দুর্ঘটনাক্রমে ব্যতিক্রমগুলি ধরেন না যার সাথে ফ্যাব্রিকের কোনও সম্পর্ক নেই। : একটি উদাহরণ জন্য আমার উত্তর দেখুন stackoverflow.com/a/27990242/901641
ArtOfWarfare

7

ইন তারেক 2.x আপনি শুধু ব্যবহার করতে পারেন ডাকা 'র রান দিয়ে সতর্ক = true যুক্তি। যাই হোক, ডাকা একটি নির্ভরতা হয় তারেক 2.x :

from invoke import run
run('bad command', warn=True)

কোনও কাজের মধ্যে থেকে:

from invoke import task

@task
def my_task(c):
    c.run('bad command', warn=True)

-5

আমার ক্ষেত্রে, ফ্যাব্রিক> = 1.4 এ উত্তর সঠিক ছিল।

আপনি এটি যোগ করে খারাপ হোস্টগুলি এড়িয়ে যেতে পারেন:

env.skip_bad_hosts = True

বা --skip-bad-hostsপতাকা পাস /

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.