Fabric: Meta-tiket umpan balik alfa/beta Fabric 2!

Dibuat pada 21 Apr 2017  ·  28Komentar  ·  Sumber: fabric/fabric

Pastikan Anda telah membaca posting blog ini dan semua tautannya terlebih dahulu!: http://bitprophet.org/blog/2017/04/17/fabric-2-alpha-beta


Ini adalah tempat untuk meninggalkan umpan balik untuk masalah yang tidak tercakup dalam tiket yang ada; silakan cari tempat-tempat di bawah ini terlebih dahulu!!


Tidak menemukan sesuatu yang relevan? Tinggalkan komentar di bawah! Saya mencari umpan balik _serupa tetapi tidak terbatas pada_:

  • "Saya menolak menggunakan 2.0 sampai Anda mengembalikan mode ajaib, global, non-objek!" (meskipun saya hanya akan menautkan Anda ke pyinvoke/invoke#186 dan meminta Anda untuk memberikan alasan di sana;))
  • "Saya sangat menyukai apa yang Anda lakukan dengan $feature tetapi tidak ada $sub-feature, yang sangat saya butuhkan! Apakah itu direncanakan?" (Saya akan mengatakan 'ya', 'tidak' atau 'tidak, tetapi sekarang Anda dapat dengan mudah menerapkannya sendiri! tidak perlu di inti!')
  • "Saya sangat menyukai apa yang Anda lakukan dengan $feature tetapi cara pengaturannya sekarang, sulit/tidak mungkin untuk melakukan $sub-use-case!" (Saya mungkin akan menanyakan detailnya kepada Anda dan mungkin meminta contoh PR API yang ingin Anda lihat.)

Komentar yang paling membantu

@haydenflinner Ini terjadi selama satu atau dua minggu ke depan!! (Tujuannya adalah untuk melepaskan sebelum saya naik pesawat ke PyCon, yaitu 10 Mei.)

Misalnya, silakan lihat dokumen pemutakhiran yang baru saja diperbarui yang baru saja saya kerjakan minggu ini: http://docs.fabfile.org/en/v2/upgrading.html

Sebenarnya, saya mungkin juga menutup tiket ini sekarang, karena saya akan segera menerima tiket asli untuk 2.0.0 ke atas 👍

Semua 28 komentar

Pergi untuk menunjukkan seberapa baik saya mengingat situs web saya sendiri, ya? Terima kasih! Saya bahkan menjalankan pemeriksa tautan di posting saya, tapi ... tidak bertentangan dengan tiket ini;)

Saya memiliki proposal bagaimana sistem roledefs fabric 1 dapat diimplementasikan dengan cara yang saya yakini sejalan dengan filosofi fabric 2. Setiap Collection tugas juga dapat memiliki fungsi yang didekorasi dengan @group dalam namespace yang sama yang mengembalikan objek Group yang diisi dengan tugas yang dapat dijalankan. Ruang nama akan penting, jadi jika fabfile.py berisi Collection bernama deploy yang memiliki @group s disebut web dan db , seseorang dapat menggunakan deploy.web.execute(mytask) atau fab -G deploy.web mytask untuk mengeksekusi mytask pada setiap host dalam grup web . Fungsi-fungsi yang didekorasi ini akan dipanggil dengan malas dan memo untuk mencegah panggilan API yang tidak perlu, jika pencarian daftar host menjadi operasi yang lambat seperti yang diterapkan oleh pengguna.

Apakah ini sejalan dengan filosofi desain untuk kain 2? Saya ingin mengambil ayunan dalam implementasi jika demikian.

Itu ide yang bagus, @RedKrieg! Saya telah menunda curah pendapat saya sendiri tentang cara "terbaik" untuk menghasilkan objek Grup dan/atau bagaimana merujuknya ke CLI, tetapi begitu saja kedengarannya seperti cara yang masuk akal. Saya baru saja membuang terlalu banyak kata di #1594 dan memasukkan ide Anda di sana (+ tautan). Mari kita lanjutkan diskusi di sana, tapi tl;dr ya saya ingin melihat PR PoC.

Apa pendekatan terbaik untuk menjalankan perintah secara lokal meskipun ada argumen -H , misalnya jika saya ingin menggabungkan build lokal dan rsync ke Host jarak jauh menjadi satu tugas?

