Saya ingin menggunakan Fabric untuk menerapkan kode aplikasi web saya ke server pengembangan, pementasan, dan produksi. Fabfile saya:
def deploy_2_dev():
deploy('dev')
def deploy_2_staging():
deploy('staging')
def deploy_2_prod():
deploy('prod')
def deploy(server):
print 'env.hosts:', env.hosts
env.hosts = [server]
print 'env.hosts:', env.hosts
Output sampel:
host:folder user$ fab deploy_2_dev
env.hosts: []
env.hosts: ['dev']
No hosts found. Please specify (single) host string for connection:
Saat saya membuat set_hosts()
tugas seperti yang ditunjukkan di dokumen Fabric , env.hosts disetel dengan benar. Namun, ini bukan pilihan yang tepat, begitu pula dekorator. Meneruskan host pada baris perintah pada akhirnya akan menghasilkan semacam skrip shell yang memanggil fabfile, saya lebih suka memiliki satu alat yang melakukan pekerjaan dengan benar.
Dikatakan dalam dokumen Fabric bahwa 'env.hosts hanyalah objek daftar Python'. Dari pengamatan saya, ini tidak benar.
Adakah yang bisa menjelaskan apa yang terjadi di sini? Bagaimana cara mengatur host untuk menerapkan?
Jawaban:
Saya melakukan ini dengan mendeklarasikan fungsi aktual untuk setiap lingkungan. Sebagai contoh:
Menggunakan fungsi di atas, saya akan mengetik yang berikut ini untuk diterapkan ke lingkungan pengujian saya:
... dan berikut ini untuk diterapkan ke produksi:
Hal yang menyenangkan tentang melakukannya dengan cara ini adalah bahwa fungsi
test
danprod
dapat digunakan sebelum fungsi hebat apa pun , tidak hanya menerapkan. Ini sangat berguna.sumber
code.fabfile.org
domain memiliki tanggapan seperti itu.fab A B C
gaya tanpa didefinisikan sebagai tugas.Gunakan roledefs
Pilih peran dengan -R:
sumber
roledef
? Entri kamus lebih lanjut'password': 'some_password'
tampaknya diabaikan dan mengarah ke prompt pada waktu proses.Berikut adalah versi sederhana dari jawaban serverhorror :
sumber
env
variabel, bukan untuk mengaturnya pada awalnya. Saya pikir menggunakan roledefs , seperti yang disarankan thomie, lebih tepat untuk mendefinisikan host seperti stage, dev dan test.Terjebak pada ini sendiri, tetapi akhirnya menemukan jawabannya. Anda tidak dapat mengatur konfigurasi env.hosts dari dalam tugas. Setiap tugas dijalankan N kali, satu kali untuk setiap Host yang ditentukan, sehingga pengaturan pada dasarnya berada di luar cakupan tugas.
Melihat kode Anda di atas, Anda cukup melakukan ini:
Yang sepertinya akan melakukan apa yang Anda inginkan.
Atau Anda dapat menulis beberapa kode kustom dalam cakupan global yang mengurai argumen secara manual, dan menyetel env.hosts sebelum fungsi tugas Anda ditentukan. Untuk beberapa alasan, itulah cara saya mengatur milik saya.
sumber
from fabric.api import env
:;env.host_string = "dev"
Sejak fab 1.5 ini adalah cara terdokumentasi untuk mengatur host secara dinamis.
http://docs.fabfile.org/en/1.7/usage/execution.html#dynamic-hosts
Kutipan dari dokumen di bawah ini.
sumber
Bertentangan dengan beberapa jawaban lain, adalah mungkin untuk mengubah
env
variabel lingkungan dalam tugas. Namun, inienv
hanya akan digunakan untuk tugas berikutnya yang dijalankan dengan menggunakanfabric.tasks.execute
fungsi tersebut.Tanpa membungkus sub-tugas
execute(...)
,env
pengaturan tingkat modul Anda atau apa pun yang diteruskan darifab
CLI akan digunakan.sumber
Anda perlu
host_string
memberi contoh seperti ini:sumber
Untuk menjelaskan mengapa itu menjadi masalah. Hebat perintah memanfaatkan fabric library untuk menjalankan tugas pada daftar host. Jika Anda mencoba dan mengubah daftar host di dalam tugas, pada dasarnya Anda mencoba mengubah daftar sambil mengulanginya. Atau dalam kasus di mana Anda tidak memiliki host yang ditentukan, ulangi daftar kosong di mana kode tempat Anda mengatur daftar untuk mengulang tidak pernah dijalankan.
Penggunaan env.host_string adalah solusi untuk perilaku ini hanya karena ia menentukan secara langsung fungsi yang akan dihubungkan dengan host. Ini menyebabkan beberapa masalah di mana Anda akan membuat ulang loop eksekusi jika Anda ingin memiliki sejumlah host untuk dieksekusi.
Cara paling sederhana orang membuat kemampuan untuk mengatur host pada waktu proses, adalah dengan menjaga env populatiing sebagai tugas yang berbeda, yang mengatur semua string host, pengguna, dll. Kemudian mereka menjalankan tugas penerapan. Ini terlihat seperti ini:
atau
Dimana pementasan dan produksi seperti tugas yang telah Anda berikan, tetapi mereka tidak memanggil sendiri tugas berikutnya. Alasan itu harus bekerja seperti ini, adalah bahwa tugas harus selesai, dan keluar dari loop (dari host, dalam kasus env Tidak ada, tetapi ini adalah loop dari satu pada saat itu), dan kemudian loop berakhir host (sekarang ditentukan oleh tugas sebelumnya) lagi.
sumber
Anda perlu memodifikasi env.hosts di tingkat modul, bukan dalam fungsi tugas. Saya melakukan kesalahan yang sama.
sumber
Sangat sederhana. Cukup inisialisasi variabel env.host_string dan semua perintah berikut akan dijalankan di host ini.
sumber
Saya benar-benar baru mengenal fabric, tetapi agar fabric menjalankan perintah yang sama pada banyak host (misalnya untuk menerapkan ke banyak server, dalam satu perintah) Anda dapat menjalankan:
di mana staging-server dan production-server adalah 2 server yang Anda inginkan untuk menjalankan tindakan penerapan. Berikut ini fabfile.py sederhana yang akan menampilkan nama OS. Perhatikan bahwa fabfile.py harus berada di direktori yang sama dengan tempat Anda menjalankan perintah fab.
Ini bekerja setidaknya dengan kain 1.8.1.
sumber
Jadi, untuk mengatur host, dan menjalankan perintah di semua host, Anda harus mulai dengan:
Setelah itu ditentukan, lalu jalankan perintah pada baris perintah:
Apa yang akan menjalankan tugas penerapan di semua server yang terdaftar di fungsi PROD, karena menetapkan env.hosts sebelum menjalankan tugas.
sumber
Anda dapat menetapkan ke
env.hoststring
sebelum menjalankan subtugas. Tetapkan ke variabel global ini dalam satu lingkaran jika Anda ingin melakukan iterasi ke beberapa host.Sayangnya untuk Anda dan saya, kain tidak dirancang untuk kasus penggunaan ini. Lihat
main
fungsinya di http://github.com/bitprophet/fabric/blob/master/fabric/main.py untuk melihat cara kerjanya.sumber
Berikut pola "summersault" lain yang memungkinkan
fab my_env_1 my_command
penggunaan:Dengan pola ini, kita hanya perlu mendefinisikan lingkungan satu kali menggunakan kamus.
env_factory
membuat fungsi berdasarkan nama kunci dariENVS
. Saya memasukkanENVS
direktori dan file sendirisecrets.config.py
untuk memisahkan konfigurasi dari kode fabric.Kekurangannya adalah, seperti yang tertulis, menambahkan
@task
dekorator akan merusaknya .Catatan: Kami menggunakan
def func(k=k):
bukandef func():
di pabrik karena penjilidan terlambat . Kami mendapatkan modul yang sedang berjalan dengan solusi ini dan menambalnya untuk menentukan fungsi.secret.config.py
fabfile.py
sumber
Menggunakan peran saat ini dianggap sebagai cara yang "tepat" dan "benar" untuk melakukan ini dan itulah yang "harus" Anda lakukan.
Yang mengatakan, jika Anda seperti kebanyakan dari apa yang Anda "inginkan" atau "inginkan" adalah kemampuan untuk melakukan "syster bengkok" atau mengganti sistem target dengan cepat.
Jadi untuk tujuan hiburan saja (!) Contoh berikut mengilustrasikan apa yang mungkin dianggap banyak orang sebagai manuver berisiko, namun entah bagaimana benar-benar memuaskan, yang berlangsung seperti ini:
Lalu lari:
sumber