Korištenje Chef-solo za konfiguriranje Django aplikacije na Ubuntu

Postoji mnogo načina za automatizaciju procesa postavljanja i konfiguriranja kutije. Iz bilo kojeg razloga, ako se cijeli naš sustav u ovom trenutku sastoji od samo jedne kutije, postavljanje potpune SCM (Software Configuration Management) infrastrukture je pretjerano. Shell skripte su jedna od opcija, ali možemo koristiti i smanjenu verziju SCM-a koja je dostupna u nekoliko alata. Chef je jedna od popularnih opcija, a "chef-solo" je Chefov samostalni konfiguracijski način u kojem ne trebamo dodatni čvor da djeluje kao "chef-server". Sve što treba je URL ili put do tarball paketa koji sadrži kuharske knjige. U usporedbi sa shell skriptama, ova vrsta pristupa je deklarativnija i učinkovitija izvan okvira te je također dobar uvod za početak rada s SCM-ovima ili IaC (Infrastruktura kao kod) procesima.

Nekoliko drugih prednosti korištenja chef-solo:

  • Kompozicija: Koristite kuharice iz zajednice kuhara u supermarketu ili na drugim mjestima.
  • Besplatno i otvorenog koda; licenciran pod dopuštenom Apache 2.0 licencom.
  • Pristup ostatku Chefovog ekosustava (InSpec, ChefSpec, Cookstyle, Foodcritic, chef-shell itd.)
  • Kuharice i recepti mogu se kasnije prilagoditi načinu rada klijent/poslužitelj.

I neke nedostatke:

  • Neke društvene kuharice u Chef supermarketu su zastarjele, pokvarene i ne održavaju se.
  • chef-solo ne može samostalno riješiti ovisnosti.

'Recepti' unutar kuharske 'kuharice' imaju DSL baziran na rubinu koji opisuje 'resurse' u određenom stanju na čvoru. Nastavimo s korakom kako bismo se upoznali s nekoliko Chef koncepata koji su također primjenjivi na chef-solo. Naš cilj je postaviti Ubuntu čvor koji pokreće Python/Django web aplikaciju koristeći Gunicorn i NGINX.

Note: We do not necessarily require ChefDK to be installed on our "Chef workstation" (our machine), although with it, we can use 'chef generate' commands to start-off with a directory structure for creating cookbooks, recipes and more. In this article, we will assume ChefDK is installed on our workstation. Commands were run using the version 4.7.26-1 of ChefDK.


(Sve od ovog trenutka nadalje, osim ako nije drugačije navedeno, treba se izvoditi na našem stroju, koji se također naziva 'Chef Workstation')

Izrada kuharice

Cookbooks in chef su jedinice za višekratnu upotrebu koje sadrže sve što je potrebno za podršku scenariju konfiguracije. Kuharice mogu sadržavati više 'recepata', a 'recepti' se uglavnom sastoje od uzoraka resursa. default.rbje zadani recept koji će se pokrenuti kada se kuharica referencira u popisu pokretanja . Različiti recepti omogućuju odvajanje briga. Međutim, za ovaj vodič ćemo dodati sve deklaracije resursa u jednu glavnu datoteku recepta, a to je default.rb.

Napravite mapu pod nazivom "my-chef-project" i unutar nje stvorite mapu pod nazivom "cookbooks". Od ./my-chef-project/cookbooks/, pokrenite:

$ chef generate cookbook my-cookbook

Naša struktura imenika sada će izgledati ovako:

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

Dodavanje paketa

Prvi korak u postavljanju našeg čvora je identificirati koje pakete zahtijeva naša aplikacija. Naš čvor je odabran da bude Ubuntu, tako da se možemo osloniti na APT upravitelj paketa da prikupi ovisnosti. Instalacija paketa koje pruža OS distribucija je tada vrlo jednostavna:

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'

Ovo je prilično razumljivo. Prvi redak će ažurirati apt spremište, a sljedeći retki će instalirati te pakete.

Note: The packages following 'nginx' are needed for compiling some of the python dependencies through pip. These may differ based on your python/django project dependencies specified in requirements.txt. You can use a trial and error method to determine these packages that you need to include in your cookbook. To do that, perform a manual sudo pip install -r requirements.txt (Note: This installs packages system wide!) on a freshly instantiated ubuntu machine to see if it runs successfully. If not, the stderr should give you hints on what packages are missing.

Kreiranje Linux korisnika

Kada završimo s dodavanjem potrebnih paketa, moramo stvoriti neprivilegiranog korisnika Linuxa koji će posjedovati izvorni kod aplikacije.

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

Imajte na umu da je lozinka shadow hash format koji se koristi u Linuxu. Može se izvesti pomoću OpenSSL-a:

$ openssl passwd -1 -salt alilbitof mypassword

Uključujući izvor aplikacije

Sada uključimo izvorni kod aplikacije Django u našu kuharicu. Postavite izvorni kod unutar ./my-chef-project/cookbooks/my-cookbook/files/default/myapp/ Stvori ./my-chef-project/cookbooks/my-cookbook/files/defaultdirektorij ako ne postoji.

Upute za kopiranje ovih datoteka na udaljeno mjesto na našem čvoru opisane su korištenjem resursa 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

Povlačenje ovisnosti o pythonu

Da bismo instalirali python pakete u requirements.txt, možemo koristiti execute resurs za pokretanje proizvoljne naredbe. U ovom slučaju, moramo izvršiti naredbu pip install iznad njega:

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

Note: Bear in mind that this is going to execute as the root user and the python libraries will be installed system-wide. If our node is designated to exclusively run this one single python app, then it isn't much of a problem. Despite that, a better option to keep things clean and sane is to find and use a community cookbook that manages python installations or 'virtualenvs'. (or at the very least, write a series of execute blocks to replicate this). Using virtualenvs in python ensures that any python based system tools or other python projects will not be affected

Postavljanje Gunicorn & NGINX

Sada je vrijeme da pripremite Gunicorn WSGI HTTP poslužitelj s NGINX-om kao našim obrnutim proxyjem. Nginx se također koristi za rukovanje svim statičkim sredstvima iz Djanga.

Za povezivanje Gunicorn-a kao usluge na Ubuntu, može se koristiti Systemd. Systemd_unit resurs je uključena u Chef od verzije 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

Sada moramo uključiti standardnu ​​NGINX proxy konfiguraciju na ovaj Gunicorn poslužitelj kao što je prikazano u nastavku. Ovaj isječak može ići u ./my-cookbook/templates/nginx.conf.erb. Kreirajte direktorij predložaka ako ne postoji.

Note: Chef's templates support embedded ruby files that can contain variables, ruby expressions and statements. Although this file has the 'erb' extension, we did not use any of the ruby statements or expressions. Also, for the sake of simplicity, we only have a non HTTPS nginx config here (gentle reminder; please do not do this in production!)

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

Note: There is also an alternative and a better config, where, for instance the Gunicorn server is bound to a unix domain socket instead of a TCP loopback connection. It's worth exploring that for performance reasons.

Da biste kopirali ovu konfiguraciju u mapu s omogućenim web-mjestima na čvoru, koristite resurs predloška iz Chefa.

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

Aktiviranje konfiguracija na nginxu obično se vrši stvaranjem simbolične veze koja pokazuje na konfiguraciju sites-availableu nginxovoj sites-enabledmapi. Simboličke veze mogu se deklarirati u kuharskim knjigama s izvorom veze kao što je prikazano u nastavku:

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

i za brisanje simbolične veze zadane konfiguracije:

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

Pokretanje NGINX-a

I na kraju, za pokretanje nginx usluge:

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

Runlists

Run-liste u chef su poredani popis uloga ili recepata u kuharici koji će se izvršavati u nizu na čvoru. Imamo jednu kuharicu "my-cookbook" i "default" recept unutar nje koju trebamo izvršiti na Ubuntu okviru, tako da bi runlist.json u našem direktoriju projekta ( ./my-chef-project/runlist.json) trebao izgledati ovako:

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

Završni koraci

Naša kuharica za Chef solo spremna je za posluživanje. Vrijeme je da osigurate Ubuntu 18.04 stroj i instalirate ChefDK na njega:

$ 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'

Vraćajući se na našu Chef radnu stanicu , sve što trebamo učiniti je staviti mapu kuharica u tarball, prenijeti taj tarball zajedno s gore runlist.jsonnavedenim udaljenim čvorom i pokrenuti naredbu chef-solo:

(Sljedeća naredba se izvodi unutar čvora ili 'chef klijenta', a ne Chef Workstation)

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