@max-arnold Objek koneksi memiliki atribut .local yang berfungsi seperti .run pada mesin lokal: http://docs.fabfile.org/en/v2/api/connection.html#fabric .koneksi.Koneksi.lokal

Oke, saya kira contoh lebih baik daripada kata-kata:

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

Tugas gabungan berjalan dengan baik:

fab -H host deploy

Tugas lokal saja gagal dengan AttributeError: Tidak ada atribut atau kunci konfigurasi yang ditemukan untuk 'lokal':

fab build

Pada dasarnya saya ingin memiliki tugas yang melakukan sesuatu secara lokal, tidak peduli bagaimana itu dipanggil (dengan atau tanpa -H ).

Dari sisi lain, beberapa perintah hanya dimaksudkan untuk dijalankan dari jarak jauh. Jika tidak ada host, ctx.run akan mencoba menjalankannya secara lokal, yang dapat menyebabkan konsekuensi yang tidak terduga.

| Pengguna menjalankan tugas | Penulis perintah/tugas ingin menjalankannya | Bagaimana seharusnya berperilaku? |
|---------------------|--------------------------- ---|----------------|
| lokal | lokal | run() perilaku baik-baik saja (tetapi akan melanggar niat penulis jika dijalankan dari jarak jauh) |
| lokal | dari jarak jauh | Seharusnya gagal (atau minta string host seperti yang dilakukan kain lama) |
| secara lokal | lokal atau jarak jauh | run() perilaku baik-baik saja |
| dari jarak jauh | lokal | Itu harus selalu berjalan secara lokal, tetapi Context tidak memiliki metode local() untuk memastikannya |
| dari jarak jauh | dari jarak jauh | run() perilaku baik-baik saja (tetapi masalah diharapkan selama pemanggilan lokal) |
| dari jarak jauh | lokal atau jarak jauh | run() perilaku baik-baik saja |

@max-Arnold itu persis #98! yang sebenarnya belum sepenuhnya saya pecahkan. Menempatkan beberapa pemikiran modern di sana sebagai komentar ... sunting: yang ini

Saya telah memperhatikan apa yang tampaknya tidak konsisten dengan Sudo.

Di mana connection adalah server jarak jauh, diautentikasi sebagai root.

Mencoba memperluas tilde sebagai pengguna lain selain root:

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

Ini berhasil, tetapi alih-alih menulis /home/builder/foo, malah menulis /root/foo.

Di sisi lain, jika saya hanya mencoba ls:

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

Saya mendapatkan Permission denied .

Ada yang terasa tidak enak.

Dugaan saya ketika Dustin melaporkan out-of-band di atas, adalah bahwa ini adalah kerutan khusus sudo (perintah, bukan metode), karena terakhir saya melihat kami menggunakan -H dan ternyata itu tidak berperilaku 100% seperti yang kita harapkan.

Hai Jeff,
karena saya sudah bekerja di python 3, sekarang saya menggunakan fabric3 (porting dari fabric 1.x).

Saya tergoda untuk mencoba migrasi ke fabric 2, tetapi saya langsung menemui hambatan. Saya menggunakan fungsi fabric.contrib secara ekstensif, tetapi dokumen migrasi mengatakan itu tidak ada lagi.

Yang pasti saya tidak ingin mengasapi kode yang kembali ke setara Shell mereka, dan karena, dilihat dari jumlah masalah pada contrib.* dari fabric 1.x, sepertinya banyak digunakan, saya pikir itu kekurangan bisa menjadi penghalang serius untuk bermigrasi bagi banyak orang lain.
Saya menemukan proyek tambal sulam yang tampaknya berisi setara dengan fabric.contrib , tetapi kodenya tidak diperbarui sejak bertahun-tahun.
Apakah Anda memiliki rencana untuk port fabric.contrib ke fabric 2?

Terima kasih,
Gabriele

@garu57 Ya, rencananya sekarang adalah menggunakan patchwork sebagai dasarnya "kontribusi 2.0". Saat ini berbasis Fabric 1 tapi itu akan berubah setelah Fabric 2.0.0 keluar. Saya berharap bit contrib yang paling umum digunakan untuk di-porting dengan cepat.

