Fabric: قماش 2 بطاقة وصفية لتعليقات ألفا / بيتا!

تم إنشاؤها على ٢١ أبريل ٢٠١٧  ·  28تعليقات  ·  مصدر: fabric/fabric

يرجى التأكد من قراءة منشور المدونة هذا وجميع روابطه أولاً !: http://bitprophet.org/blog/2017/04/17/fabric-2-alpha-beta


هذا هو المكان المناسب لترك التعليقات على المشكلات التي لا تغطيها أي من التذاكر الحالية ؛ الرجاء البحث في الأماكن أدناه أولاً !!


لا تجد أي شيء ذي صلة؟ اترك تعليقا أدناه! أنا أبحث عن ملاحظات _ شبيهة على سبيل المثال لا الحصر _:

  • "أرفض استخدام الإصدار 2.0 حتى تعيد الوضع السحري العالمي غير الموجه للكائنات!" (على الرغم من أنني سأقوم فقط بربطك بـ pyinvoke / استدعاء # 186 وأطلب منك تقديم الأساس المنطقي هناك ؛))
  • "يعجبني حقًا ما فعلته باستخدام ميزة $ ولكنها تفتقد الميزة الفرعية $ ، والتي أحتاجها حقًا! هل هذا مخطط؟" (سأقول إما "نعم" أو "لا" أو "لا ولكن يمكنك الآن تنفيذها بشكل تافه بنفسك! لا يلزم أن تكون جوهرية!")
  • "لقد أحببت حقًا ما فعلته باستخدام ميزة $ ولكن الطريقة التي تم إعدادها بها الآن ، من الصعب / المستحيل تنفيذ $ sub-use-case!" (سأطلب منك على الأرجح التفاصيل وربما أسأل عن مثال للعلاقات العامة لواجهة برمجة التطبيقات التي ترغب في رؤيتها.)

التعليق الأكثر فائدة

haydenflinner سيحدث خلال الأسبوع أو الأسبوعين المقبلين !! (الهدف هو الإفراج قبل أن أصعد على متن طائرتي إلى PyCon ، وهو 10 مايو)

على سبيل المثال ، يرجى الاطلاع على مستندات الترقية المحدثة مؤخرًا التي كنت أعمل عليها هذا الأسبوع: http://docs.fabfile.org/en/v2/upgrading.html

في الواقع ، قد أغلق هذه التذكرة الآن ، لأنني سأقبل بطاقات حقيقية حقيقية لـ 2.0.0 وما فوق قريبًا 👍

ال 28 كومينتر

خطأ صغير في عنوان URL ، يجب أن يكون http://bitprophet.org/blog/2017/04/17/fabric-2-alpha-beta/

سيوضح كيف أتذكر موقع الويب الخاص بي جيدًا ، أليس كذلك؟ شكرا! حتى أنني قمت بتشغيل مدقق ارتباط على رسالتي ، ولكن ... ليس ضد هذه التذكرة ؛)

لدي اقتراح حول كيفية تنفيذ نظام roledefs الخاص بـ fabric 1 بطريقة أعتقد أنها تتماشى مع فلسفة Fabric 2. يمكن أن تحتوي كل مهمة Collection أيضًا على وظائف مزينة @group في نفس مساحة الاسم التي تعيد كائنات Group التي يمكن تشغيل المهام على أساسها. قد تكون مساحات الأسماء مهمة ، لذا إذا احتوى fabfile.py على Collection يُسمى deploy الذي كان لديه @group s يُسمى web و db ، يمكن للمرء استخدام deploy.web.execute(mytask) أو fab -G deploy.web mytask لتنفيذ mytask على كل مضيف في المجموعة web . سيتم استدعاء هذه الوظائف المزخرفة كسولًا ومذكرًا لمنع استدعاءات واجهة برمجة التطبيقات غير الضرورية ، إذا كان البحث في قائمة المضيف عملية بطيئة كما تم تنفيذها من قبل المستخدم.

هل هذا يتماشى مع فلسفة التصميم الخاصة بنسيج 2؟ أود أن أتأرجح في التنفيذ إذا كان الأمر كذلك.

هذه فكرة رائعة ،RedKrieg! لقد قمت بتأجيل عملية طرح الأفكار الخاصة بي لمعرفة أفضل السبل لإنشاء كائنات المجموعة و / أو كيفية الإشارة إليها في CLI ، ولكن هذا يبدو وكأنه طريقة معقولة. لقد قمت للتو بإخراج عدد كبير جدًا من الكلمات في # 1594 وقمت بتضمين فكرتك هناك (+ رابط). دعنا نواصل المناقشة هناك ، ولكن tl ؛ dr yes أود أن أرى PoC PR.

