Menggunakan Chef-solo untuk Mengkonfigurasi Aplikasi Django di Ubuntu

Ada banyak cara untuk mengotomatiskan proses pengaturan dan konfigurasi kotak. Untuk alasan apa pun, jika seluruh sistem kami pada saat ini terdiri dari hanya satu kotak, pengaturan infrastruktur SCM (Software Configuration Management) penuh adalah berlebihan. Skrip Shell adalah salah satu opsi, tetapi kita juga bisa menggunakan versi SCM yang tersedia dalam beberapa alat di luar sana. Chef adalah salah satu opsi yang populer dan "chef-solo" adalah mode konfigurasi mandiri Chef di mana kami tidak memerlukan simpul tambahan untuk bertindak sebagai "chef-server". Yang dibutuhkan hanyalah URL atau jalur ke paket tarball yang berisi buku masak koki. Dibandingkan dengan skrip shell, tipe pendekatan ini lebih deklaratif dan efisien, dan juga merupakan pengantar yang baik untuk memulai proses SCM atau IaC (Infrastructure as Code).

Beberapa manfaat lain menggunakan chef-solo:

  • Kompabilitas: Gunakan buku masak komunitas dari supermarket chef atau tempat lain.
  • Sumber gratis dan terbuka; dilisensikan di bawah Lisensi Apache 2.0 yang permisif.
  • Akses ke seluruh ekosistem Chef (InSpec, ChefSpec, Cookstyle, Foodcritic, chef-shell dll)
  • Cookbook dan resep nantinya dapat diadaptasi ke mode klien / server.

Dan beberapa kerugian:

  • Beberapa buku masak komunitas di supermarket Chef sudah usang, rusak, dan tidak terawat.
  • chef-solo tidak dapat menyelesaikan dependensi sendiri.

'Resep' di dalam 'buku masak' koki memiliki DSL berbasis ruby ​​yang menggambarkan 'sumber daya' untuk berada dalam keadaan tertentu pada sebuah simpul. Mari kita lanjutkan dengan langkah-langkah untuk berkenalan dengan beberapa konsep Chef yang juga berlaku untuk chef-solo. Tujuan kami adalah mengatur simpul Ubuntu yang menjalankan aplikasi web Python / Django menggunakan Gunicorn dan NGINX.

Catatan: Kami tidak perlu memasang ChefDK di "workstation Chef" kami (mesin kami), meskipun dengan itu, kami dapat menggunakan perintah 'chef generate' untuk memulai dengan struktur direktori untuk membuat buku resep, resep, dan banyak lagi. Pada artikel ini, kami akan menganggap ChefDK diinstal di workstation kami. Perintah dijalankan menggunakan versi 4.7.26-1 dari ChefDK.


(Segala sesuatu dari titik ini dan seterusnya, kecuali ditentukan lain, akan dijalankan pada mesin kami, juga disebut sebagai 'Chef Workstation')

Membuat buku masak

Cookbook di chef adalah unit yang dapat digunakan kembali yang berisi semua yang diperlukan untuk mendukung skenario konfigurasi. Cookbook dapat berisi beberapa 'resep' dan 'resep' yang sebagian besar terdiri dari pola sumber daya. default.rbadalah resep default yang akan dijalankan ketika buku resep direferensikan dalam daftar-lari . Resep berbeda memungkinkan untuk memisahkan masalah. Namun untuk tutorial ini, kami akan menambahkan semua deklarasi sumber daya dalam satu file resep utama, yaitu default.rb.

Buat folder bernama "my-chef-project" dan buat folder di dalamnya yang disebut "buku masak". Dari ./my-chef-project/cookbooks/, jalankan:

$ chef generate cookbook my-cookbook

Struktur direktori kami sekarang akan terlihat seperti ini:

.
└── my-chef-project
└── cookbooks
└── my-cookbook
├── CHANGELOG.md
├── LICENSE
├── Policyfile.rb
├── README.md
├── chefignore
├── kitchen.yml
├── metadata.rb
├── recipes
│ └── default.rb
├── spec
│ ├── spec_helper.rb
│ └── unit
│ └── recipes
│ └── default_spec.rb
└── test
└── integration
└── default
└── default_test.rb