Halo semuanya,

Terkadang program saya menjalankan perintah jarak jauh misalnya

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'

Saya melihat bahwa skrip dieksekusi seperti itu:

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

dan saya juga harus melihat keluaran debug saya "?" sesuai dengan kode saya:

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)

Tapi tidak ada yang "?". Jadi saya sarankan ada yang tergantung di run().

Sebenarnya, program saya sangat besar dan ada pemrograman multi-proses. Untuk menangkap gantung, saya menjalankan perintah jarak jauh dengan kode berikut:

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)

Saat saya menggunakan fabric2, beberapa perintah yang diluncurkan dari proses anak tergantung dari waktu ke waktu.
diperbarui Sebenarnya, itu adalah kesalahan saya dalam kode. Jadi, fabric2 tidak mengandung gantung

Halo semua,
Saya melakukan beberapa eksperimen peluncuran dan dapat membagikan pengalaman saya.

Pertama, saya menjalankan perintah dari konsol saya

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'"

dan itu berakhir dengan sempurna dan cepat dengan exit=0:

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

Bagus.
Kemudian saya menjalankan perintah lain:

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'"

Itu selesai begitu cepat dengan exit=0 juga:

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

Tapi tidak ada "Koneksi ke 192.168.0.36 ditutup." Saya tidak tahu itu penting atau tidak.

Setelah itu saya membuat ulang VM dan meluncurkan perintah oleh fabric2 (dari 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>

Juga, saya menjalankan dengan pty=False:

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>

Tidak ada "Koneksi keditutup." pada kedua tes. Sekali lagi saya tidak tahu itu penting atau tidak.

Kedua, saya memutuskan bahwa itu bukan lingkungan yang baik untuk stand saya, karena saya membutuhkan proses peluncuran dari anak. Jadi, saya membuat ulang VM dan menjalankan skrip dengan kode berikutnya:

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

Pada output running ini ada "Connection to 192.168.0.34 closed."

Di samping itu

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

Keduanya belum digantung.

Malam ini saya akan meluncurkan skrip saya dengan fabric2 pada proses yang bercabang dan saya akan menulis.
diperbarui Sebenarnya, itu adalah kesalahan saya dalam kode. Jadi, fabric2 tidak mengandung gantung.

Akan lebih baik untuk mendapatkan dukungan use_sudo untuk Transfer.put .

Saya kira solusi paling sederhana untuk saat ini adalah hanya melakukan put di suatu tempat saya memiliki izin kemudian sudo mv ?

@ned2 itu saja yang use_sudo benar-benar dapat dilakukan di get / put , misalnya begitulah cara v1 melakukannya. Sebenarnya tidak mungkin mengunggah file "dengan Sudo" sejauh yang saya ketahui! (Bukan tanpa menghubungkan sebagai root, yang merupakan ide buruk dan idealnya bahkan tidak diperbolehkan.)

Mengingat upaya untuk memiliki API yang agak lebih bersih di v2, saya hampir cenderung mengimplementasikan pembungkus daripada menggabungkan perilaku itu di dalam get / put sendiri. Mungkin hanya sesuatu seperti Transfer.sudo_put (yang akan disebut self.put ). Dengan cara itu put "murni" tetap minimal.

@bitprophet Saya ingin memulai dengan mengucapkan terima kasih atas beberapa perangkat lunak yang cukup stabil dan berguna dengan Fabric1 dan pendekatan Anda untuk merilis Fabric2.

Saya sudah mulai bermain-main dengan v2 tetapi saya mengalami masalah dengan Koneksi. Saya menggunakan konfigurasi SSH saya dari Fabric 1, Fabric 1 akan meminta saya untuk memasukkan kata sandi ketika mencoba untuk terhubung. Fabric 2 tidak melakukan ini dan gagal menyatakan bahwa Otentikasi telah gagal. Saya tidak dapat melihat di mana pun di dokumen v2 yang menyebutkan mekanisme otentikasi untuk Koneksi. Ada yang menyebutkan kata sandi dengan sudo tetapi dari apa yang saya kumpulkan ini adalah setelah koneksi berhasil..

Pertanyaan saya adalah apakah saya melewatkan sesuatu di dokumen atau apakah ini fitur yang hilang atau masalah.

Kode:

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

        cxn.run('ls -l')

kesalahan:

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

Konfigurasi SSH saya (Nilai yang diganti untuk diposting di sini):

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

Saya menggunakan versi v2 terbaru: https://github.com/fabric/fabric/commit/fec3a22ee89900500ae731913fd33f9b56e89f46

Semoga pemecahan ini akan membantu orang lain dengan masalah yang sama.

Terima kasih atas waktu Anda.

@ Aiky30 Mungkin bukan Anda, hal-hal auth masih perlu dikerjakan (sebagian besar karena membutuhkan beberapa pekerjaan Paramiko yang sedang berlangsung sehingga pengecualian auth tidak terlalu sulit untuk ditafsirkan dengan benar.) Saya pikir dalam kasus ini mungkin saja Fab 2 tidak menafsirkan IdentityFile - kami mengambil Host, pengguna, port, dan banyak pengaturan lainnya tetapi IdentityFile masih merupakan TODO.

Itu sebagian karena kita juga tidak berurusan dengan frasa sandi sekarang (lihat di atas - ingin menghindari kludge Fabric 1 yang besar di mana kita harus membuat tebakan liar jika autentikasi yang diberikan gagal berarti kata sandi atau frasa sandi diperlukan). Jadi, Anda mungkin akan beralih ke kesalahan "Saya tidak dapat membuka kunci file ini" setelah itu. Dan keduanya karena saya sering menggunakan ssh-agent - yang akan menjadi saran pertama saya untuk solusi segera.

Yang mengatakan, saya pikir itu mungkin layak untuk saya hack di kedua IdentityFile dan dukungan konfigurasi frasa sandi eksplisit, karena kunci non-agen kemungkinan adalah pengaturan auth paling umum nomor 1 di luar sana sehingga kurang itu mungkin berarti sebagian besar pengguna alfa/beta tertinggal dalam kesulitan . Akan melihat apakah saya bisa menggedor itu hari ini.

Mengambil 2.0a untuk berputar.

1) Saya juga agak bingung bagaimana sebenarnya mendefinisikan dan menggunakan host. Saya bisa berlari:

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