ما هي أفضل طريقة لتشغيل أمر محليًا على الرغم من وجود وسيطة -H ، على سبيل المثال إذا كنت أرغب في دمج البنية المحلية و rsync مع المضيف البعيد في مهمة واحدة؟

تحتوي كائنات @ max-arnold Connection على سمة .local تعمل مثل .run على الجهاز المحلي: http://docs.fabfile.org/en/v2/api/connection.html#fabric .connection.Connection.local

حسنًا ، أعتقد أن المثال أفضل من الكلمات:

<strong i="6">@task</strong>
def build(ctx):
    # should always run locally
    ctx.local('uname -a')


<strong i="7">@task</strong>
def deploy(ctx):
    build(ctx)
    # this one should run on remote host
    ctx.run('uname -a')

تعمل المهمة المجمعة بشكل جيد:

fab -H host deploy

فشلت المهمة المحلية وحدها مع AttributeError: لم يتم العثور على سمة أو مفتاح تكوين لـ 'local':

fab build

في الأساس ، أرغب في الحصول على مهمة تقوم بشيء محليًا ، بغض النظر عن كيفية استدعائها (مع أو بدون -H ).

من الجانب الآخر ، بعض الأوامر معدة فقط للتشغيل عن بعد. في حالة عدم وجود مضيف ، سيحاول ctx.run تشغيلها محليًا ، مما قد يؤدي إلى عواقب غير متوقعة.

| يدير المستخدم المهمة | يريد مؤلف الأمر / المهمة أن يتم تشغيله | كيف يجب أن تتصرف؟ |
| --------------------- | --------------------------- --- | ---------------- |
| محليا | محليا | يعد سلوك run () أمرًا جيدًا (لكنه ينتهك نية المؤلف إذا تم تشغيله عن بُعد) |
| محليا | عن بعد | يجب أن تفشل (أو تطلب سلسلة المضيف مثل النسيج القديم) |
| محليا | محليا أو عن بعد | run () سلوك جيد |
| عن بعد | محليا | يجب أن يعمل دائمًا محليًا ، لكن السياق ليس لديه طريقة محلية () للتأكد من أنه |
| عن بعد | عن بعد | يكون سلوك run () جيدًا (ولكن من المتوقع حدوث مشكلات أثناء الاستدعاء المحلي) |
| عن بعد | محليا أو عن بعد | run () سلوك جيد |

@ max-arnold هذا بالضبط # 98! التي لم أحلها بالكامل بعد. وضع بعض الأفكار الحديثة هناك كتعليق ... تعديل: هذه

لقد لاحظت ما يبدو أنه غير متسق مع sudo.

حيث connection هو خادم بعيد ، تمت مصادقته كجذر.

محاولة توسيع التلدة كمستخدم آخر غير الجذر:

c.sudo("echo bar > ~/foo", user="builder")

نجح هذا ، ولكن بدلاً من كتابة / home / builder / foo ، كتب بدلاً من ذلك / root / foo.

من ناحية أخرى ، إذا حاولت فقط:

c.sudo("ls", user="builder")

أحصل على Permission denied .

شيء ما يشعر به.

تخميني عندما أبلغ Dustin عن ما ورد أعلاه خارج النطاق ، كان أن هذا هو تجعد معين sudo (الأمر ، وليس الطريقة) ، منذ آخر مرة بحثت فيها أننا نستخدم -H وعلى ما يبدو لا يتصرف بنسبة 100٪ كما نتوقع.

مرحبًا جيف ،
نظرًا لأنني أعمل بالفعل في python 3 ، فأنا الآن أستخدم fabric3 (نقل القماش 1.x).

لقد شعرت بالإغراء لمحاولة الانتقال إلى النسيج 2 ، لكنني على الفور اصطدمت بإيقاف العرض. لقد استخدمت بشكل مكثف وظائف fabric.contrib ، لكن مستند الترحيل يقول إنه لم يعد موجودًا.

من المؤكد أنني لا أريد تضخيم الكود للعودة إلى ما يعادله من قشرة ، وبما أنه ، بناءً على عدد المشكلات في contrib.* من القماش 1.x ، يبدو أنه مستخدم كثيرًا ، أعتقد أنه يمكن أن يكون النقص عائقا خطيرا أمام الهجرة لكثيرين آخرين.
لقد وجدت مشروعًا مرقعًا يحتوي على ما يبدو على ما يعادل fabric.contrib ، لكن الرمز الخاص به لم يتم تحديثه منذ سنوات.
هل لديك أي خطة لنقل fabric.contrib إلى القماش 2؟

شكرا،
غابرييل

@ garu57 نعم ، الخطة الآن هي استخدام patchwork كـ "مساهمة 2.0" بشكل أساسي. في الوقت الحالي ، يعتمد على Fabric 1 ولكن هذا سيتغير بعد ظهور Fabric 2.0.0. أتوقع أن يتم نقل البتات المساهمة الأكثر استخدامًا بسرعة.

