Ubuntuda Django Uygulamasını Yapılandırmak için Chef-solo Kullanma

Bir kutuyu kurma ve yapılandırma işlemini otomatikleştirmenin birçok yolu vardır. Her ne sebeple olursa olsun, bu noktada tüm sistemimiz tek bir kutudan oluşuyorsa, tam bir SCM (Yazılım Yapılandırma Yönetimi) altyapısı oluşturmak aşırı bir iştir. Kabuk komut dosyaları bir seçenektir, ancak SCM'nin soyulmuş bir sürümünü de kullanabiliriz. Chef popüler seçeneklerden biridir ve "chef-solo" Chef'in bağımsız yapılandırma modudur ve burada "şef-sunucu" olarak hareket etmek için fazladan bir düğüme ihtiyaç duymazız. Tek gereken, bir URL veya şef yemek kitapları içeren bir tarball paketinin yoludur. Kabuk betikleri ile karşılaştırıldığında, bu tür bir yaklaşım kutudan daha açıklayıcı ve etkilidir ve ayrıca SCM'ler veya IaC (Kod Olarak Altyapı) süreçlerine başlamak için iyi bir giriş niteliğindedir.

Chef-solo kullanmanın diğer birkaç faydası:

  • Çıkarılabilirlik: Şef süpermarketi veya diğer yerlerden gelen topluluk yemek kitaplarını kullanın.
  • Özgür ve açık kaynak; izin verilen Apache 2.0 Lisansı kapsamında lisanslanmıştır.
  • Şef ekosisteminin geri kalanına erişim (InSpec, ChefSpec, Cookstyle, Foodcritic, şef kabuğu vb.)
  • Yemek kitapları ve tarifler daha sonra bir istemci / sunucu moduna uyarlanabilir.

Ve bazı dezavantajları:

  • Şef süpermarketteki bazı topluluk yemek kitapları eskimiş, kırık ve bakımsız.
  • chef-solo bağımlılıkları kendi başına çözemez.

Bir şef 'yemek kitabının' içindeki 'tarifler', bir düğümde belirli bir durumda olacak şekilde 'kaynakları' tanımlayan yakut tabanlı bir DSL'ye sahiptir. Şef-solo için de geçerli olan birkaç Şef kavramını tanımak için bir yol izleyelim. Hedefimiz Gunicorn ve NGINX kullanarak bir Python / Django web uygulaması çalıştıran bir Ubuntu düğümü kurmaktır.

Not: ChefDK'nin "Chef iş istasyonumuza" (makinemize) kurulması zorunlu değildir, bununla birlikte, yemek kitapları, yemek tarifleri ve daha fazlasını oluşturmak için bir dizin yapısıyla başlamak için 'şef oluşturma' komutlarını kullanabiliriz. Bu yazıda, ChefDK'nin iş istasyonumuza kurulu olduğunu varsayacağız. Komutlar ChefDK'nin 4.7.26-1 sürümü kullanılarak çalıştırıldı.


(Aksi belirtilmedikçe, bu noktadan sonraki her şey, 'Şef İş İstasyonu' olarak da adlandırılan makinemizde çalıştırılacaktır)

Yemek kitabı oluşturma

Şefteki yemek kitapları, bir yapılandırma senaryosunu desteklemek için gereken her şeyi içeren yeniden kullanılabilir birimlerdir. Yemek kitapları birden fazla 'tarif' içerebilir ve 'tarifler' çoğunlukla kaynak kalıplarından oluşur. default.rbçalışma kitabına bir çalışma listesinde referans verildiğinde çalıştırılacak varsayılan reçetedir . Farklı tarifler endişelerin ayrılmasına izin verir. Bununla birlikte, bu öğretici için tüm kaynak bildirimlerini bir ana tarif dosyasına ekleyeceğiz, yani default.rb.

"Chef-project" adında bir klasör oluşturun ve içinde "cookbooks" adında bir klasör oluşturun. Gönderen ./my-chef-project/cookbooks/, çalıştırın:

$ chef generate cookbook my-cookbook

Dizin yapımız şimdi şöyle görünecek:

.
└── 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