Tetapi jika saya tidak ingin menyampaikan detail Host (pengguna, Host, port) setiap saat, saya tidak yakin bagaimana mengonfigurasi host di fabfile.py ( Connection s atau Group ) dan kemudian rujuk saja. Jika saya memahami https://github.com/fabric/fabric/issues/1591#issuecomment -296343613 dengan benar, itu tidak didukung saat ini (dan dilacak di https://github.com/fabric/fabric/issues/1594 )?

2) Juga, saya mengalami masalah di mana saya telah mengenkripsi kunci SSH (pada ~/.ssh/id_rsa ) dan saya memiliki ssh-add 'd itu ke ssh-agent . Itu muncul jika saya mencantumkan kunci melalui ssh-add -l . Ketika saya menjalankan beberapa tugas, memberikan nama pengguna yang tepat:

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

Hal-hal bekerja dengan baik. Tetapi jika saya menggunakan pengguna yang salah, misalnya fab -H bad_user<strong i="23">@host</strong> sometask , maka saya mendapatkan:

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

Tapi saya berasumsi itu termasuk dalam https://github.com/paramiko/paramiko/issues/387 dan tidak terlalu spesifik untuk fabric 2.0. Tapi ya, rasanya aneh untuk mendapatkan kesalahan PasswordRequiredException: Private key file is encrypted , ketika ssh-agent sudah memiliki kunci yang didekripsi. Jika saya mengerti dengan benar, setelah login yang tidak valid, paramiko akan kembali menggunakan kunci secara langsung, dan tanpa frasa sandi yang disediakan akan menimbulkan kesalahan ini.

3) Akan lebih baik untuk mengizinkan jenis fungsi tugas anotasi (untuk penyelesaian otomatis yang lebih baik di IDE). Apakah Anda punya waktu untuk mempertimbangkan https://github.com/pyinvoke/invoke/pull/458 ?

