Fabric: Fabric tidak meneruskan lingkungan ke shell lokal seperti yang dilakukan oleh Invoke

Dibuat pada 11 Mei 2018  ·  14Komentar  ·  Sumber: fabric/fabric

Pertimbangkan definisi tugas ini, disimpan sebagai fabfile.py dan tasks.py :

from invoke import task

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

fab make keluaran:

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

inv make keluaran:

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)

Saya awalnya menemukan ini ketika mencoba menggunakan fpm yang memeriksa variabel PATH untuk memeriksa bahwa executable yang diperlukan untuk berfungsi ada:

from invoke import task

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

Ini berfungsi dengan memohon, tetapi tidak dengan hebat.

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()

Komentar yang paling membantu

Saya baru saja mengalami ini juga. Saya melakukan c.run('make build') dan tidak ada ENV saya yang berhasil (khususnya GOPATH yang menyebabkan build gagal). Menambahkan replace_env=False memperbaikinya.

Edit: Saya melihat menurut dokumen :

run.replace_env: Benar, bukan Salah, sehingga perintah jarak jauh berjalan dengan lingkungan 'bersih' dan kosong alih-alih mewarisi salinan lingkungan proses saat ini.

Itu hanya sedikit membingungkan saya karena saya mencoba menjalankan perintah lokal.

Semua 14 komentar

Saya menemukan deskripsi perilaku ini. Namun, tidak masuk akal saat menjalankan perintah secara lokal

Ini tipikal untuk menjalankan perintah pada sistem jarak jauh:

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

Seseorang dapat mencoba melewati semua variabel lingkungan dengan mengumpulkan seluruh lingkungan lokal dan mengaturnya di sisi lain, tetapi ada cukup banyak yang perlu diabaikan karena akan bertentangan dengan nilai yang sesuai untuk sistem jarak jauh, seperti PATH , GOPATH (jika Anda menggunakan bahasa Go), TMPDIR , HOME , SSH_AUTH_SOCK , ...

Perhatikan bahwa saya hanya berbicara tentang tugas-tugas lokal. Saya bahkan telah menemukan komentar TODO yang menegaskan bahwa lingkungan yang lewat harus diaktifkan secara default untuk perintah lokal.

ah, begitu, masuk akal

@justinas Saya akhirnya menggunakan run from invoke untuk tugas lokal, saya mengimpornya seperti ini:

from invoke import run as local

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

Ini adalah facet dari # 1752 - tujuannya adalah untuk local berperilaku seperti Invoke dan mempertahankan env, dan untuk run berperilaku seperti SSH dan membuang env. Namun, saat ini konfigurasi yang mendorong perilaku ini tidak dibagi dengan benar - ini secara efektif merupakan bug. Kami akan segera memperbaikinya.

Terima kasih atas tanggapannya!

Saya baru saja mengalami masalah yang sama dan saya hanya ingin mencatat bahwa bukan hanya lingkungan lokal yang dibuang.

Mungkin Anda juga sudah mengetahui bug ini.

Untuk memperjelas, ini tidak berhasil untuk saya:

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

Untuk saat ini saya menemukan solusi ini (tidak terlalu bersih) yang dapat saya gunakan:

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

Ya, sadarilah itu, terima kasih!

Anda dapat mengatakan run('...', preserve_env=True) untuk mengatasinya untuk saat ini, IIRC.

preserve_env sepertinya tidak ada. Mungkin Anda mengacu pada replace_env=False ?
Itu tidak memicu kesalahan tetapi lingkungan masih dibuang.

PS: Saya perlu mengatur lingkungan untuk tugas jarak jauh, bukan lokal.

Ya, maksud saya replace_env dan anehnya itu tidak berhasil. Saya akan melihat ketika saya membagi konfigurasi antara lokal / jarak jauh (# 1752)

Saya baru saja mengalami ini juga. Saya melakukan c.run('make build') dan tidak ada ENV saya yang berhasil (khususnya GOPATH yang menyebabkan build gagal). Menambahkan replace_env=False memperbaikinya.

Edit: Saya melihat menurut dokumen :

run.replace_env: Benar, bukan Salah, sehingga perintah jarak jauh berjalan dengan lingkungan 'bersih' dan kosong alih-alih mewarisi salinan lingkungan proses saat ini.

Itu hanya sedikit membingungkan saya karena saya mencoba menjalankan perintah lokal.

Masalahnya masih ada saat menjalankan perintah lokal. @tokopedia

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

bitprophet picture bitprophet  ·  6Komentar

supriyopaul picture supriyopaul  ·  4Komentar

26huitailang picture 26huitailang  ·  3Komentar

omzev picture omzev  ·  6Komentar

yuvadm picture yuvadm  ·  5Komentar