Folosirea Chef-solo pentru a configura o aplicație Django pe Ubuntu

Există multe modalități de a automatiza procesul de configurare și configurare a unei casete. Din orice motiv, dacă întregul nostru sistem în acest moment cuprinde doar o singură casetă, configurarea unei infrastructuri SCM complete (Software Configuration Management) este excesivă. Scripturile Shell sunt o singură opțiune, dar am putea folosi și o versiune strip-down a SCM, care este disponibilă în câteva dintre instrumentele de acolo. Chef este una dintre opțiunile populare, iar „chef-solo” este modul de configurare autonom al Chef, în care nu avem nevoie de un nod suplimentar pentru a acționa ca „server-chef”. Tot ce are nevoie este un URL sau o cale către un pachet de tarball care conține cărți de bucate. În comparație cu scripturile shell, acest tip de abordare este mai declarativ și mai eficient din cutie și este, de asemenea, o introducere bună pentru a începe procesele SCM sau IaC (Infrastructure as Code).

Alte câteva avantaje ale utilizării chef-solo:

  • Compozibilitate: Folosiți cărțile de bucate comunitare de la supermarket-uri de bucătărie sau din alte locuri.
  • Sursă gratuită și deschisă; licențiat sub licența permisivă Apache 2.0.
  • Acces la restul ecosistemului Chef (InSpec, ChefSpec, Cookstyle, Foodcritic, chef-coajă etc.)
  • Cărțile de bucate și rețetele pot fi adaptate ulterior la modul client / server.

Și câteva dezavantaje:

  • Unele cărți de bucate comunitare din supermarketul Chef sunt depășite, rupte și nu sunt întreținute.
  • chef-solo nu poate rezolva singur dependențele.

„Rețetele” din interiorul unui „bucătar de bucătărie” au un DSL pe bază de rubin care descrie „resursele” pentru a fi într-o anumită stare pe un nod. Haideți să parcurgem o etapă avansată pentru a face cunoștință cu câteva concepte Chef care sunt aplicabile și pentru chef-solo. Scopul nostru este să creăm un nod Ubuntu care rulează o aplicație web Python / Django folosind Gunicorn și NGINX.

Notă: Nu este necesar ca ChefDK să fie instalat pe „stația noastră de lucru” (mașina noastră), deși cu aceasta, putem folosi comenzile „chef” pentru a începe cu o structură de directoare pentru crearea de cărți de bucate, rețete și multe altele. În acest articol, vom presupune că ChefDK este instalat pe stația noastră de lucru. Comenzile au fost rulate folosind versiunea 4.7.26-1 a ChefDK.


(Totul din acest moment înainte, cu excepția cazului în care se specifică altfel, va fi rulat pe mașina noastră, denumită și „Stația de lucru pentru Chef”)

Crearea cărții de bucate

Cărțile de bucătărie în bucătar sunt unități reutilizabile care conțin tot ce este necesar pentru a susține un scenariu de configurare. Cărțile de bucate pot conține mai multe „rețete” și „rețete” constau în cea mai mare parte din modele de resurse. default.rbeste rețeta implicită care va fi rulată atunci când cartea de bucate este făcută referință într-o listă de rulare . Rețete diferite permit separarea preocupărilor. Cu toate acestea, pentru acest tutorial, vom adăuga toate declarațiile de resurse într-un singur fișier rețetă principală, care este default.rb.

Creați un folder numit „my-chef-project” și creați un folder în interiorul său numit „cărți de bucate”. De la ./my-chef-project/cookbooks/, executați:

$ chef generate cookbook my-cookbook

Structura noastră de directoare va arăta astfel:

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

Adăugarea pachetelor

Primul pas pentru configurarea nodului nostru este să identificăm ce pachete sunt necesare de aplicația noastră. Nodul nostru este selectat pentru a fi Ubuntu, așa că ne putem baza pe managerul de pachete APT pentru a aduna dependențele. Instalarea pachetelor furnizate de distribuția sistemului de operare este apoi o bucată de tort:

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'