مرحبا جميعا،

أحيانًا يقوم برنامجي بتشغيل أمر بعيد مثل

source /opt/centos/vars && su - -c 'cd /opt/QA/rpm_tests/p_lvemanager && ALT_TEST=base ALT_PACKAGE_NAME=lvemanager ALT_PACKAGE_VERSION=3.0 ALT_PACKAGE_RELEASE=11.el6.cloudlinux.21100.1.1505113712 ./00-update-kernel.sh'

أرى أن البرامج النصية يتم تنفيذها على هذا النحو:

033[0;32m[DONE]\033[0m'
+ return 0
+ alt_test_done_msg 'Prepare evironment'
+ echo -e '* Prepare evironment    \033[0;32m[DONE]\033[0m'
+ exit 0

ويجب أن أرى أيضًا إخراج التصحيح الخاص بي "؟" حسب الكود الخاص بي:

class GenericFabric(object):
    def __init__(self, host, user, key_filename=None, port=22):
        connection_string = "{u}@{h}:{p}".format(u=user, h=host, p=port)
        self.connection = Connection(connection_string)
        self.key_filename = key_filename

    #<strong i="13">@with_settings</strong>
    def generic_cmd(self, command_str, timeout, fabric_timeout, **kwargs):
        """
        Creating remote container from template

        <strong i="14">@type</strong> command_str:     str
        <strong i="15">@param</strong> command_str:    command for execute with VM
        <strong i="16">@type</strong> timeout          int or float
        <strong i="17">@param</strong> timeout         number of seconds for pause
        <strong i="18">@type</strong> fabric_timeout   int or float
        <strong i="19">@param</strong> fabric_timeout  number of seconds for timeout fabric run

        <strong i="20">@rtype</strong>:                FabricResponse
        <strong i="21">@return</strong>:               Return remote status of operation VM
        """
        if fabric_timeout > 0:
            command = self.connection.run(command_str.format(**kwargs),
                                          timeout=fabric_timeout,
                                          warn=True, echo=True)
        else:
            command = self.connection.run(command_str.format(**kwargs),
                                          warn=True, echo=True)
        print("?")
        if timeout > 0:
            sleep(timeout)
        return FabricResponse(command)

    def simple_generic_cmd(self, command_str, **kwargs):
        """
        <strong i="22">@type</strong> command_str:     str
        <strong i="23">@param</strong> command_str:    command for execute with VM

        <strong i="24">@rtype</strong>:                FabricResponse
        <strong i="25">@return</strong>:               Return remote status of operation VM
        """
        return self.generic_cmd(command_str, 0.1, 0, **kwargs)

ولكن لا يوجد أحد "؟". لذلك أقترح أنه كان هناك معلق في المدى ().

في الواقع ، برنامجي ضخم وهناك برمجة متعددة العمليات. للإمساك بالتعليق ، أقوم بتنفيذ أوامر عن بُعد بالشفرة التالية:

class TestingSystemVM(GenericFabric):
#######
    <strong i="7">@signal_alarm_down</strong>
    def run_rpm_test(self, command_test, package, type_of_test="base"):
        """

        """
        signal.signal(signal.SIGALRM, alarm_handler)
        signal.alarm(self.__timeout)
        returned_value = Queue()
        start_time = datetime.utcnow()
        directory, command_test = os.path.split(command_test)
        try:
            if command_test.endswith(".yml"):
                directory = directory.replace("/opt/QA", self.ansible.git_qa_repo)
                output = self.ansible.play_ansible(command_test,
                                                   package,
                                                   directory)
            else:
                vm_instance = (self.host,
                               self.user,
                               self.key_filename,
                               self.os_name,
                               self.platform,
                               self.arch)
                running_test = Process(target=separate_process_running_test,
                                       args=(vm_instance,
                                             returned_value,
                                             directory,
                                             command_test,
                                             package,
                                             type_of_test))
                running_test.start()
                running_test.join(self.__timeout)
                if running_test.is_alive():
                    running_test.terminate()
                    command_test_res = "FAIL: Timeout\n"
                    return command_test_res, work_time(start_time), 1
                elif returned_value.empty():
                    command_test_res = "FAIL: Problem while getting result\n"
                    return command_test_res, work_time(start_time), 1
                else:
                    output = returned_value.get()
        except TimeOut:
            command_test_res = "FAIL: Timeout\n"
            return command_test_res, work_time(start_time), 1
        if output.failed or (package.name in ("lve-utils", "lve-stats") and
                                     "FAIL" in output.stdout):
            res_output = "FAIL: " + output.stdout
        else:
            res_output = output.stdout
        return res_output, work_time(start_time), 0 if output.succeeded else 1

def separate_process_running_test(vm_instance, return_value_queue,
                                  directory, command_test, package,
                                  type_of_test="base"):
    """

    """
    sleep(0.5)

    signal.signal(signal.SIGTERM, kill_fabric_runner)
    signal.signal(signal.SIGINT, kill_fabric_runner)
    (host,
     user,
     key_filename,
     os_name,
     platform,
     arch) = vm_instance
    child_vm_instance = TestingSystemVM(host,
                                        user,
                                        key_filename,
                                        os_name,
                                        platform,
                                        arch,
                                        FakeAnsible())
    if command_test.endswith(".bats"):
        command_test = "/usr/bin/bats --tap " + command_test
    else:
        command_test = os.path.join("./", command_test)

    output = child_vm_instance.simple_generic_cmd(child_vm_instance._c_run_test,
                                                  envvars=child_vm_instance.env_vars,
                                                  exec_test=command_test,
                                                  dir=directory,
                                                  package=package.name,
                                                  pver=package.version,
                                                  prel=package.release,
                                                  type_test=type_of_test)
    print("!")
    return_value_queue.put(output)

عندما أستخدم Fabric2 ، فإن بعض الأوامر التي يتم إطلاقها من العمليات الفرعية تكون معلقة من وقت لآخر.
التحديث. في الواقع ، كان خطأي في الكود. لذلك ، لا يحتوي النسيج 2 على تعليق

مرحبا جميعا،
لقد أجريت بعض تجارب الإطلاق ويمكنني مشاركة تجربتي.

أولاً ، قمت بتشغيل الأمر من وحدة التحكم الخاصة بي

ssh [email protected] -t "source /opt/centos/vars && su - -c 'cd /opt/QA/rpm_tests/p_lvemanager && ALT_TEST=base ALT_PACKAGE_NAME=lvemanager ALT_PACKAGE_VERSION=3.0 ALT_PACKAGE_RELEASE=11.el6.cloudlinux.21100.1.1505113712 ./01-prepare-environment.sh'"

وانتهى ذلك بشكل مثالي وسريع مع خروج = 0:

###
+ echo -e '* Prepare evironment    \033[0;32m[DONE]\033[0m'
* Prepare evironment    [DONE]
+ exit 0
Connection to 192.168.0.34 closed.

حسن.
ثم قمت بتنفيذ أمر آخر:

ssh [email protected] "source /opt/centos/vars && su - -c 'cd /opt/QA/rpm_tests/p_lvemanager && ALT_TEST=base ALT_PACKAGE_NAME=lvemanager ALT_PACKAGE_VERSION=3.0 ALT_PACKAGE_RELEASE=11.el6.cloudlinux.21100.1.1505113712 ./01-prepare-environment.sh'"

تم الانتهاء من ذلك بسرعة كبيرة مع خروج = 0 أيضًا:

###
+ echo -e '* Prepare evironment    \033[0;32m[DONE]\033[0m'
+ exit 0

ولكن لا يوجد "اتصال مغلق بـ 192.168.0.36." لا أعلم أنه مهم أم لا.

بعد ذلك أعدت إنشاء أجهزة افتراضية وأطلقت الأمر بواسطة fabric2 (من IPython):

In [1]: from fabric import Connection
In [2]: Connection('[email protected]').run("source /opt/centos/vars && su - -c 'cd /opt/QA/rpm_tests/p_lvemanager && ALT_TEST=base ALT_PACKAGE_NAME=lvemanager ALT_PACKAGE_VERSION=3.0 ALT_PACKAGE_RELEASE=11.el6.cloudlinux.21100.1.1505113712 ./01-prepare-environment.sh'", pty=True)
....
+ echo -e '* Prepare evironment    \033[0;32m[DONE]\033[0m'
* Prepare evironment    [DONE]
+ exit 0
Out[2]: <Result cmd="source /opt/centos/vars && su - -c 'cd /opt/QA/rpm_tests/p_lvemanager && ALT_TEST=base ALT_PACKAGE_NAME=lvemanager ALT_PACKAGE_VERSION=3.0 ALT_PACKAGE_RELEASE=11.el6.cloudlinux.21100.1.1505113712 ./01-prepare-environment.sh'" exited=0>

أيضًا ، جريت مع pty = خطأ:

In [1]: from fabric import Connection

In [2]: Connection('[email protected]').run("source /opt/centos/vars && su - -c 'cd /opt/QA/rpm_tests/p_lvemanager && ALT_TEST=base ALT_PACKAGE_NAME=lvemanager ALT_PACKAGE_VERSION=3.0 ALT_PACKAGE_RELEASE=11.el6.cloudlinux.21100.1.1505113712 ./01-prepare-environment.sh'", pty=False)
+ echo -e '* Prepare evironment    \033[0;32m[DONE]\033[0m'
+ exit 0
Out[2]: <Result cmd="source /opt/centos/vars && su - -c 'cd /opt/QA/rpm_tests/p_lvemanager && ALT_TEST=base ALT_PACKAGE_NAME=lvemanager ALT_PACKAGE_VERSION=3.0 ALT_PACKAGE_RELEASE=11.el6.cloudlinux.21100.1.1505113712 ./01-prepare-environment.sh'" exited=0>

لم يكن هناك "اتصال بـمغلق "في كلا الاختبارين. مرة أخرى لا أعلم أنه مهم أم لا.

ثانيًا ، قررت أن هذه ليست بيئة جيدة لموقفي ، لأنني بحاجة إلى الانطلاق من عملية الطفل. لذلك ، أعدت إنشاء VMs مرة أخرى وقمت بتشغيل البرنامج النصي مع الكود التالي:

In [1]: import subprocess

In [2]: t = subprocess.Popen(""" ssh [email protected] -t "source /opt/centos/vars && su - -c 'cd /opt/QA/rpm_tests/p_lvemanager && ALT_TEST=base ALT_PACKAGE_NAME=lvemanager ALT_PACKAGE_VERSION=3.0 ALT_PACKAGE_RELEASE=11.el6.cloudlinux.21100.1.1505113712 ./01-prepare-environment.sh'" """, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True); r = t.communicate()

في إخراج هذا التشغيل كان هناك "تم إغلاق الاتصال بـ 192.168.0.34."

على الجانب الآخر

In [1]: import subprocess

In [2]: t = subprocess.Popen(""" ssh [email protected] "source /opt/centos/vars && su - -c 'cd /opt/QA/rpm_tests/p_lvemanager && ALT_TEST=base ALT_PACKAGE_NAME=lvemanager ALT_PACKAGE_VERSION=3.0 ALT_PACKAGE_RELEASE=11.el6.cloudlinux.21100.1.1505113712 ./01-prepare-environment.sh'" """, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True); r = t.communicate()

كلاهما لم يشنقا.

الليلة سأطلق نصوصي باستخدام fabric2 في العملية التي تم تفرعها وسأكتب.
التحديث. في الواقع ، كان خطأي في الكود. لذلك ، لا يحتوي النسيج 2 على تعليق.

سيكون من الجيد الحصول على دعم use_sudo لـ Transfer.put .

أعتقد أن أبسط حل في الوقت الحالي هو فقط القيام بـ put في مكان ما لدي أذونات ، ثم sudo mv ؟

@ ned2 هذا كل ما يمكن أن يفعله use_sudo في get / put على أي حال ، على سبيل المثال كيف يفعل v1. ليس من الممكن في الواقع تحميل ملف "مع sudo" على حد علمي! (ليس بدون الاتصال كجذر ، وهي فكرة سيئة ومن الناحية المثالية غير مسموح بها حتى).

نظرًا لمحاولة الحصول على واجهة برمجة تطبيقات أكثر نظافة إلى حد ما في الإصدار 2 ، فمن المرجح أن أقوم بتطبيق غلاف بدلاً من تجميع هذا السلوك داخل get / put أنفسهم. ربما شيء مثل Transfer.sudo_put (والذي قد يستدعي self.put ). بهذه الطريقة يتم الحفاظ على الحد الأدنى من put "الصافي".

bitprophet ، أود أن أبدأ بتوجيه الشكر لك على بعض البرامج المستقرة والمفيدة جدًا باستخدام Fabric1 وطريقتك في إطلاق Fabric2.

لقد بدأت في اللعب مع الإصدار 2 لكنني واجهت مشكلة في الاتصال. أنا أستخدم تكوين SSH الخاص بي من Fabric 1 ، سيطالبك Fabric 1 بكلمة مرور عند محاولة الاتصال. النسيج 2 لا يفعل ذلك ويفشل في الإشارة إلى أن المصادقة قد فشلت. لا يمكنني رؤية أي مكان في v2 docs يشير إلى آلية المصادقة للاتصال. هناك ذكر لكلمات المرور مع sudo ولكن مما يمكنني جمعه بعد أن كان الاتصال ناجحًا على أي حال ..

سؤالي هو ما إذا فاتني شيء ما في المستندات أو ما إذا كانت هذه ميزة مفقودة أو مشكلة.

الرمز:

<strong i="10">@task</strong>
def testing(c):
    with Connection('MyHostname') as cxn:
        print("Connected")

        cxn.run('ls -l')

الخطأ:

  File /lib/python3.4/site-packages/paramiko/auth_handler.py", line 223, in wait_for_response
    raise e 
paramiko.ssh_exception.AuthenticationException: Authentication failed.

تكوين SSH الخاص بي (تم استبدال القيم للنشر هنا):

Host MyHostname
  HostName replacedhostname.co.uk
  Port 22
  IdentityFile ~/.ssh/id_rsa
  User replaceduser

أنا على أحدث إصدار v2: https://github.com/fabric/fabric/commit/fec3a22ee89900500ae731913fd33f9b56e89f46

نأمل أن يساعد حل هذا أي شخص آخر يعاني من نفس المشكلة.

شكرا لك على وقتك.

@ Aiky30 ربما لست أنت ، لا تزال عناصر المصادقة بحاجة إلى عمل (يرجع ذلك في جزء كبير منه إلى الحاجة إلى بعض أعمال Paramiko قيد التقدم ، لذا لا يصعب تفسير استثناءات المصادقة بشكل فظيع.) أعتقد في هذه الحالة أنه قد يكون الأمر ببساطة هو Fab 2 لا يفسر IdentityFile - نحن نحصل على المضيف والمستخدم والمنفذ ومجموعة من الإعدادات الأخرى ولكن IdentityFile لا يزال TODO.

هذا جزئيًا لأننا أيضًا لا نتعامل مع عبارات المرور في الوقت الحالي (انظر أعلاه - نريد تجنب خطأ Fabric 1 كبير حيث يتعين علينا إجراء تخمينات جامحة إذا كان فشل المصادقة المعين يعني الحاجة إلى كلمة المرور أو عبارة المرور). لذلك من المحتمل أنك ستنتقل إلى الخطأ "لا يمكنني إلغاء قفل هذا الملف" بعد ذلك. وكلاهما لأنني أستخدم وكيل ssh في معظم الأوقات - والذي سيكون اقتراحي الأول لحل بديل فوري.

ومع ذلك ، أعتقد أنه من المحتمل أن يكون الأمر يستحق القرصنة في كل من IdentityFile ودعم تكوين عبارة المرور الصريح ، لأن المفاتيح غير الوكيل هي على الأرجح إعداد المصادقة رقم 1 الأكثر شيوعًا ، لذا فإن الافتقار إليها ربما يعني أن معظم مستخدمي alpha / beta تركوا في مأزق . سوف أرى ما إذا كان بإمكاني تحقيق ذلك اليوم.

استغرق 2.0a لتدور.

1) أنا أيضًا ضائع قليلاً في كيفية تعريف المضيفين واستخدامهم بالفعل. يمكنني الركض:

   fab -H user<strong i="7">@host</strong>:22 some-task

ولكن إذا كنت لا أرغب في تمرير تفاصيل المضيف (المستخدم ، المضيف ، المنفذ) في كل مرة ، فأنا لست متأكدًا من كيفية تكوين المضيفات في fabfile.py ( Connection s أو Group ) ثم قم بالإشارة إليهم فقط. إذا فهمت https://github.com/fabric/fabric/issues/1591#issuecomment -296343613 بشكل صحيح ، فهو غير مدعوم في الوقت الحالي (ويتم تتبعه في https://github.com/fabric/fabric/issues/1594 )؟

2) أيضًا ، واجهت مشكلة حيث قمت بتشفير مفتاح SSH (بسعر ~/.ssh/id_rsa ) ولديّ ssh-add 'd إلى ssh-agent . يظهر إذا قمت بإدراج المفاتيح عبر ssh-add -l . عندما أقوم بتنفيذ بعض المهام ، أعطي اسم المستخدم الصحيح:

   fab -H musttu<strong i="20">@host</strong> sometask