Menambahkan paket

Langkah pertama untuk menyiapkan simpul kami adalah mengidentifikasi paket apa yang diperlukan oleh aplikasi kami. Node kami dipilih sebagai Ubuntu, sehingga kami dapat mengandalkan manajer paket APT untuk mengumpulkan dependensi. Menginstal paket yang disediakan oleh distribusi OS kemudian sepotong kue:

apt_update
package 'python3'
package 'python3-pip'
package 'nginx'
package 'pkg-config'
package 'libcairo2-dev'
package 'libjpeg-dev'
package 'libgif-dev'
package 'libgirepository1.0-dev'

Ini cukup jelas. Baris pertama akan memperbarui repositori apt dan baris berikut akan menginstal paket-paket itu.

Catatan: Paket-paket berikut 'nginx' diperlukan untuk mengkompilasi beberapa dependensi python melalui pip. Ini mungkin berbeda berdasarkan pada dependensi proyek python / Django Anda yang ditentukan dalam requirements.txt. Anda dapat menggunakan metode coba-coba untuk menentukan paket-paket ini yang perlu Anda sertakan dalam buku masak Anda. Untuk melakukan itu, lakukan manual sudo pip install -r requirements.txt(Catatan: Ini menginstal sistem paket lebar!) Pada mesin ubuntu yang baru dibuat untuk melihat apakah itu berjalan dengan sukses. Jika tidak, stderr harus memberi Anda petunjuk tentang paket apa yang hilang.

Menciptakan pengguna linux

Setelah selesai menambahkan paket yang diperlukan, kita perlu membuat pengguna Linux yang tidak memiliki hak istimewa yang akan memiliki kode sumber aplikasi.

user 'bob' do
  uid 1212
  gid 'users'
  home '/home/bob'
  shell '/bin/bash'
  password '$1$alilbito$C83FsODuq0A1pUMeFPeR10'
end

Perhatikan bahwa kata sandi adalah format hash bayangan yang digunakan di Linux. Itu dapat diturunkan menggunakan OpenSSL:

$ openssl passwd -1 -salt alilbitof mypassword

Termasuk sumber aplikasi

Sekarang mari kita sertakan kode sumber aplikasi Django ke buku masak kami. Tempatkan kode sumber di dalam ./my-chef-project/cookbooks/my-cookbook/files/default/myapp/ Buat ./my-chef-project/cookbooks/my-cookbook/files/defaultdirektori jika tidak ada.

Instruksi untuk menyalin file-file ini ke lokasi yang jauh pada node kami dijelaskan menggunakan sumber daya remote_directory :

remote_directory '/home/bob/myapp' do
  source 'myapp' # This is the name of the folder containing our source code that we kept in ./my-cookbook/files/default/
  owner 'bob'
  group 'users'
  mode '0755'
  action :create
end

Menarik dependensi python

Untuk menginstal paket python requirements.txt, kita dapat menggunakan sumber daya eksekusi untuk menjalankan perintah arbitrer. Dalam hal ini, kita perlu menjalankan perintah pip install di atasnya:

execute 'install python dependencies' do
  command 'pip3 install -r requirements.txt'
  cwd '/home/bob/myapp'
end

Catatan: Ingatlah bahwa ini akan dijalankan sebagai pengguna root dan pustaka python akan diinstal di seluruh sistem. Jika simpul kami dirancang khusus untuk menjalankan aplikasi python tunggal ini, maka itu tidak terlalu menjadi masalah. Meskipun demikian, pilihan yang lebih baik untuk menjaga hal-hal bersih dan waras adalah menemukan dan menggunakan buku resep komunitas yang mengelola instalasi python atau 'virtualenvs'. (atau paling tidak, tulis serangkaian blok eksekusi untuk mereplikasi ini). Menggunakan virtualenvs di python memastikan bahwa alat sistem berbasis python atau proyek python lainnya tidak akan terpengaruh

Menyiapkan Gunicorn & NGINX