Paket ekleme

Düğümümüzü kurmanın ilk adımı, uygulamamız tarafından hangi paketlerin gerekli olduğunu belirlemektir. Düğümümüz Ubuntu olarak seçildi, böylece bağımlılıkları toplamak için APT paket yöneticisine güvenebiliriz. OS dağıtımı tarafından sağlanan paketlerin kurulması o zaman çok kolay:

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'

Bunlar oldukça açıklayıcıdır. İlk satır apt deposunu güncelleyecek ve aşağıdaki satırlar bu paketleri kuracaktır.

Not: Python bağımlılıklarının bir kısmını pip yoluyla derlemek için 'nginx'i izleyen paketler gereklidir. Bunlar, içinde belirtilen python / django proje bağımlılıklarınıza bağlı olarak değişebilir requirements.txt. Yemek kitabınıza eklemeniz gereken bu paketleri belirlemek için bir deneme yanılma yöntemi kullanabilirsiniz. Bunu yapmak için, sudo pip install -r requirements.txtbaşarılı bir şekilde çalışıp çalışmadığını görmek için yeni başlatılmış bir ubuntu makinesinde bir el kitabı (Not: Bu, paketleri sisteme yükler!) Gerçekleştirin . Değilse, stderr size hangi paketlerin eksik olduğuna dair ipuçları vermelidir.

Linux kullanıcıları oluşturma

Gerekli paketleri eklemeyi tamamladıktan sonra, uygulama kaynak koduna sahip olacak ayrıcalıksız bir Linux kullanıcısı oluşturmamız gerekir.

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

Parolanın Linux'ta kullanılan bir gölge karma biçimi olduğunu unutmayın. OpenSSL kullanılarak türetilebilir:

$ openssl passwd -1 -salt alilbitof mypassword

Uygulama kaynağı dahil

Şimdi Django uygulama kaynak kodunu yemek kitabımıza ekleyelim. Varsa , kaynak kodunu Dizin ./my-chef-project/cookbooks/my-cookbook/files/default/myapp/ oluşturun'un içine yerleştirin ./my-chef-project/cookbooks/my-cookbook/files/default.

Bu dosyaları düğümümüzdeki uzak bir konuma kopyalama talimatı, remote_directory kaynağı kullanılarak açıklanır :

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

Python bağımlılıklarını çekme

Python paketlerini kurmak için rasgele bir komut çalıştırmak requirements.txtiçin execute kaynağını kullanabiliriz. Bu durumda, üzerinde pip install komutunu çalıştırmamız gerekir:

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

Not: Bunun kök kullanıcı olarak yürütüleceğini ve python kitaplıklarının sistem genelinde yükleneceğini unutmayın. Düğümümüz sadece bu tek bir python uygulamasını çalıştıracak şekilde tasarlanmışsa, o zaman sorun olmaz. Buna rağmen, işleri temiz ve aklı başında tutmak için daha iyi bir seçenek, python kurulumlarını veya 'virtualenvs'i yöneten bir topluluk yemek kitabı bulmak ve kullanmaktır. (veya en azından bunu çoğaltmak için bir dizi yürütme bloğu yazın). Python'da virtualenvs kullanmak, python tabanlı sistem araçlarının veya diğer python projelerinin etkilenmemesini sağlar

Gunicorn & NGINX kurulumu

Şimdi ters proxy olarak Gunicorn WSGI HTTP Sunucusunu NGINX ile hazırlama zamanı. Nginx, Django'daki tüm statik varlıkları işlemek için de kullanılır.

Gunicorn'u Ubuntu'da bir hizmet olarak bağlamak için Systemd kullanılabilir. Systemd_unit kaynak sürümü 12.11 beri şef dahildir.

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

Şimdi bu Gunicorn sunucusuna aşağıda gösterildiği gibi standart bir NGINX proxy yapılandırması eklememiz gerekiyor. Bu pasaj girebilir ./my-cookbook/templates/nginx.conf.erb. Yoksa, dizini oluşturun.