تعمل الأشياء بشكل جيد. ولكن إذا استخدمت مستخدمًا غير صحيح ، على سبيل المثال fab -H bad_user<strong i="23">@host</strong> sometask ، فسأحصل على:

Traceback (most recent call last): ... File "/home/maximus/.virtualenvs/testenv/lib/python3.6/site-packages/paramiko/pkey.py", line 326, in _read_private_key raise PasswordRequiredException('Private key file is encrypted') paramiko.ssh_exception.PasswordRequiredException: Private key file is encrypted

لكنني أفترض أن هذا يندرج تحت https://github.com/paramiko/paramiko/issues/387 ولا يقتصر حقًا على القماش 2.0. لكن نعم ، من الغريب أن تحصل على خطأ PasswordRequiredException: Private key file is encrypted ، عندما يكون لدى وكيل ssh بالفعل المفتاح الذي تم فك تشفيره. إذا فهمت بشكل صحيح ، فبعد تسجيل دخول غير صالح ، سيعود paramiko إلى استخدام المفتاح مباشرةً ، وبدون عبارة المرور المقدمة سيؤدي إلى حدوث هذا الخطأ.

3) سيكون من الجيد السماح بوظائف مهمة كتابة التعليقات التوضيحية (لإكمال تلقائي أفضل في IDE). هل كان لديك وقت للتفكير في https://github.com/pyinvoke/invoke/pull/458 ؟