Acestea sunt destul de auto-explicative. Prima linie va actualiza depozitul apt și următoarele linii vor instala acele pachete.

Notă: Pachetele care urmează „nginx” sunt necesare pentru compilarea unora dintre dependențele de piton prin pip. Acestea pot diferi în funcție de dependențele proiectului dvs. python / django specificate în requirements.txt. Puteți utiliza o metodă de încercare și eroare pentru a determina aceste pachete pe care trebuie să le includeți în cartea de bucate. Pentru a face acest lucru, efectuați un manual sudo pip install -r requirements.txt(Notă: Acesta instalează pachete pe întregul sistem!) Pe o mașină ubuntu proaspăt inițiată pentru a vedea dacă rulează cu succes. Dacă nu, stderr ar trebui să vă dea indicații despre pachetele care lipsesc.

Crearea de utilizatori linux

După ce am terminat adăugarea pachetelor necesare, trebuie să creăm un utilizator Linux ne privilegiat care să dețină codul sursă al aplicației.

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

Rețineți că parola este un format hash umbre utilizat în Linux. Poate fi derivat folosind OpenSSL:

$ openssl passwd -1 -salt alilbitof mypassword

Inclusiv sursa aplicației

Acum să includem codul sursă al aplicației Django în cartea noastră de bucate. Plasați codul sursă în interiorul ./my-chef-project/cookbooks/my-cookbook/files/default/myapp/ Creați ./my-chef-project/cookbooks/my-cookbook/files/defaultdirectorul dacă acesta nu există.

Instrucțiunea de copiere a acestor fișiere într-o locație de la distanță de pe nodul nostru este descrisă folosind 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

Trage în dependențele de piton

Pentru a instala pachetele python în requirements.txt, putem folosi resursa execute pentru a rula o comandă arbitrară. În acest caz, trebuie să executăm comanda de instalare pip peste ea:

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

Notă: Rețineți că acest lucru se va executa, deoarece utilizatorul root și bibliotecile python vor fi instalate în întregul sistem. Dacă nodul nostru este desemnat să ruleze exclusiv această singură aplicație python, atunci nu este o problemă. În ciuda acestui fapt, o opțiune mai bună pentru a menține lucrurile curate și sănătoase este să găsești și să folosești o carte de bucate comunitare care să gestioneze instalațiile piton sau „virtualenvs”. (sau cel puțin, scrieți o serie de blocuri de execuție pentru a reproduce acest lucru). Utilizarea virtualenvs în python vă asigură că orice instrumente de sistem bazate pe pitoni sau alte proiecte python nu vor fi afectate

Configurarea Gunicorn & NGINX

Acum este timpul să pregătim Serverul HTTP Gunicorn WSGI cu NGINX ca proxy invers. Nginx este de asemenea utilizat pentru a gestiona toate activele statice de la Django.

Pentru a stoca Gunicorn ca serviciu pe Ubuntu, Systemd poate fi utilizat. Systemd_unit resursa este inclusă în Chef începând cu versiunea 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

Acum trebuie să includem o configurație standard de proxy NGINX pentru acest server Gunicorn, după cum se arată mai jos. Acest fragment poate intra ./my-cookbook/templates/nginx.conf.erb. Creați directorul de șabloane dacă nu există.

Notă: Șabloanele Chef acceptă fișiere ruby ​​încorporate care pot conține variabile, expresii ruby ​​și enunțuri. Deși acest fișier are extensia „erb”, nu am folosit niciuna dintre afirmațiile sau expresiile ruby. De asemenea, din simplitate, avem aici o configurație nginx non HTTPS (amintire blândă; vă rugăm să nu faceți acest lucru în producție!)

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ă: Există, de asemenea, o alternativă și o configurare mai bună, unde, de exemplu, serverul Gunicorn este legat de o priză de domeniu unix în loc de conexiune de buclă TCP. Merită să explorați asta din motive de performanță.

Pentru a copia această configurație în folderul activat pe site-uri pe nod, utilizați resursa șablon de la Chef.

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

Activarea configurațiilor pe nginx se realizează în mod normal prin crearea unui simbol care indică configurația sites-availabledin sites-enabledfolderul nginx . Simbolurile pot fi declarate în cărțile de bucătărie cu bucătărie cu resursa link-ului așa cum se arată mai jos:

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

și pentru a șterge simbolul de configurare implicit:

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

Pornirea NGINX

Și în sfârșit, pentru a porni serviciul nginx:

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

Runlists

Listele de execuții în bucătar sunt o listă ordonată de roluri sau rețete dintr-o carte de bucate care va fi executată în secvență pe nod. Avem în interior o singură carte de bucate „my-cookbook” și rețeta „implicită” pe care trebuie să o executăm în caseta Ubuntu, deci runlist.json din directorul proiectului nostru ( ./my-chef-project/runlist.json) ar trebui să arate astfel:

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

Etapele finale

Cartea noastră de bucate pentru Chef solo este gata de a fi servită. Este timpul să furnizați o mașină Ubuntu 18.04 și să instalați ChefDK pe ea:

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

Revenind la stația noastră de lucru Chef , tot ce trebuie să facem este să punem folderul cărților de bucate în interiorul unui tarball, să transferăm tarballul împreună cu runlist.jsonnodul de la distanță pe care l-am prevăzut mai sus și să executăm comanda chef-solo:

(Comanda de mai jos va fi rulată în interiorul nodului sau al „clientului bucătar” și nu al stației de lucru Chef)

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