4) Saya suka ide perpustakaan tambal sulam. Untuk kain 1.x, ada https://github.com/sebastien/cuisine (yang tampaknya cukup mati) yang berisi banyak fungsi tambahan (belum menggunakannya sendiri). Apakah ide dengan tambal sulam untuk membangun sesuatu yang serupa (jadi fungsi deklaratif gaya Chef/Ansible/SaltStack, meskipun dengan cakupan yang dikurangi)? Saya selalu membenci pendekatan YAML/DSL multi-dir/multi-file yang diikuti oleh alat lain, dan hanya ingin tetap menggunakan python, untuk mendapatkan lebih banyak fleksibilitas, sintaks verbose yang lebih sedikit, penyelesaian otomatis IDE, debugging mudah, dll.

5) Cukup jatuhkan dukungan py 2.6 dan 3.2-3.3 untuk fabric 2.0. Bukankah orang-orang harus terus maju?

@tuukkamustonen - terima kasih atas umpan baliknya! Tanggapan:

  1. Peran memang tercakup dalam #1594 - dan saya pikir ada tiket lain di luar sana untuk masalah terkait hanya memiliki data konfigurasi per-host, selain dari bagaimana dukungan ssh_config melakukannya pada levelnya sendiri.

    Memutuskan bagaimana tepatnya untuk merekonsiliasi konfigurasi tingkat-fabrikasi dengan ssh_config dan kemudian juga dengan apa pun dari Grup atau data runtime...tidak sepele. Meskipun itu pasti perlu segera terjadi; Saya hanya ingin memiliki solusi setengah matang alih-alih draf pertama.

  2. Sekali lagi, ya, ini adalah tiket Paramiko yang Anda sebutkan, dan tebakan Anda akurat, situasi nama pengguna yang buruk pada akhirnya akan selalu gagal, dan karena Paramiko hanya melacak kesalahan terakhir yang ditemuinya, kebetulan hal terakhir yang dicoba adalah salinan kunci yang dienkripsi di dalam disk. (Jika Anda memindahkan kunci itu ke tempat lain, misalnya, kesalahan terakhir akan menjadi sesuatu yang lain.)

  3. Saya baru saja mengomentari tiket itu, mungkin (atau mungkin tidak) menduplikasi tiket yang ada untuk fitur keseluruhan yang sama. Saya telah mengomentari yang lebih tua dan IIRC itu adalah "ya saya pikir itu akan bagus selama itu tidak merusak Python 2." Namun itu bukan prioritas tinggi karena sebagian besar fitur yang hilang lebih besar sehingga termasuk dalam ember "perlu, semua kotak dicentang PR yang bisa saya gabungkan" :)

  4. Ya, lihat #461 yang sudah sangat tua tapi masih ada di pikiran saya. Hari-hari ini pertanyaan besarnya adalah bagaimana lib seperti itu akan ditulis untuk menjangkau kedua Invoke dan Fabric; dalam banyak/kebanyakan kasus, seseorang dapat dengan mudah menulis tugas Invoke generik yang tidak "tahu tentang" konteks lokal/jauh yang terpisah, yang dapat diberikan konteks koneksi Fabric ketika seseorang ingin menjalankannya pada sistem jarak jauh.

    Tugas "konteks agnostik" seperti itu ingin tinggal di perpustakaan 'doa' (atau lib khusus-Invoke lainnya); tetapi beberapa (misalnya apa pun yang melibatkan transfer file dan bukan hanya perintah shell) harus "sadar-kain". Mencari tahu bagaimana menjembatani kesenjangan itu adalah masalahnya.

    Bisa pergi ke rute "lib itu hanya membutuhkan panggilan, tidak memerlukan fabric, _but_ subset tugas akan mengeluh jika Anda tidak menginstal fabric & memberikan konteks Koneksi kepada mereka." Dapat dipecah menjadi dua lib (dengan yang berorientasi Fabric membutuhkan yang lebih umum Invoke.) Dll.

  5. Sampai baru-baru ini, ini pasti ada di kartu, lihat paramiko/paramiko#1070 dan/atau pyinvoke/invoke#364. Invoke 1.0, Fabric 2.0 dan Paramiko 3.0 (atau, _maybe_, 2.4/2.5/whatever) semuanya akan menjadi Python 2.7 / 3.4 dan lebih tinggi.

Tentang (1):