4) أحب فكرة مكتبة الترقيع. بالنسبة إلى النسيج 1.x ، يوجد https://github.com/sebastien/cuisine (يبدو أنه ميت جدًا) يحتوي على الكثير من الوظائف الإضافية (لم أستخدمها بنفسي). هل الفكرة مع خليط لبناء شيء مشابه (لذلك وظائف تعريفية على غرار Chef / Ansible / SaltStack ، وإن كانت ذات نطاق محدود)؟ لطالما كرهت نهج YAML / DSL متعدد المسارات / متعدد الملفات الذي تتبعه الأدوات الأخرى ، وأود فقط البقاء في بايثون ، للحصول على مزيد من المرونة ، وبناء جملة أقل ، وإكمال IDE التلقائي ، وتصحيح الأخطاء بسهولة ، وما إلى ذلك.

5) ما عليك سوى إسقاط دعم py 2.6 و 3.2-3.3 للنسيج 2.0. ألا يجب على الناس المضي قدمًا؟

tuukkamustonen - شكرًا على ملاحظاتك! استجابات:

  1. الأدوار مغطاة بالفعل تحت رقم 1594 - وأعتقد أن هناك تذكرة أخرى للمسألة ذات الصلة المتمثلة في وجود بيانات تكوين لكل مضيف ، بصرف النظر عن كيفية دعم ssh_config لذلك على مستواه الخاص.

    إن تحديد كيفية التوفيق بالضبط بين التكوين على مستوى النسيج مع ssh_config ثم أيضًا مع أي شيء من بيانات المجموعة أو وقت التشغيل ... ليس بالأمر السهل. على الرغم من أنه يجب أن يحدث قريبًا بالتأكيد ؛ أريد فقط الحصول على حل نصف مدروس بدلاً من المسودة الأولى.

  2. مرة أخرى ، نعم ، هذه هي تذكرة Paramiko التي ذكرتها ، وتخمينك دقيق ، وسيفشل وضع اسم المستخدم السيئ دائمًا في النهاية ، وبما أن Paramiko لا يتتبع سوى الخطأ الأخير الذي واجهته ، فقد حدث أن آخر شيء جربته كان نسخة مشفرة على القرص من المفتاح. (إذا قمت بنقل هذا المفتاح إلى مكان آخر ، على سبيل المثال ، فسيكون الخطأ الأخير شيئًا آخر.)

  3. لقد علقت للتو على تلك التذكرة ، فقد (أو لا) تكرر التذاكر الحالية لنفس الميزة الإجمالية. لقد علقت على هؤلاء الأكبر سنًا و IIRC إنه "نعم أعتقد أنه سيكون لطيفًا طالما أنه لا يفسد Python 2." ومع ذلك ، فهي ليست ذات أولوية عالية مثل معظم الميزات المفقودة الأكبر ، لذا فهي تندرج في قائمة "تحتاج إلى ميزة رائعة ، حيث يتم تحديد جميع المربعات في العلاقات العامة التي يمكنني دمجها فقط" :)

  4. نعم ، انظر رقم 461 الذي هو قديم جدًا ولكنه لا يزال في ذهني. السؤال الكبير في هذه الأيام هو كيف سيتم كتابة هذا الليب ليشمل كل من Invoke و Fabric ؛ في كثير / معظم الحالات ، يمكن للمرء ببساطة كتابة مهام استدعاء عامة لا "تعرف" أي سياقات محلية / بعيدة منفصلة ، والتي يمكن تسليمها سياق اتصال Fabric عندما يريد المرء تشغيلها ضد نظام بعيد.

    قد ترغب مهام "الحيادية للسياق" في العيش في مكتبة "الاستدعاءات" (أو غيرها من مكتبات "الاستدعاء") ؛ لكن البعض (على سبيل المثال ، أي شيء يتضمن نقل الملفات وليس فقط أوامر الصدف) يحتاج إلى أن يكون "مدركًا للأقمشة". إن معرفة كيفية سد هذه الفجوة هو المشكلة.

    يمكن أن يسلك مسار "هذا lib يتطلب فقط استدعاء ، لا يتطلب نسيجًا صعبًا ، _ ولكن _ ستشتكي مجموعة فرعية من المهام إذا لم تقم بتثبيت النسيج وتسليمها سياق اتصال." يمكن أن ينقسم إلى شحمتين (حيث تتطلب واحدة موجهة النسيج تتطلب Invoke أكثر عمومية.) إلخ.

  5. اعتبارًا من الآونة الأخيرة ، هذا بالتأكيد موجود في البطاقات ، راجع paramiko / paramiko # 1070 و / أو pyinvoke / invoke # 364. استدعاء 1.0 ، Fabric 2.0 و Paramiko 3.0 (أو ، _maybe_ ، 2.4 / 2.5 / أيًا كان) سيكون جميعها Python 2.7 / 3.4 وما فوق.