Sekarang saatnya mempersiapkan Server HTTP Gunicorn WSGI dengan NGINX sebagai proksi terbalik kami. Nginx juga digunakan untuk menangani semua aset statis dari Django.

Untuk menggunakan Gunicorn sebagai layanan di Ubuntu, Systemd dapat digunakan. The systemd_unit sumber daya termasuk dalam Chef sejak versi 12.11.

systemd_unit 'gunicorn.service' do
  content({
  Unit: {
    Description: 'Django on Gunicorn',
    After: 'network.target',
  },
  Service: {
    ExecStart: '/usr/local/bin/gunicorn --workers 3 --bind localhost:8080 myapp.wsgi:application',
    User: 'bob',
    Group: 'www-data',
    WorkingDirectory: '/home/bob/myapp'
    Restart: 'always',
  },
  Install: {
    WantedBy: 'multi-user.target',
  }
  })
  action [:create, :enable, :start]
end

Sekarang kita harus memasukkan konfigurasi proxy NGINX standar ke server Gunicorn ini seperti yang ditunjukkan di bawah ini. Cuplikan ini bisa masuk ./my-cookbook/templates/nginx.conf.erb. Buat direktori templates jika tidak ada.

Catatan: Template Chef mendukung file ruby ​​tertanam yang dapat berisi variabel, ekspresi dan pernyataan ruby. Meskipun file ini memiliki ekstensi 'erb', kami tidak menggunakan pernyataan atau ekspresi ruby ​​apa pun. Juga, demi kesederhanaan, kami hanya memiliki konfigurasi nginx non HTTPS di sini (pengingat lembut; tolong jangan lakukan ini dalam produksi!)

server {
  listen 80;
  server_name http://example.com/;

  location = /favicon.ico { access_log off; log_not_found off; }
  location /static/ {
    root /home/bob/myapp/myapp/static;
  }

  location / {
  include proxy_params;
    proxy_pass http://localhost:8080/;
  }
}

Catatan: Ada juga alternatif dan konfigurasi yang lebih baik, di mana, misalnya server Gunicorn terikat ke soket domain unix alih-alih koneksi TCP loopback. Perlu ditelusuri karena alasan kinerja.

Untuk menyalin konfigurasi ini ke folder situs-diaktifkan pada node, gunakan sumber daya template dari Chef.

template '/etc/nginx/sites-available/example.com.conf' do
  source 'nginx.conf.erb'
  owner 'root'
  group 'root'
  mode '0744'
end

Mengaktifkan konfigurasi pada nginx biasanya dilakukan dengan membuat symlink yang menunjuk ke konfigurasi di sites-availabledalam sites-enabledfolder nginx . Symlinks dapat dideklarasikan di buku masak koki dengan sumber tautan seperti yang ditunjukkan di bawah ini:

link '/etc/nginx/sites-enabled/example.com.conf' do
  to '/etc/nginx/sites-available/example.com.conf'
end

dan untuk menghapus symlink konfigurasi default:

link '/etc/nginx/sites-enabled/default' do
  action :delete
end

Mulai NGINX

Dan akhirnya, untuk menjalankan layanan nginx:

service 'nginx' do
  action :enable
  action :start
end

Runlists

Run-list di chef adalah daftar urutan peran atau resep dalam buku masak yang akan dieksekusi secara berurutan pada node. Kami memiliki satu buku resep "my-cookbook" dan resep "default" di dalamnya yang perlu kami jalankan di kotak Ubuntu, sehingga runlist.json di direktori proyek kami ( ./my-chef-project/runlist.json) akan terlihat seperti ini:

{
  "run_list": [
    "recipe[my-cookbook::default]"
  ]
}

Langkah terakhir

Buku masak kami untuk Chef solo siap disajikan. Saatnya menyediakan mesin Ubuntu 18.04 dan menginstal ChefDK di atasnya:

$ ssh [email protected] 'apt-get update && yes | apt-get install curl && curl https://packages.chef.io/files/current/chefdk/4.7.45/ubuntu/18.04/chefdk_4.7.45-1_amd64.deb -o chefdk.deb && yes | dpkg -i chefdk.deb && rm chefdk.deb'

Kembali ke workstation Chef kami , yang perlu kita lakukan adalah meletakkan folder buku masak di dalam tarball, mentransfer tarball itu bersama dengan runlist.jsonke simpul jarak jauh yang kami sediakan di atas dan menjalankan perintah chef-solo:

(Perintah di bawah ini harus dijalankan di dalam node atau 'klien chef' dan bukan Workstation Chef)

$ chef-solo --recipe-url $(pwd)/chef-solo.tar.gz -j $(pwd)/runlist.json --chef-license=accept

Atau ini adalah one-liner (Untuk dijalankan dari ./my-chef-project/CWD di Chef Workstation):

tar zvcf chef-solo.tar.gz ./cookbooks &&\
scp chef-solo.tar.gz runlist.json [email protected]:~/ &&\
ssh [email protected] 'chef-solo --recipe-url $(pwd)/chef-solo.tar.gz -j $(pwd)/runlist.json --chef-license=accept'

Itu dia! Tonton output standar yang terisi oleh aktivitas Chef yang mencoba menyatukan simpul Anda dengan apa yang Anda tentukan di buku masak. Chef-solo akan memasang semua permata yang diperlukan untuk semua buku masak. Jika perintah chef-solo berhasil, kita akan memiliki aplikasi Django yang berjalan di belakang nginx pada kotak Ubuntu. Arahkan ke domain / IP untuk mengujinya.

Catatan: Ingatlah bahwa dalam Django Anda mungkin perlu mengatur domain / ip ini dalam ALLOWED_HOSTSdaftar di settings.py.

Menanggapi perubahan

Setiap kali kami membuat perubahan dalam isi direktori proyek kami (resep, templat atau kode sumber aplikasi dll), cukup jalankan satu-baris di atas dari direktori proyek.

Kiat: Jika buku resep dikontrol dengan versi git (sebagaimana mestinya), satu rekomendasi yang bagus adalah mengatur kait git untuk menjalankan one-liner ini.

Hosting tarball (opsional)

Jika Anda melihat dengan seksama pada perintah chef-solo terakhir, perhatikan bahwa --recipe-urlitu dimaksudkan untuk mengambil URL. Ini berarti Anda dapat memiliki alur kerja di mana CI akan membuat tarball chef-solo Anda, mengunggahnya ke suatu tempat dan mengkonfigurasi simpul Anda untuk menariknya secara berkala.

Kiat: Gunakan ikal untuk menarik tarball yang diubah secara berkala sebagai cronjob. curl -z $fileakan menghormati If-Modified-Sinceheader dan hanya akan mengunduh bola tar jika file jarak jauh telah diubah sejak stempel waktu pada lokal yang ada $file.



Leave a Comment

Memulai Dengan SaltStack di Ubuntu 17.04

Memulai Dengan SaltStack di Ubuntu 17.04

SaltStack adalah program manajemen konfigurasi berbasis python yang dioptimalkan untuk otomatisasi file konfigurasi, penyebaran, dan hal lain yang perlu

Cara Memasang Jenkins di CentOS 7

Cara Memasang Jenkins di CentOS 7

Jenkins adalah alat open source CI (Continuous Integration) yang populer yang banyak digunakan untuk pengembangan, penyebaran, dan otomatisasi proyek. Artikel ini wil

Cara Memasang Drone CI di Ubuntu 18.04

Cara Memasang Drone CI di Ubuntu 18.04

Pendahuluan Drone adalah platform pengujian dan pengiriman otomatis dan berkesinambungan yang berjalan pada infrastruktur Anda sendiri. Drone mendukung bahasa apa pun, layanan o

Vultr Load Balancers

Vultr Load Balancers

Apa itu Load Balancer Load Balancers duduk di depan aplikasi Anda dan mendistribusikan lalu lintas masuk di beberapa instance aplikasi Anda. Fo

Menggunakan SaltStack With Pillars di Ubuntu 17.04

Menggunakan SaltStack With Pillars di Ubuntu 17.04

Sementara SaltStack adalah alat yang hebat untuk menjalankan operasi pada banyak server secara bersamaan, SaltStack juga mendukung pengaturan konfigurasi yang ditentukan per-host yang disimpan dalam

Cara Memasang SaltStack di CentOS 7

Cara Memasang SaltStack di CentOS 7

SaltStack, atau Salt, adalah solusi manajemen konfigurasi open source yang populer yang dapat digunakan untuk mengimplementasikan eksekusi jarak jauh, manajemen konfigurasi, cod

Cara Menginstal dan Mengkonfigurasi Anonim pada CentOS 7 untuk Digunakan Dengan Windows Server

Cara Menginstal dan Mengkonfigurasi Anonim pada CentOS 7 untuk Digunakan Dengan Windows Server

Menggunakan Sistem yang Berbeda? Ansible adalah alat sumber terbuka untuk mengotomatisasi tugas. Ia mengelola konfigurasi server Linux dan Windows Anda. Ini bekerja

Cara Memasang dan Mengkonfigurasi Concourse CI di CentOS 7

Cara Memasang dan Mengkonfigurasi Concourse CI di CentOS 7

Menggunakan Sistem yang Berbeda? Pengantar Continuous Integration adalah praktik pengembangan perangkat lunak DevOps yang memungkinkan pengembang untuk sering menggabungkannya

Cara Memasang dan Mengkonfigurasi Concourse CI di Ubuntu 16.04

Cara Memasang dan Mengkonfigurasi Concourse CI di Ubuntu 16.04

Menggunakan Sistem yang Berbeda? Pengantar Continuous Integration adalah praktik pengembangan perangkat lunak DevOps yang memungkinkan pengembang untuk sering menggabungkannya

Cara Memasang CD Strider di Ubuntu 18.04

Cara Memasang CD Strider di Ubuntu 18.04

Pendahuluan Strider CD adalah platform penyebaran berkelanjutan sumber terbuka. Aplikasi ini ditulis dalam Node.js dan menggunakan MongoDB sebagai cadangan penyimpanan. Melangkah

Cara Menginstal dan Mengkonfigurasi Anonim pada Debian 9 untuk Digunakan Dengan Windows Server

Cara Menginstal dan Mengkonfigurasi Anonim pada Debian 9 untuk Digunakan Dengan Windows Server

Menggunakan Sistem yang Berbeda? Ansible adalah alat sumber terbuka untuk mengotomatisasi tugas. Ia mengelola konfigurasi server Linux dan Windows Anda. Ini bekerja

Membuat Snapshots Dengan Packer

Membuat Snapshots Dengan Packer

Apa itu Packer? Packer adalah alat pencitraan server yang dikembangkan oleh HashiCorp. Pencitraan server; atau sebagai alternatif, infrastruktur yang tidak dapat diubah; adalah alternatif populer

Cara Memasang dan Mengkonfigurasi GoCD pada CentOS 7

Cara Memasang dan Mengkonfigurasi GoCD pada CentOS 7

Menggunakan Sistem yang Berbeda? GoCD adalah sistem pengantaran dan otomatisasi sumber terbuka yang berkelanjutan. Ini memungkinkan Anda untuk memodelkan alur kerja yang kompleks menggunakan paralelnya

Menggunakan Manajer Paket Chocolatey di Windows

Menggunakan Manajer Paket Chocolatey di Windows

Pendahuluan Chocolatey membawa manajemen paket yang memudahkan administrasi perangkat lunak dan dependensi di Linux, ke Windows. Anda dapat dengan cepat dan mudah

Cara Memasang Foreman di CentOS 7

Cara Memasang Foreman di CentOS 7

Menggunakan Sistem yang Berbeda? Foreman adalah alat sumber terbuka dan gratis yang membantu Anda dengan konfigurasi dan pengelolaan server fisik dan virtual. Forema

Cara Memasang Foreman di Ubuntu 16.04 LTS

Cara Memasang Foreman di Ubuntu 16.04 LTS

Menggunakan Sistem yang Berbeda? Foreman adalah alat sumber terbuka dan gratis yang membantu Anda dengan konfigurasi dan pengelolaan server fisik dan virtual. Forema

