Fabric: النسيج لا يمرر البيئة إلى قشرة محلية مثل Invoke

تم إنشاؤها على ١١ مايو ٢٠١٨  ·  14تعليقات  ·  مصدر: fabric/fabric

ضع في اعتبارك تعريف المهمة هذا ، الذي تم حفظه كـ fabfile.py و tasks.py :

from invoke import task

<strong i="8">@task</strong>
def make(c):
    c.run('env')

المخرجات fab make :

PWD=/tmp
SHLVL=1
_=/usr/bin/env

المخرجات inv make :

LC_ALL=en_US.UTF-8
NVM_DIR=/home/justinas/.nvm
LC_MEASUREMENT=en_US.UTF-8
LC_PAPER=en_US.UTF-8
LC_MONETARY=en_US.UTF-8
<...> (lots of stuff in my environment)

لقد وجدت هذا في البداية عند محاولة استخدام fpm الذي يتحقق من المتغير PATH للتحقق من وجود الملفات التنفيذية التي يتطلبها للعمل:

from invoke import task

<strong i="22">@task</strong>
def make(c):
    c.run('fpm -s dir -t rpm -C dist --name somename .')

يعمل هذا مع الاستدعاء ، ولكن ليس مع القوات المسلحة البوروندية.

justinas<strong i="26">@js</strong>:/tmp$ fab make
{:timestamp=>"2018-05-11T13:11:26.218874+0300", :message=>"Need executable 'rpmbuild' to convert dir to rpm", :level=>:error}
justinas<strong i="27">@js</strong>:/tmp$ inv make
{:timestamp=>"2018-05-11T13:11:29.967762+0300", :message=>"Created package", :path=>"somename-1.0-1.x86_64.rpm"}
Bug Connection Needs investigation run()

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

أنا فقط واجهت هذا أيضا. كنت أقوم بعمل c.run('make build') ولم ينجح أي من ENV (تحديدًا GOPATH الذي تسبب في فشل الإنشاء). إضافة replace_env=False إصلاحه.

تحرير: أرى وفقًا للمستندات :

run.replace_env: صحيح ، بدلاً من False ، بحيث تعمل الأوامر البعيدة مع بيئة فارغة "نظيفة" بدلاً من وراثة نسخة من بيئة العملية الحالية.

لقد كان الأمر محيرًا بعض الشيء بالنسبة لي لأنني كنت أحاول تشغيل أمر محلي.

ال 14 كومينتر

لقد اكتشفت وصف هذا السلوك. ومع ذلك ، لا معنى عند تشغيل الأمر محليًا

هذا نموذجي لتشغيل الأوامر على الأنظمة البعيدة:

$ env | wc -l
      41
$ ssh testdeploy01.ec2.st-av.net env | wc -l
      14
$ ssh testdeploy01.ec2.st-av.net grep Env /etc/ssh/sshd_config
AcceptEnv LANG LC_*
         Specifies what environment variables sent by the client will be copied into
         the session's environ(7).  See SendEnv in ssh_config(5) for how to configure
         the client.  The TERM environment variable is always sent whenever the
         client requests a pseudo-terminal as it is required by the protocol.  Vari-
         ables are specified by name, which may contain the wildcard characters `*'
         and `?'.  Multiple environment variables may be separated by whitespace or
         spread across multiple AcceptEnv directives.  Be warned that some environ-
         ment variables could be used to bypass restricted user environments.  For
         this reason, care should be taken in the use of this directive.  The default
         is not to accept any environment variables.

يمكن للمرء محاولة المرور عبر جميع متغيرات البيئة من خلال جمع البيئة المحلية بأكملها ووضعها على الجانب الآخر ، ولكن هناك عددًا كبيرًا يجب تجاهله لأنه سيتعارض مع القيمة المناسبة للنظام البعيد ، مثل PATH ، GOPATH (إذا كنت تستخدم لغة Go) ، TMPDIR ، HOME ، SSH_AUTH_SOCK ، ...

لاحظ أنني أتحدث فقط عن المهام المحلية. لقد اكتشفت حتى تعليق TODO الذي يؤكد أن بيئة المرور يجب أن تكون قيد التشغيل افتراضيًا للأوامر المحلية.

آه ، أرى أنه أمر منطقي

justinas انتهى بي الأمر باستخدام التشغيل من استوردها على النحو التالي :

from invoke import run as local

<strong i="7">@task</strong>
def test(c):
    local('ls')

هذا وجه من وجوه # 1752 - القصد من local أن يتصرف مثل Invoke ويحافظ على البيئة ، و run يتصرف بشكل صحيح مثل SSH ويتجاهل البيئة المحيطة. ومع ذلك ، في الوقت الحالي ، لا يتم تقسيم التكوينات التي تقود هذا السلوك بشكل صحيح - إنه خطأ فعال. سنقوم بإصلاحه قريبًا.

شكرا للإستجابة!

لقد اصطدمت للتو بنفس المشكلة وأردت فقط أن أشير إلى أنه لا يتم التخلص من البيئة المحلية فقط.

ربما تكون على دراية بهذا الخطأ أيضًا.

للتوضيح ، هذا لم ينجح بالنسبة لي:

<strong i="8">@task</strong>
def test(c):
    c.run('echo $ENV', env={'ENV': 'production'}) # no output

في الوقت الحالي ، وجدت هذا الحل البديل (ليس نظيفًا جدًا) الذي يمكنني استخدامه:

<strong i="12">@task</strong>
def test(c):
    with c.prefix('ENV=production'):
        c.run('echo $ENV') # prints "production"

نعم ، على علم بذلك ، شكرًا!

يمكنك أن تقول run('...', preserve_env=True) للتغلب على ذلك الآن ، IIRC.

preserve_env غير موجود. ربما كنت تشير إلى replace_env=False ؟
لا يؤدي ذلك إلى حدوث خطأ ولكن لا يزال يتم تجاهل البيئة.

ملاحظة: أحتاج إلى ضبط البيئة للمهام البعيدة ، وليس المحلية.

نعم ، قصدت replace_env ومن الغريب أن هذا لا يعمل. سألقي نظرة عندما أقوم بتقسيم التكوين بين محلي / بعيد (# 1752)

أنا فقط واجهت هذا أيضا. كنت أقوم بعمل c.run('make build') ولم ينجح أي من ENV (تحديدًا GOPATH الذي تسبب في فشل الإنشاء). إضافة replace_env=False إصلاحه.

تحرير: أرى وفقًا للمستندات :

run.replace_env: صحيح ، بدلاً من False ، بحيث تعمل الأوامر البعيدة مع بيئة فارغة "نظيفة" بدلاً من وراثة نسخة من بيئة العملية الحالية.

لقد كان الأمر محيرًا بعض الشيء بالنسبة لي لأنني كنت أحاول تشغيل أمر محلي.

لا تزال المشكلة قائمة عند تشغيل الأمر المحلي. تضمين التغريدة

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

القضايا ذات الصلة

bitprophet picture bitprophet  ·  6تعليقات

TimotheeJeannin picture TimotheeJeannin  ·  3تعليقات

Grazfather picture Grazfather  ·  4تعليقات

jamesob picture jamesob  ·  3تعليقات

harobed picture harobed  ·  5تعليقات