حول (1):

أنا متأكد من أنك تعرف هذا بالفعل ، ولكن قد ترغب في الحصول على بعض الأفكار من قوائم جرد Ansible . أو ربما لا :).

حول (4):

أعتقد أن https://github.com/pyinvoke/invocations طريقة للتعبير عن رأيها. توفر Invocations _conventions_ ويمكن أن تبني فوق حزمة خليط / نمط المطبخ ، لكنني لن أخلط الاصطلاحات (كيفية الإصدار أو العقيدة) مع الأدوات المساعدة (كيفية نسخ الملف أو تغيير الأذونات).

لا أرى مشكلة في وضع الأدوات للعمليات المحلية فقط وعن بعد والمحلية + عن بُعد في نفس المكتبة (الترقيع). ما العملية التي تدعم الوضع الذي يمكن التعامل معه كتوثيق (مثل docstring ، يتم إنشاؤه تلقائيًا من التعليق التوضيحي ، وما إلى ذلك).

هذا شعور أفضل من تقسيم المنطق إلى حزمتين أو أكثر. لأنك ماذا لو أضفت أولاً عملية إلى حزمة "الاستدعاء فقط" (وقد تكون هناك عمليات "عن بُعد فقط") ، ثم أضفت لاحقًا دعمًا لها لتعمل أيضًا على الخوادم البعيدة؟ هل ستنقل الرمز أو تنسخه أو تمدده؟ في كلتا الحالتين ، يتطلب الأمر مزيدًا من العمل ، ويحتاج المستخدم إلى استيراد مختلف ، وما إلى ذلك ، لذا يبدو الأمر مرهقًا بعض الشيء.

