Pada saat penulisan, cabang v2 memiliki kelas Group
yang seharusnya dapat berfungsi sebagai unit yang sebelumnya dikenal sebagai 'peran', alias "sekelompok host untuk melakukan hal-hal dengan/di".
Namun, belum ada cara khusus untuk mengatur atau melabeli objek Group
; itu "selesai" cukup untuk kasus penggunaan API murni dari pengguna tingkat lanjut yang ingin menggulirkan cara spesifik mereka sendiri untuk membuatnya, tetapi tidak memiliki apa pun untuk pengguna yang berorientasi CLI atau orang perantara yang menginginkan sesuatu yang kerangka kerja untuk dibangun.
Dengan kata lain, kecuali Anda menggulirkan murni dengan API, memiliki objek Grup yang tergeletak di suatu tempat tidak berguna jika bit CLI atau pemanggilan tugas tidak memiliki cara untuk menemukannya!
Di v1, peran secara efektif adalah satu namespace datar yang memetakan label string sederhana ke apa yang akan menjadi Grup di v2, dan mereka dapat dipilih pada CLI saat runtime ( fab --roles=web,db
) dan/atau terdaftar sebagai target default untuk tugas ( @task('db') \n def migrate():
), seperti host.
Pengguna mendefinisikannya dalam env.roledefs
, sebuah dict sederhana; fungsionalitas menengah hingga lanjutan apa pun berkisar pada memodifikasinya, biasanya saat runtime (melalui pra-tugas atau subrutin), terkadang pada waktu muat modul.
Group
s dan/atau Connection
s.Lexicon
bukannya dict
.db
, web
, lb
, tetapi kemudian nama tingkat ke-2 disebut prod
yang selalu merupakan gabungan dari tiga lainnya. Saya lupa apakah saya sudah menambahkannya ke Lexicon
. Mungkin ada subkelas peta lain di luar sana yang sudah melakukannya juga.if cxn in group
akan berfungsi bahkan jika cxn
adalah objek yang berbeda dari anggota yang sama di dalam group
.db
"@group
seperti @task
, dan fungsinya bukan unit kerja yang dapat dieksekusi, tetapi menghasilkan objek Grup.Dari milis:
Kami menerapkan API REST internal kami sendiri yang mengisi env.roledefs secara dinamis tergantung pada proyek yang diterapkan dan sangat bergantung pada tidak menyematkan string host ke fabfile proyek atau menetapkannya di CLI.
Kasus penggunaan kami adalah:
EnvironmentDatabaseAPIClient(
'https://rest.api.url/schema/',
env.service_name,
).apply_env()
Jumlah lingkungan server - beberapa lingkungan pengujian (beberapa di antaranya bersifat pribadi, beberapa publik) dan beberapa lingkungan produksi (untuk klien yang berbeda). Setiap lingkungan terdiri dari satu atau lebih host dan dipetakan ke peran fabric.
Setiap layanan ( env.service_name
dalam contoh di atas) memiliki set lingkungan yang berbeda.
Kami juga memiliki meta-roles (kelompok peran). Mereka diawali dengan group-
: group-production
, group-test
, group-external
, group-internal
, group-all
. Ini memungkinkan kita untuk menerapkan ke beberapa peran server tanpa menentukannya satu per satu, misalnya group-all
menyebarkan ke semua peran, baik produksi maupun pengujian.
Kami memiliki tugas fabric khusus untuk mencetak informasi tentang grup peran, peran, dan pembawa acara.
Kami juga sangat bergantung pada string host pemetaan terbalik kembali ke nama peran (string host unik per service_name). Ini digunakan untuk pencatatan dan pemberitahuan penerapan. Pada dasarnya, kami mencatat penerapan layanan ke setiap host dan mengirim pemberitahuan Slack saat layanan telah diterapkan ke semua host dalam suatu peran. Server EnvironmentDatabaseAPI bertanggung jawab untuk ini (ia menyimpan log dan status penerapan). Ini dilakukan dengan mendekorasi tugas fabric dengan dekorator yang mengirimkan env.host
, env.port
dan env.service_name
(ditambah info komit) kembali ke server API.
Kami berencana untuk menambahkan otentikasi penerapan di masa mendatang, juga sangat mungkin untuk menarik lebih banyak variabel env
dari server untuk membuatnya tersedia dalam konteks tugas.
Terima kasih @max-Arnold! Saya mengenali banyak dari mereka dari kasus penggunaan saya sendiri di masa lalu juga. Bit pemetaan terbalik khususnya saya ingat muncul di v1 beberapa kali, jadi saya menambahkannya ke daftar.
Agar Fabric v2 berguna bagi saya, saya memerlukan cara untuk memberi tahu fab
kumpulan host mana yang akan menjalankan tugas.
Sebelumnya saya mendefinisikan peran dan kemudian menjalankan fab -R ...
. (Sebenarnya peran didefinisikan secara terprogram menggunakan rentang alamat IP, tetapi itu bukan persyaratan dan daftar statis di dalam file YAML akan baik-baik saja.)
Saya gagal menemukan yang setara di Fabric v2, dan saya juga gagal meniru fitur ini menggunakan:
fabric.yaml
berisiactive_hostset: null
hostsets:
myhostset:
- ...
active_hostset = config["hostsets"][config["active_hostset"]]
dalam fabfile.py
env INVOKE_ACTIVE_HOSTSET=myhostset fab ...
Alih-alih daftar host yang diharapkan, saya mendapatkan KeyError: 'active_hostset'
.
Kami memetakan kumpulan host yang berbeda ke setiap peran untuk setiap lingkungan kami di fabric v1, dan lingkungan diatur dengan menjalankan tugas role.environment:staging
untuk menentukannya. Jadi tugas ini memengaruhi host yang digunakan oleh tugas-tugas berikut.
Di v2 kami mencoba menggunakan Tugas khusus, tetapi masalahnya adalah Executor.expand_calls
berjalan sebelum tugas role.environment
berjalan sehingga tidak ada tugas berikut yang mengetahui lingkungan untuk membangun daftar host mereka secara dinamis.
Menjadikan Executor.expand_calls
sebagai generator memungkinkan eksekusi tugas memengaruhi eksekusi tugas selanjutnya. Jadi contoh saya di atas berfungsi, di mana kami memiliki Task
yang perlu mengetahui lingkungannya untuk memperluas peran dengan benar ke host. misalnya fab role.environment dev deploy.app
- tugas role.environment
sekarang dijalankan sebelum deploy.app
diperluas, sehingga deploy.app
mengetahui lingkungan dan dapat mengonfigurasi host-nya dan kemudian diperluas ke kumpulan tugas yang benar.
Saya membuat prototipe ini di garpu saya:
https://github.com/pyinvoke/invoke/compare/master...rectalogic :expand-generator
https://github.com/fabric/fabric/compare/master...rectalogic :expand-generator
Hai, saya tidak tahu apa yang terjadi pada perangkat lunak ini setelah bertahun-tahun, tetapi saya sangat merindukan konsep "peran" di [email protected] , terutama saat menjalankan $ fab -R dev
Kami juga menggunakan peran untuk mewakili rangkaian operasi yang sama di lingkungan yang berbeda. Mungkin memisahkan konsep peran bernama dan lingkungan bernama akan berguna? Seperti, peran web di lingkungan dev.
Komentar yang paling membantu
Hai, saya tidak tahu apa yang terjadi pada perangkat lunak ini setelah bertahun-tahun, tetapi saya sangat merindukan konsep "peran" di [email protected] , terutama saat menjalankan
$ fab -R dev