Wawasan tentang 26 Teknik Analisis Data Besar: Bagian 1

Wawasan tentang 26 Teknik Analisis Data Besar: Bagian 1

Wawasan tentang 26 Teknik Analisis Data Besar: Bagian 1

6 Hal yang Sangat Menggila dari Nintendo Switch

6 Hal yang Sangat Menggila dari Nintendo Switch

Banyak dari Anda tahu Switch keluar pada Maret 2017 dan fitur-fitur barunya. Bagi yang belum tahu, kami sudah menyiapkan daftar fitur yang membuat 'Switch' menjadi 'gadget yang wajib dimiliki'.

Janji Teknologi Yang Masih Belum Ditepati

Janji Teknologi Yang Masih Belum Ditepati

Apakah Anda menunggu raksasa teknologi untuk memenuhi janji mereka? periksa apa yang belum terkirim.

Fungsionalitas Lapisan Arsitektur Referensi Big Data

Fungsionalitas Lapisan Arsitektur Referensi Big Data

Baca blog untuk mengetahui berbagai lapisan dalam Arsitektur Big Data dan fungsinya dengan cara yang paling sederhana.

Bagaimana AI Dapat Membawa Otomatisasi Proses ke Tingkat Selanjutnya?

Bagaimana AI Dapat Membawa Otomatisasi Proses ke Tingkat Selanjutnya?

Baca ini untuk mengetahui bagaimana Kecerdasan Buatan menjadi populer di antara perusahaan skala kecil dan bagaimana hal itu meningkatkan kemungkinan untuk membuat mereka tumbuh dan memberi keunggulan pada pesaing mereka.

CAPTCHA: Berapa Lama Itu Bisa Tetap Menjadi Teknik yang Layak Untuk Perbedaan Human-AI?

CAPTCHA: Berapa Lama Itu Bisa Tetap Menjadi Teknik yang Layak Untuk Perbedaan Human-AI?

CAPTCHA telah berkembang cukup sulit bagi pengguna untuk dipecahkan dalam beberapa tahun terakhir. Apakah itu akan tetap efektif dalam deteksi spam dan bot di masa mendatang?

Singularitas Teknologi: Masa Depan Peradaban Manusia yang Jauh?

Singularitas Teknologi: Masa Depan Peradaban Manusia yang Jauh?

Saat Sains Berkembang dengan kecepatan tinggi, mengambil alih banyak upaya kita, risiko menundukkan diri kita pada Singularitas yang tidak dapat dijelaskan juga meningkat. Baca, apa arti singularitas bagi kita.

Telemedicine Dan Perawatan Kesehatan Jarak Jauh: Masa Depan Ada Di Sini

Telemedicine Dan Perawatan Kesehatan Jarak Jauh: Masa Depan Ada Di Sini

Apa itu telemedicine, perawatan kesehatan jarak jauh dan dampaknya terhadap generasi mendatang? Apakah itu tempat yang bagus atau tidak dalam situasi pandemi? Baca blog untuk menemukan tampilan!

Pernahkah Anda Bertanya-tanya Bagaimana Hacker Menghasilkan Uang?

Pernahkah Anda Bertanya-tanya Bagaimana Hacker Menghasilkan Uang?

Anda mungkin pernah mendengar bahwa peretas menghasilkan banyak uang, tetapi pernahkah Anda bertanya-tanya bagaimana cara mereka mendapatkan uang sebanyak itu? mari berdiskusi.

Pembaruan Tambahan macOS Catalina 10.15.4 Menyebabkan Lebih Banyak Masalah Daripada Menyelesaikan

Pembaruan Tambahan macOS Catalina 10.15.4 Menyebabkan Lebih Banyak Masalah Daripada Menyelesaikan

Baru-baru ini Apple merilis macOS Catalina 10.15.4 pembaruan suplemen untuk memperbaiki masalah tetapi tampaknya pembaruan menyebabkan lebih banyak masalah yang mengarah ke bricking mesin mac. Baca artikel ini untuk mempelajari lebih lanjut