Not: Chef'in şablonları, değişkenler, yakut ifadeleri ve ifadeler içerebilen gömülü yakut dosyalarını destekler. Bu dosya 'erb' uzantısına sahip olmasına rağmen, ruby ​​deyimlerini veya ifadelerini kullanmadık. Ayrıca, basitlik açısından, burada sadece HTTPS olmayan bir nginx yapılandırması var (nazik hatırlatma; lütfen bunu üretimde yapmayın!)

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/;
  }
}

Not: Ayrıca, Gunicorn sunucusunun TCP geri döngü bağlantısı yerine unix etki alanı soketine bağlı olduğu bir alternatif ve daha iyi bir yapılandırma da vardır. Bunu performans nedenleriyle araştırmaya değer.

Bu yapılandırmayı düğümdeki siteler etkin klasöre kopyalamak için Chef'deki şablon kaynağını kullanın .

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

Nginx üzerinde yapılandırmaların etkinleştirilmesi normalde sites-availablenginx'in sites-enabledklasöründeki yapılandırmaya işaret eden bir sembolik bağlantı oluşturularak yapılır . Symlinks aşağıdaki gibi bağlantı kaynağı ile şef yemek kitaplarında ilan edilebilir :

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

ve varsayılan yapılandırma sistem sembolünü silmek için:

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

NGINX'i Başlatma

Ve son olarak, nginx hizmetini başlatmak için:

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

Runlists

Şef içindeki çalışma listeleri, bir yemek kitabındaki düğümde sırayla yürütülecek sıralı bir rol veya tarif listesidir. Ubuntu kutusunda yürütmemiz gereken bir "yemek kitabım" ve "varsayılan" tarifimiz var, bu yüzden proje dizinimizdeki ( ./my-chef-project/runlist.json) runlist.json şöyle görünmelidir:

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

Son adımlar

Chef solo için yemek kitabımız servis edilmeye hazır. Bir Ubuntu 18.04 makinesi tedarik etme ve ChefDK'yı kurma zamanı:

$ ssh root@example.com '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'

Devam eden şef iş istasyonuna geri , yapmamız gereken tek şey bir tarball, transfer içine klasör yemek kitapları koymak olduğunu birlikte arşivini runlist.jsonyukarıda hazırlanmayan ve şef solo komutunu çalıştırın uzaktan düğüme:

(Aşağıdaki komut, Şef İş İstasyonunda değil , düğüm içinde veya 'şef istemci' içinde çalıştırılmalıdır )

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

Veya işte bir astar ( ./my-chef-project/CWD'den Chef Workstation'da çalıştırılacak ):

tar zvcf chef-solo.tar.gz ./cookbooks &&\
scp chef-solo.tar.gz runlist.json root@example.com:~/ &&\
ssh root@example.com 'chef-solo --recipe-url $(pwd)/chef-solo.tar.gz -j $(pwd)/runlist.json --chef-license=accept'

Bu kadar! Düğümünüzü yemek kitaplarında belirttiğiniz şeye dönüştürmeye çalışan Şef etkinliğiyle doldurulan standart çıktıyı izleyin. Chef-solo, tüm yemek kitapları için gerekli olan tüm taşları kuracaktır. Chef-solo komutu başarılı olursa, Ubuntu kutusundaki nginx'in arkasında çalışan bir Django uygulamamız olacaktır. Test etmek için etki alanına / IP'ye gidin.

Not: Django'da ALLOWED_HOSTSlisteden bu etki alanını / ip'i ayarlamanız gerekebileceğini unutmayın settings.py.

Değişikliklere yanıt verme

Proje dizinimizin içeriğinde her değişiklik yaptığımızda (tarifler, şablonlar veya uygulama kaynak kodu vb.), Yukarıdaki tek astarı proje dizininden çalıştırın.

İpucu: Yemek kitabı git ile kontrol edilirse (olması gerektiği gibi), iyi bir öneri git kancaları bu tek astarı çalıştıracak şekilde ayarlamaktır.

Tarball'a ev sahipliği yapmak (isteğe bağlı)

Son şef-solo komutuna yakından bakarsanız, bunun --recipe-urlbir URL alması gerektiğini unutmayın. Bu, bir CI'nin şef-solo tarball'ınızı inşa edeceği, bir yere yükleyeceği ve düğümünüzü periyodik olarak çekecek şekilde yapılandıracağı bir iş akışına sahip olabileceğiniz anlamına gelir.