ما الذي يمكنني فعله للحصول على هذا المصقول بما يكفي للذهاب إلى PyPi؟

haydenflinner سيحدث خلال الأسبوع أو الأسبوعين المقبلين !! (الهدف هو الإفراج قبل أن أصعد على متن طائرتي إلى PyCon ، وهو 10 مايو)

على سبيل المثال ، يرجى الاطلاع على مستندات الترقية المحدثة مؤخرًا التي كنت أعمل عليها هذا الأسبوع: http://docs.fabfile.org/en/v2/upgrading.html

في الواقع ، قد أغلق هذه التذكرة الآن ، لأنني سأقبل بطاقات حقيقية حقيقية لـ 2.0.0 وما فوق قريبًا 👍

دوِّن ملاحظة ، لا يزال بإمكانك التعليق هنا إذا أردت. لاحظ أنني آمل أن أنجز على الأقل عددًا قليلاً من الأعمال المميزة قبل الإصدار ، جنبًا إلى جنب مع جميع الأعمال التحضيرية لإدارة المشروع.

نظرت إلى fabric v2 اليوم وأنا آسف ، لا يمكنني استخدام نفسي لاستخدامه.

  1. أين ذهبت roledefs؟ لماذا لا يمكنني تمرير اسم دور في سطر الأوامر بعد الآن؟ هل من المفترض أن أنفذ هذا بنفسي؟
  2. لماذا لا يمكنني تمرير الحجج إلى المهام في سطر الأوامر بعد الآن؟ هل من المفترض أن أقوم بتنفيذ هذا بنفسي أيضًا؟
  3. لماذا يجب أن تأتي المعلمة -H قبل معلمة المهمة؟ يجب ان تكون الطريقة الثانية. هذا فظيع جدا.

تأخذ المهام الحجج ، لكن البنية تغيرت. راجع http://docs.pyinvoke.org/en/1.1/concepts/invoking-tasks.html#task -command-line-arguments

dgarstang قد ترغب في التفكير في اتخاذ نبرة أكثر حيادية أو تعاطفًا مع الأشخاص الذين يمنحونك عملهم المجاني! فقط قل

  1. راجع # 1594 ، الذي يرتبط IIRC في مستند الترقية
  2. ploxiln حصلت على ظهرك هنا
  3. (جزئيًا) راجع رقم 1772 الذي تم دمجه لإتقان وسيصدر قريبًا ؛ يضيف القدرة على استخدام @task(hosts=xxx) .

(بخصوص: 3: من حيث إعطاء --hosts والأصدقاء كما لو كانوا وسيطات لكل مهمة ، هذا شيء قد أضيفه في وقت ما ، لقد تمزقنا بشأن ما إذا كان الأمر يستحق ذلك. على غرار كل مهمة --help ، فكلما أضفنا المزيد من الاستبعادات "السحرية" ، زادت فرصة محاولة المستخدم استخدام نفس الاسم في مهامهم الخاصة ويصاب بالارتباك عند تعطله.)

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات