Cuplikan dari dokumen ini tidak membuat kunci contoh 'foo' tersedia bagi pengguna melalui env, hanya kunci 'host' yang selanjutnya dimuat oleh Fabric (ke env.hosts)
from fabric.api import env
env.roledefs = {
'web': {
'hosts': ['www1', 'www2', 'www3'],
'foo': 'bar'
},
'dns': {
'hosts': ['ns1', 'ns2'],
'foo': 'baz'
}
}
Didokumentasikan lebih lanjut tentang pertanyaan stackoverlow ini
anda dapat menggunakan contoh di bawah ini sebagai file konfigurasi, lalu tambahkan beberapa fungsi internal untuk menangani fabfiles.py
seperti: list.db
antarmuka|ip|sandi|peran....
berharap itu akan bekerja untuk Anda.
Ada beberapa kunci env yang digunakan oleh fabric untuk menentukan host mana yang akan dihubungkan untuk setiap sesi, yaitu role, effective_roles, hosts, host_string. Dan tentu saja dekorator juga.
Yang mengatakan, roledefs hanya pemetaan nama untuk mengelompokkan host, tidak perlu digabung menjadi env.hosts.
Mendefinisikan roledefs sebagai dict membantu Anda mengatur pengaturan khusus lainnya, di samping host, yang spesifik peran. Anda dapat mengaksesnya melalui jalur env lengkap, yaitu env.roledefs.web.foo
Tetapi, seperti yang Anda keluarkan, dan mungkin diharapkan, adalah bahwa peran yang didefinisikan sebagai dict harus digabungkan ke root env.
Ini adalah apa yang saya pribadi juga menggunakannya untuk. Saya hanya belum menemukan cara yang bagus untuk mengimplementasikannya dan menarik permintaan, karena semua cara yang mungkin untuk benar-benar mengatur/mendapatkan peran "saat ini" ketika menjalankan tugas tertentu, dan kompleksitas saat memanggil subtugas dalam tugas . Sederhananya, saya melakukan ini dengan berlangganan perubahan pada env dan menggabungkan peran ketika kunci roles
disetel di env. Tetapi bagian yang "sulit" adalah mempertahankan status dan membersihkan penggabungan peran apa pun saat peran baru digunakan dalam sesi.
env.roledefs.web.foo menghasilkan kesalahan: AttributeError: 'dict' object has no attribute 'web'
Maksud saya, Anda dapat mengaksesnya seperti dict biasa, env.roledefs['web']['foo'] tetapi kemudian saya tidak melihat mengapa fungsi ini ada sama sekali di Fabric, itu hanya dict biasa. Sepertinya fitur ini diimplementasikan untuk alasan yang lebih berguna?
Maaf, Anda benar, Anda harus mengaksesnya seperti yang Anda katakan.
Saat ini tidak ada alasan lain selain mengizinkan Anda untuk mengelompokkan lebih banyak pengaturan peran di sebelah host.
Tapi, ketika tonggak 1.11 dirilis dan #1092 ada, maka itu lebih masuk akal.
Juga #1088 adalah bagian dari 1.11 yang mirip dengan apa yang Anda gambarkan/harapkan. Tetapi saya belum menemukan cara yang bagus, seperti yang saya katakan, untuk mengimplementasikan penggabungan roledefs. Hanya proof-of-cocept di fork yang menggunakan patch monyet dalam yang "jelek".
Ah baiklah, aku membenturkan kepalaku ke dinding berpikir aku kehilangan sesuatu :) Nomor-nomor masalah yang direferensikan itu sepertinya akan sedikit membantu setiap kali mereka berguling. Terima kasih Jonas!
Ini membingungkan dan saya pikir perlu dicatat dalam dokumentasi bahwa variabel tambahan ini tidak dapat diakses di luar roledef.
@bitprophet Mengapa ini ditutup? Perilaku kunci roledef tambahan tidak berubah, jadi apakah ini "tidak akan diperbaiki"?
Komentar yang paling membantu
@bitprophet Mengapa ini ditutup? Perilaku kunci roledef tambahan tidak berubah, jadi apakah ini "tidak akan diperbaiki"?