Ili evo jednostrukog (pokreće se iz ./my-chef-project/CWD-a na 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'

To je to! Gledajte kako se standardni izlazni rezultat ispunjava aktivnostima kuhara koji pokušava konvergirati vaš čvor s onim što ste naveli u kuharicama. Chef-solo će instalirati sve dragulje potrebne za sve kuharice. Ako je naredba chef-solo uspješna, imat ćemo radnu Django aplikaciju koja radi iza nginxa na Ubuntu kutiji. Idite na domenu/IP da biste je testirali.

Note: Remember that in django you may need to set this domain/ip in the ALLOWED_HOSTS list in settings.py.

Reagiranje na promjene

Kad god promijenimo sadržaj našeg projektnog imenika (recepti, predlošci ili izvorni kod aplikacije itd.), jednostavno pokrenite gornji jednostruki redak iz direktorija projekta.

Tip: If the cookbook is version controlled with git (as it should), one good recommendation is to set git hooks to run this one-liner.

Hosting tarball-a (opcionalno)

Ako pomno pogledate posljednju naredbu chef-solo, primijetite da --recipe-urlje namijenjena preuzimanju URL-a. To znači da možete imati tijek rada u kojem će CI izgraditi vaš chef-solo tarball, prenijeti ga negdje i konfigurirati vaš čvor da povremeno izvlači iz njega.

Tip: Use curl to pull the changed tarball periodically as a cronjob. curl -z $file will honor If-Modified-Since headers and will only download the tar ball if the remote file has been changed since the timestamp on the existing local $file.


Kako instalirati Jenkins na CentOS 7

Kako instalirati Jenkins na CentOS 7

Jenkins je popularan open source CI (Continuous Integration) alat koji se naširoko koristi za razvoj projekata, implementaciju i automatizaciju. Ovaj članak će

Kako instalirati i konfigurirati Concourse CI na Ubuntu 16.04

Kako instalirati i konfigurirati Concourse CI na Ubuntu 16.04

Korištenje drugog sustava? Uvod Kontinuirana integracija je praksa razvoja softvera DevOps koja omogućuje programerima da često spajaju

Kako instalirati i konfigurirati Ansible na Debian 9 za korištenje sa Windows Serverom

Kako instalirati i konfigurirati Ansible na Debian 9 za korištenje sa Windows Serverom

Korištenje drugog sustava? Ansible je alat otvorenog koda za automatizaciju zadataka. Upravlja konfiguracijom vaših Linux i Windows poslužitelja. Radi

Kako instalirati i konfigurirati GoCD na CentOS 7

Kako instalirati i konfigurirati GoCD na CentOS 7

Korištenje drugog sustava? GoCD je open source sustav kontinuirane isporuke i automatizacije. Omogućuje vam modeliranje složenih tijekova rada koristeći svoj paralelni an

Korištenje SaltStacka sa stupovima na Ubuntu 17.04

Korištenje SaltStacka sa stupovima na Ubuntu 17.04

Iako je SaltStack izvrstan alat za istovremeno izvođenje operacija na mnogim poslužiteljima, on također podržava unaprijed definirane konfiguracijske postavke po hostu pohranjene u

Kako instalirati i konfigurirati Ansible na CentOS 7 za korištenje sa Windows Serverom

Kako instalirati i konfigurirati Ansible na CentOS 7 za korištenje sa Windows Serverom

Korištenje drugog sustava? Ansible je alat otvorenog koda za automatizaciju zadataka. Upravlja konfiguracijom vaših Linux i Windows poslužitelja. Radi

Kako instalirati Drone CI na Ubuntu 18.04

Kako instalirati Drone CI na Ubuntu 18.04

Uvod Drone je automatizirana, kontinuirana platforma za testiranje i isporuku koja radi na vašoj vlastitoj infrastrukturi. Drone podržava bilo koji jezik, uslugu o

Vultr balanseri opterećenja

Vultr balanseri opterećenja

Što je Load Balancer Balanseri opterećenja sjede ispred vaše aplikacije i distribuiraju dolazni promet na više instanci vaše aplikacije. Fo

Kako instalirati Foremana na CentOS 7

Kako instalirati Foremana na CentOS 7

Korištenje drugog sustava? Foreman je besplatni alat otvorenog koda koji vam pomaže u konfiguraciji i upravljanju fizičkim i virtualnim poslužiteljima. Forema

Kako instalirati SaltStack na CentOS 7

Kako instalirati SaltStack na CentOS 7

SaltStack ili Salt je popularno rješenje za upravljanje konfiguracijom otvorenog koda koje se može koristiti za implementaciju daljinskog izvršavanja, upravljanja konfiguracijom, cod

Kako instalirati Strider CD na Ubuntu 18.04

Kako instalirati Strider CD na Ubuntu 18.04

Uvod Strider CD je platforma za kontinuiranu implementaciju otvorenog koda. Aplikacija je napisana u Node.js i koristi MongoDB kao pozadinu za pohranu. Korak

Korištenje Chocolatey Package Managera u sustavu Windows

Korištenje Chocolatey Package Managera u sustavu Windows

Uvod Chocolatey u Windows donosi upravljanje paketima koje olakšava administraciju softvera i ovisnosti na Linuxu. Možete brzo i jednostavno

Izrada snimaka pomoću Packera

Izrada snimaka pomoću Packera

Što je Packer? Packer je alat za obradu slika poslužitelja koji je razvio HashiCorp. Slika poslužitelja; ili alternativno, nepromjenjiva infrastruktura; je popularna alternativa

Kako instalirati i konfigurirati Concourse CI na CentOS 7

Kako instalirati i konfigurirati Concourse CI na CentOS 7

Korištenje drugog sustava? Uvod Kontinuirana integracija je praksa razvoja softvera DevOps koja omogućuje programerima da često spajaju

Korištenje Chef-solo za konfiguriranje Django aplikacije na Ubuntu

Korištenje Chef-solo za konfiguriranje Django aplikacije na Ubuntu

Postoji mnogo načina za automatizaciju procesa postavljanja i konfiguriranja kutije. Iz bilo kojeg razloga, ako se cijeli naš sustav u ovom trenutku sastoji od pravednih

Kako instalirati Foremana na Ubuntu 16.04 LTS

Kako instalirati Foremana na Ubuntu 16.04 LTS

Korištenje drugog sustava? Foreman je besplatni alat otvorenog koda koji vam pomaže u konfiguraciji i upravljanju fizičkim i virtualnim poslužiteljima. Forema

Početak rada sa SaltStackom na Ubuntu 17.04

Početak rada sa SaltStackom na Ubuntu 17.04

SaltStack je program za upravljanje konfiguracijom temeljen na pythonu koji je optimiziran za automatizaciju konfiguracijskih datoteka, implementacije i svega ostalog

Uspon strojeva: primjene AI u stvarnom svijetu

Uspon strojeva: primjene AI u stvarnom svijetu

Umjetna inteligencija nije u budućnosti, ovdje je upravo u sadašnjosti. U ovom blogu Pročitajte kako su aplikacije umjetne inteligencije utjecale na različite sektore.

DDOS napadi: kratak pregled

DDOS napadi: kratak pregled

Jeste li i vi žrtva DDOS napada i zbunjeni ste metodama prevencije? Pročitajte ovaj članak kako biste riješili svoje upite.

Jeste li se ikada zapitali kako hakeri zarađuju novac?

Jeste li se ikada zapitali kako hakeri zarađuju novac?

Možda ste čuli da hakeri zarađuju mnogo novca, ali jeste li se ikada zapitali kako zarađuju toliki novac? raspravimo.

Revolucionarni Googleovi izumi koji će vam olakšati život.

Revolucionarni Googleovi izumi koji će vam olakšati život.

Želite li vidjeti revolucionarne izume Googlea i kako su ti izumi promijenili život svakog čovjeka danas? Zatim čitajte na blogu kako biste vidjeli Googleove izume.

Friday Essential: Što se dogodilo s automobilima s umjetnom inteligencijom?

Friday Essential: Što se dogodilo s automobilima s umjetnom inteligencijom?

Koncept samovozećih automobila koji će krenuti na ceste uz pomoć umjetne inteligencije san je koji već neko vrijeme imamo. No, unatoč nekoliko obećanja, nigdje ih nema. Pročitajte ovaj blog kako biste saznali više…

Tehnološka singularnost: daleka budućnost ljudske civilizacije?

Tehnološka singularnost: daleka budućnost ljudske civilizacije?

Kako se znanost razvija velikom brzinom, preuzimajući mnoge naše napore, raste i rizik da se podvrgnemo neobjašnjivoj Singularnosti. Pročitajte što bi za nas mogla značiti singularnost.

Evolucija pohrane podataka – Infografika

Evolucija pohrane podataka – Infografika

Metode pohrane podataka su se razvijale možda od rođenja podataka. Ovaj blog pokriva evoluciju pohrane podataka na temelju infografike.

Funkcionalnosti slojeva referentne arhitekture velikih podataka

Funkcionalnosti slojeva referentne arhitekture velikih podataka

Pročitajte blog kako biste na najjednostavniji način upoznali različite slojeve u arhitekturi velikih podataka i njihove funkcionalnosti.

6 nevjerojatnih prednosti posjedovanja pametnih kućnih uređaja u našim životima

6 nevjerojatnih prednosti posjedovanja pametnih kućnih uređaja u našim životima

U ovom digitalnom svijetu, pametni kućni uređaji postali su ključni dio života. Evo nekoliko nevjerojatnih prednosti pametnih kućnih uređaja o tome kako naš život čine vrijednim življenja i jednostavnijim.

Ažuriranje dodataka macOS Catalina 10.15.4 uzrokuje više problema nego što ih rješava

Ažuriranje dodataka macOS Catalina 10.15.4 uzrokuje više problema nego što ih rješava

Nedavno je Apple izdao macOS Catalina 10.15.4 dodatak ažuriranju kako bi riješio probleme, ali čini se da ažuriranje uzrokuje više problema koji dovode do zalijevanja mac strojeva. Pročitajte ovaj članak da biste saznali više