Sau iată un singur liner (Pentru a fi executat de la ./my-chef-project/CWD pe 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'

Asta e! Urmăriți completarea standardului de activitate cu activitatea Chef încercând să vă converg nodul la ceea ce ați specificat în cărțile de bucate. Chef-solo va instala toate pietrele necesare pentru toate cărțile de bucate. Dacă comanda chef-solo are succes, vom avea o aplicație Django care funcționează în spatele nginx în caseta Ubuntu. Navigați la domeniu / IP pentru a-l testa.

Notă: nu uitați că în django poate fi necesar să setați acest domeniu / ip în ALLOWED_HOSTSlista din settings.py.

Răspuns la modificări

Ori de câte ori facem o modificare a conținutului directorului nostru de proiect (rețete, șabloane sau codul sursă al aplicației etc), pur și simplu rulăm linia de mai sus din directorul de proiect.

Sfat: Dacă cartea de bucate este controlată în versiune cu git (așa cum trebuie), o recomandare bună este să setați cârlige de git pentru a rula acest liner.

Găzduirea tarballului (opțional)

Dacă te uiți atent la ultima comandă bucătar-solo, observați că aceasta --recipe-urleste menită să ia o adresă URL. Acest lucru înseamnă că puteți avea un flux de lucru în care un CI vă va construi tarballul chef-solo, îl va încărca undeva și va configura nodul pentru a-l extrage periodic.

Sfat: folosiți ondulatorul pentru a trage periodic tarball-ul schimbat ca cronjob. curl -z $fileva onora If-Modified-Sinceantetele și va descărca bila tar dacă numai fișierul de la distanță a fost schimbat de la marcajul de timp pe localul existent $file.



Leave a Comment

Noțiuni introductive cu SaltStack pe Ubuntu 17.04

Noțiuni introductive cu SaltStack pe Ubuntu 17.04

SaltStack este un program de gestionare a configurațiilor bazat pe python, care este optimizat pentru automatizarea fișierelor de configurare, implementări și orice altceva unde

Cum se instalează și se configurează GoCD pe CentOS 7

Cum se instalează și se configurează GoCD pe CentOS 7

Folosind un sistem diferit? GoCD este un sistem de livrare și automatizare continuă a surselor deschise. Vă permite să modelați fluxuri de lucru complexe folosind paralelul său

Cum se instalează Jenkins pe CentOS 7

Cum se instalează Jenkins pe CentOS 7

Jenkins este un instrument popular de sursă deschisă (integrare continuă), care este utilizat pe scară largă pentru dezvoltarea proiectului, implementare și automatizare. Acest articol wil

Cum se instalează Drone CI pe Ubuntu 18.04

Cum se instalează Drone CI pe Ubuntu 18.04

Introducere Drone este o platformă automatizată, continuă de testare și livrare, care rulează pe propria infrastructură. Drone acceptă orice limbă, serviciu

Echipamente de încărcare Vultr

Echipamente de încărcare Vultr

Ce este un echilibru de încărcare Balanții de încărcare stau în fața aplicației și distribuie traficul primit pe mai multe instanțe ale aplicației. Fo

Utilizarea SaltStack cu stâlpii de pe Ubuntu 17.04

Utilizarea SaltStack cu stâlpii de pe Ubuntu 17.04

În timp ce SaltStack este un instrument excelent pentru a rula operațiuni pe mai multe servere simultan, acesta acceptă și presetări de configurare definite per gazdă stocate într-un

Cum se instalează și se configura Ansible pe CentOS 7 pentru utilizare cu Windows Server

Cum se instalează și se configura Ansible pe CentOS 7 pentru utilizare cu Windows Server

Folosind un sistem diferit? Ansible este un instrument open source pentru automatizarea sarcinilor. Gestionează configurația serverelor Linux și Windows. Functioneaza

Cum se instalează CD-ul Strider pe Ubuntu 18.04

Cum se instalează CD-ul Strider pe Ubuntu 18.04

Introducere Strider CD este o platformă de implementare continuă a surselor deschise. Aplicația este scrisă în Node.js și folosește MongoDB ca backend de stocare. Pas

Cum se instalează SaltStack pe CentOS 7

Cum se instalează SaltStack pe CentOS 7

SaltStack, sau Salt, este o soluție populară de gestionare a configurației open source, care poate fi folosită pentru a implementa execuția de la distanță, gestionarea configurației, codul

Cum se instalează și se configura Ansible pe Debian 9 pentru utilizare cu Windows Server

Cum se instalează și se configura Ansible pe Debian 9 pentru utilizare cu Windows Server

Folosind un sistem diferit? Ansible este un instrument open source pentru automatizarea sarcinilor. Gestionează configurația serverelor Linux și Windows. Functioneaza

Crearea instantaneelor ​​cu Packer

Crearea instantaneelor ​​cu Packer

Ce este Packer? Packer este un instrument de imagini pe server dezvoltat de HashiCorp. Imagistica server; sau, alternativ, infrastructură imuabilă; este un alternativ popular

Utilizarea Managerului de pachete Chocolatey pe Windows

Utilizarea Managerului de pachete Chocolatey pe Windows

Introducere Chocolatey aduce managementul pachetelor care facilitează administrarea software-ului și a dependențelor pe Linux, la Windows. Puteți rapid și ușura

Cum se instalează Foreman pe CentOS 7

Cum se instalează Foreman pe CentOS 7

Folosind un sistem diferit? Foreman este un instrument gratuit și open source care vă ajută la configurarea și gestionarea serverelor fizice și virtuale. Forema

Cum se instalează Foreman pe Ubuntu 16.04 LTS

Cum se instalează Foreman pe Ubuntu 16.04 LTS

Folosind un sistem diferit? Foreman este un instrument gratuit și open source care vă ajută la configurarea și gestionarea serverelor fizice și virtuale. Forema

Cum se instalează și se configurează CI-ul Concourse pe CentOS 7

Cum se instalează și se configurează CI-ul Concourse pe CentOS 7

Folosind un sistem diferit? Introducere Integrarea continuă este o practică de dezvoltare a software-ului DevOps care permite dezvoltatorilor să se unească frecvent cu cel de-al treilea

Cum se instalează și se configurează Concourse CI pe Ubuntu 16.04

Cum se instalează și se configurează Concourse CI pe Ubuntu 16.04

Folosind un sistem diferit? Introducere Integrarea continuă este o practică de dezvoltare a software-ului DevOps care permite dezvoltatorilor să se unească frecvent cu cel de-al treilea

O perspectivă asupra a 26 de tehnici de analiză a datelor mari: partea 1

O perspectivă asupra a 26 de tehnici de analiză a datelor mari: partea 1

O perspectivă asupra a 26 de tehnici de analiză a datelor mari: partea 1

6 lucruri extrem de nebunești despre Nintendo Switch

6 lucruri extrem de nebunești despre Nintendo Switch

Mulți dintre voi cunoașteți Switch care va fi lansat în martie 2017 și noile sale funcții. Pentru cei care nu știu, am pregătit o listă de funcții care fac din „Switch” un „gadget obligatoriu”.

Promisiuni tehnologice care sunt încă nelivrate

Promisiuni tehnologice care sunt încă nelivrate

Aștepți ca giganții tehnologiei să-și îndeplinească promisiunile? vezi ce a ramas nelivrat.

Funcționalitățile straturilor arhitecturii de referință pentru Big Data

Funcționalitățile straturilor arhitecturii de referință pentru Big Data

Citiți blogul pentru a cunoaște diferitele straturi din Arhitectura Big Data și funcționalitățile acestora în cel mai simplu mod.

Cum poate AI să ducă automatizarea proceselor la următorul nivel?

Cum poate AI să ducă automatizarea proceselor la următorul nivel?

Citiți asta pentru a afla cum devine populară inteligența artificială în rândul companiilor la scară mică și cum crește probabilitățile de a le face să crească și de a le oferi concurenților avantaje.

CAPTCHA: Cât timp poate rămâne o tehnică viabilă pentru distincția uman-AI?

CAPTCHA: Cât timp poate rămâne o tehnică viabilă pentru distincția uman-AI?

CAPTCHA a devenit destul de dificil de rezolvat pentru utilizatori în ultimii ani. Va fi capabil să rămână eficient în detectarea spam-ului și a botului în viitor?

Singularitatea tehnologică: un viitor îndepărtat al civilizației umane?

Singularitatea tehnologică: un viitor îndepărtat al civilizației umane?

Pe măsură ce Știința Evoluează într-un ritm rapid, preluând multe dintre eforturile noastre, crește și riscurile de a ne supune unei Singularități inexplicabile. Citiți, ce ar putea însemna singularitatea pentru noi.

Telemedicină și îngrijire medicală la distanță: viitorul este aici

Telemedicină și îngrijire medicală la distanță: viitorul este aici

Ce este telemedicina, îngrijirea medicală la distanță și impactul acesteia asupra generației viitoare? Este un loc bun sau nu în situația de pandemie? Citiți blogul pentru a găsi o vedere!

Te-ai întrebat vreodată cum câștigă hackerii bani?

Te-ai întrebat vreodată cum câștigă hackerii bani?

Poate ați auzit că hackerii câștigă mulți bani, dar v-ați întrebat vreodată cum câștigă acești bani? sa discutam.

Actualizarea suplimentului macOS Catalina 10.15.4 cauzează mai multe probleme decât rezolvă

Actualizarea suplimentului macOS Catalina 10.15.4 cauzează mai multe probleme decât rezolvă

Recent, Apple a lansat macOS Catalina 10.15.4 o actualizare suplimentară pentru a remedia problemele, dar se pare că actualizarea provoacă mai multe probleme care duc la blocarea mașinilor Mac. Citiți acest articol pentru a afla mai multe