İpucu: Değiştirilen tarball'ı periyodik olarak bir cronjob olarak çekmek için kıvırmayı kullanın. başlıkları curl -z $fileonurlandıracak If-Modified-Sinceve tar topunu yalnızca mevcut dosyadaki zaman damgasından bu yana uzak dosya değiştirilmişse indirecektir $file.

Yorum bırak

CentOS 7de LibreNMS Kullanarak Cihazlarınızı İzleyin

CentOS 7de LibreNMS Kullanarak Cihazlarınızı İzleyin

CentOS 7 üzerinde LibreNMS kullanarak ağ cihazlarınızı etkili bir şekilde izleyin. Ağ izleme için gerekli adımları ve yapılandırmaları öğrenin.

Counter-Strike: Global Offensive Server Nasıl Kurulur?

Counter-Strike: Global Offensive Server Nasıl Kurulur?

Counter-Strike: Global Offensive sunucusu kurmak için gerekli adımlar. Gerekli araçlar ve yükleme süreci hakkında bilgi.

Ubuntu 16.04 LTS Üzerinde OpenNMS Kurulumu

Ubuntu 16.04 LTS Üzerinde OpenNMS Kurulumu

OpenNMS, çok sayıda cihazı izlemek ve yönetmek için kullanılabilen bir açık kaynak ağ yönetim platformudur. Ubuntu 16.04 LTS üzerinde OpenNMS kurulumu için tüm adımları keşfedin.

Ubuntu 16.04te LibreNMS Kullanarak Cihazlarınızı İzleyin

Ubuntu 16.04te LibreNMS Kullanarak Cihazlarınızı İzleyin

Farklı Bir Sistem mi Kullanıyorsunuz? LibreNMS tam özellikli bir açık kaynak ağ izleme sistemidir.

26 Büyük Veri Analitik Tekniğine Bir Bakış: 1. Bölüm

26 Büyük Veri Analitik Tekniğine Bir Bakış: 1. Bölüm

26 Büyük Veri Analitik Tekniğine Bir Bakış: 1. Bölüm

Büyük Veri Referans Mimarisi Katmanlarının İşlevleri

Büyük Veri Referans Mimarisi Katmanlarının İşlevleri

Büyük Veri Mimarisindeki farklı katmanları ve işlevlerini en basit şekilde öğrenmek için blogu okuyun.

Nintendo Switch Hakkında Son Derece Çılgın 6 Şey

Nintendo Switch Hakkında Son Derece Çılgın 6 Şey

Birçoğunuz Switch'in Mart 2017'de çıkacağını ve yeni özelliklerini biliyorsunuz. Bilmeyenler için, 'Switch'i 'olmazsa olmaz bir gadget' yapan özelliklerin bir listesini hazırladık.

Hala Teslim Edilmeyen Teknoloji Sözleri

Hala Teslim Edilmeyen Teknoloji Sözleri

Teknoloji devlerinin sözlerini yerine getirmesini mi bekliyorsunuz? teslim edilmeyenleri kontrol edin.

Yapay Zeka Süreç Otomasyonunu Nasıl Bir Sonraki Seviyeye Taşıyabilir?

Yapay Zeka Süreç Otomasyonunu Nasıl Bir Sonraki Seviyeye Taşıyabilir?

Yapay Zekanın küçük ölçekli şirketler arasında nasıl popüler hale geldiğini ve onları büyütme ve rakiplerine üstünlük sağlama olasılıklarını nasıl artırdığını öğrenmek için bunu okuyun.

Teknolojik Tekillik: İnsan Uygarlığının Uzak Bir Geleceği mi?

Teknolojik Tekillik: İnsan Uygarlığının Uzak Bir Geleceği mi?

Bilim hızla gelişip birçok çabamızı üstlendikçe, kendimizi açıklanamaz bir Tekilliğe maruz bırakmanın riskleri de artıyor. Okuyun, tekillik bizim için ne anlama gelebilir.