Saya yakin Anda sudah mengetahuinya, tetapi Anda mungkin ingin mengambil beberapa ide dari inventaris Ansible . Atau mungkin tidak :).

Tentang (4):

Saya pikir https://github.com/pyinvoke/invocations adalah cara untuk berpendapat untuk ini. Doa menyediakan _conventions_ dan dapat dibangun di atas paket gaya tambal sulam/masakan, tetapi saya tidak akan mencampur konvensi (cara merilis atau doctest) dengan utilitas (cara menyalin file atau mengubah izin).

Saya tidak melihat masalah dalam menempatkan utils untuk operasi lokal saja, hanya jarak jauh dan lokal+jarak jauh ke dalam perpustakaan yang sama (tambal sulam). Operasi apa yang mendukung mode mana yang dapat ditangani sebagai dokumentasi (seperti docstring, dibuat otomatis dari anotasi, dll.).

Ini terasa lebih baik daripada membagi logika menjadi 2+ paket. Karena bagaimana jika Anda pertama kali menambahkan operasi ke paket "khusus-panggilan" Anda (dan bahkan mungkin ada operasi "khusus jarak jauh"), dan kemudian menambahkan dukungan agar itu berfungsi juga di server jarak jauh? Apakah Anda akan memindahkan, menyalin, atau memperpanjang kode? Dalam kedua kasus, ini lebih berfungsi, dan pengguna membutuhkan impor yang berbeda, dll. Jadi kedengarannya agak rumit.

Apa yang bisa saya lakukan agar ini cukup dipoles untuk digunakan di PyPi?

@haydenflinner Ini terjadi selama satu atau dua minggu ke depan!! (Tujuannya adalah untuk melepaskan sebelum saya naik pesawat ke PyCon, yaitu 10 Mei.)

Misalnya, silakan lihat dokumen pemutakhiran yang baru saja diperbarui yang baru saja saya kerjakan minggu ini: http://docs.fabfile.org/en/v2/upgrading.html

Sebenarnya, saya mungkin juga menutup tiket ini sekarang, karena saya akan segera menerima tiket asli untuk 2.0.0 ke atas 👍

Perhatikan, Anda masih bisa berkomentar di sini jika Anda mau. Perhatikan bahwa saya berharap untuk menyelesaikan setidaknya beberapa bagian dari pekerjaan fitur sebelum rilis, di samping semua persiapan manajemen proyek.

Saya melihat fabric v2 hari ini dan saya minta maaf, saya tidak bisa memaksa diri untuk menggunakannya.

  1. Kemana perginya para roledef? Mengapa saya tidak bisa lagi memberikan nama peran di baris perintah? Apakah saya harus menerapkan ini sendiri?
  2. Mengapa saya tidak bisa meneruskan argumen ke tugas di baris perintah lagi? Apakah saya harus menerapkan ini sendiri juga?
  3. Mengapa parameter -H harus didahulukan sebelum parameter tugas? Seharusnya sebaliknya. Ini sangat mengerikan.

Tugas memang membutuhkan argumen, tetapi sintaksnya berubah. Lihat http://docs.pyinvoke.org/en/1.1/concepts/invoking-tasks.html#task -command-line-arguments

@dgarstang Anda mungkin ingin mempertimbangkan untuk mengambil nada yang lebih netral atau empatik dengan orang-orang yang memberi Anda tenaga kerja gratis mereka! Katakan saja

  1. Lihat #1594, IIRC mana yang ditautkan dalam dokumen pemutakhiran
  2. @ploxiln mendukung Anda di sini
  3. (Sebagian) lihat # 1772 yang digabungkan menjadi master dan akan segera keluar; itu menambah kemampuan untuk menggunakan @task(hosts=xxx) .

(re: 3: Dalam hal memberikan --hosts dan teman-teman seolah-olah mereka argumen per-tugas, itu sesuatu yang mungkin saya tambahkan kapan-kapan, telah terpecah pada apakah itu sepadan. Mirip dengan per-tugas --help , semakin banyak pengecualian "ajaib" yang kami tambahkan, semakin tinggi kemungkinan pengguna akan mencoba menggunakan nama yang sama untuk argumen tugas mereka sendiri dan menjadi bingung ketika itu rusak.)

Apakah halaman ini membantu?
0 / 5 - 0 peringkat