Chef-solo gebruiken om een ​​Django-app op Ubuntu te configureren

Er zijn veel manieren om het instellen en configureren van een box te automatiseren. Om welke reden dan ook, als ons hele systeem op dit moment uit slechts één enkele box bestaat, is het opzetten van een volledige SCM-infrastructuur (Software Configuration Management) overdreven. Shell-scripts zijn een optie, maar we kunnen ook een uitgeklede versie van SCM gebruiken die beschikbaar is in enkele van de tools die er zijn. Chef is een van de populaire opties en "chef-solo" is de stand-alone configuratiemodus van Chef, waarbij we geen extra knooppunt nodig hebben om op te treden als "chef-server". Het enige dat nodig is, is een URL of een pad naar een tarballpakket met kookboeken van chef-koks. Vergeleken met shell-scripts is dit type aanpak meer declaratief en efficiënter en is het ook een goede introductie om aan de slag te gaan met SCM's of IaC-processen (Infrastructure as Code).

Enkele andere voordelen van het gebruik van chef-solo:

  • Samenstelling: gebruik de gemeenschapskookboeken van de chefsupermarkt of andere plaatsen.
  • Gratis en open source; gelicentieerd onder de toegestane Apache 2.0-licentie.
  • Toegang tot de rest van het ecosysteem van de chef (InSpec, ChefSpec, Cookstyle, Foodcritic, chef-shell enz.)
  • De kookboeken en recepten kunnen later worden aangepast aan een client / server-modus.

En enkele nadelen:

  • Sommige gemeenschapskookboeken in de Chef-supermarkt zijn verouderd, kapot en worden niet onderhouden.
  • chef-solo kan afhankelijkheden niet alleen oplossen.

De 'recepten' in een 'kookboek' van een chef hebben een robijnrode DSL die 'middelen' beschrijft om zich in een bepaalde staat op een knooppunt te bevinden. Laten we doorgaan met een walkthrough om kennis te maken met een paar Chef-concepten die ook van toepassing zijn op chef-solo. Ons doel is om een ​​Ubuntu-knooppunt op te zetten met een Python / Django-webapp met Gunicorn en NGINX.

Opmerking: we hoeven ChefDK niet noodzakelijkerwijs te installeren op ons "Chef-werkstation" (onze machine), hoewel we hiermee 'chef-genereer'-opdrachten kunnen gebruiken om te beginnen met een directorystructuur voor het maken van kookboeken, recepten en meer. In dit artikel gaan we ervan uit dat ChefDK op ons werkstation is geïnstalleerd. Commando's zijn uitgevoerd met versie 4.7.26-1 van ChefDK.


(Vanaf dit punt moet alles, tenzij anders vermeld, worden uitgevoerd op onze machine, ook wel de 'Chef Workstation' genoemd)

Het kookboek maken

Kookboeken in chef zijn herbruikbare eenheden die alles bevatten wat nodig is om een ​​configuratiescenario te ondersteunen. Kookboeken kunnen meerdere 'recepten' bevatten en 'recepten' bestaan ​​meestal uit bronpatronen. default.rbis het standaardrecept dat wordt uitgevoerd wanneer naar het kookboek wordt verwezen in een uitvoeringslijst . Verschillende recepten maken het mogelijk om zorgen te scheiden. Voor deze zelfstudie voegen we echter alle bronverklaringen toe in één hoofdreceptbestand, namelijk de default.rb.

Maak een map met de naam "mijn-chef-project" en maak een map erin met de naam "kookboeken". Van ./my-chef-project/cookbooks/, voer:

$ chef generate cookbook my-cookbook

Onze mappenstructuur ziet er nu als volgt uit:

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

Pakketten toevoegen

De eerste stap bij het instellen van ons knooppunt is om te bepalen welke pakketten onze app nodig heeft. Ons knooppunt is geselecteerd als Ubuntu, dus we kunnen vertrouwen op de APT-pakketbeheerder om de afhankelijkheden te verzamelen. Het installeren van de pakketten die door de OS-distributie worden geleverd, is dan een fluitje van een cent:

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'

Deze spreken voor zich. De eerste regel werkt de apt-repository bij en de volgende regels installeren die pakketten.

Opmerking: de pakketten die 'nginx' volgen, zijn nodig voor het compileren van enkele van de python-afhankelijkheden via pip. Deze kunnen verschillen afhankelijk van uw python / django-projectafhankelijkheden gespecificeerd in requirements.txt. U kunt een methode van vallen en opstaan ​​gebruiken om te bepalen welke pakketten u in uw kookboek moet opnemen. Om dat te doen, voert u een handleiding uit sudo pip install -r requirements.txt(Opmerking: dit installeert pakketten in het hele systeem!) Op een nieuwe instant ubuntu-machine om te zien of deze succesvol werkt. Zo niet, dan zou de stderr u hints moeten geven over welke pakketten ontbreken.

Linux-gebruikers maken

Zodra we klaar zijn met het toevoegen van de vereiste pakketten, moeten we een niet-geprivilegieerde Linux-gebruiker maken die de broncode van de applicatie bezit.

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

Merk op dat het wachtwoord een schaduwhash-indeling is die wordt gebruikt in Linux. Het kan worden afgeleid met OpenSSL:

$ openssl passwd -1 -salt alilbitof mypassword

Inclusief de app-bron

Laten we nu de broncode van de Django-applicatie opnemen in ons kookboek. Plaats de broncode in ./my-chef-project/cookbooks/my-cookbook/files/default/myapp/ Maak de ./my-chef-project/cookbooks/my-cookbook/files/defaultmap aan als deze niet bestaat.

De instructie om deze bestanden naar een externe locatie op ons knooppunt te kopiëren, wordt beschreven met behulp van de remote_directory- bron:

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

De python-afhankelijkheden binnenhalen

Om de python-pakketten te installeren requirements.txt, kunnen we de execute- bron gebruiken om een ​​willekeurige opdracht uit te voeren. In dit geval moeten we de opdracht pip install erover uitvoeren:

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

Opmerking: houd er rekening mee dat dit zal worden uitgevoerd omdat de rootgebruiker en de python-bibliotheken voor het hele systeem zullen worden geïnstalleerd. Als ons knooppunt is aangewezen om uitsluitend deze enkele python-app uit te voeren, is dat geen probleem. Desondanks is een betere optie om dingen schoon en gezond te houden, het vinden en gebruiken van een community-kookboek dat python-installaties of 'virtualenvs' beheert. (of schrijf op zijn minst een reeks uitvoeringsblokken om dit te repliceren). Het gebruik van virtualenvs in python zorgt ervoor dat alle op python gebaseerde systeemtools of andere python-projecten niet worden beïnvloed

Gunicorn & NGINX opzetten

Nu is het tijd om de Gunicorn WSGI HTTP-server voor te bereiden met NGINX als onze reverse proxy. Nginx wordt ook gebruikt om alle statische activa van Django af te handelen.

Om Gunicorn als een service op Ubuntu vast te maken, kan Systemd worden gebruikt. De systemd_unit- bron is sinds versie 12.11 in Chef opgenomen.

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

Nu moeten we een standaard NGINX-proxyconfiguratie toevoegen aan deze Gunicorn-server, zoals hieronder wordt weergegeven. Dit fragment kan ingaan ./my-cookbook/templates/nginx.conf.erb. Maak de sjabloondirectory als deze niet bestaat.

Opmerking: de sjablonen van Chef ondersteunen ingesloten robijnrode bestanden die variabelen, robijnrode uitdrukkingen en verklaringen kunnen bevatten. Hoewel dit bestand de extensie 'erb' heeft, hebben we geen van de robijnrode verklaringen of uitdrukkingen gebruikt. Omwille van de eenvoud hebben we hier ook alleen een niet-HTTPS nginx-configuratie (vriendelijke herinnering; doe dit alsjeblieft niet in productie!)

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

Opmerking: er is ook een alternatief en een betere configuratie, waarbij bijvoorbeeld de Gunicorn-server is gebonden aan een unix-domeinsocket in plaats van een TCP-loopback-verbinding. Het is de moeite waard om dat om prestatieredenen te onderzoeken.

Gebruik de sjabloonbron van Chef om deze configuratie naar de map met sites op het knooppunt te kopiëren .

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

Het activeren van configs op nginx gebeurt normaal gesproken door een symlink te maken die verwijst naar de configuratie op sites-availablein de sites-enabledmap nginx . Symlinks kan worden verklaard in chef kookboeken met de koppeling resource zoals getoond hieronder:

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

en om de standaardconfiguratiesymlink te verwijderen:

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

NGINX starten

En tot slot, om nginx-service op te starten:

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

Runlists

Run-lijsten in chef zijn een geordende lijst van rollen of recepten in een kookboek die achtereenvolgens op het knooppunt worden uitgevoerd. We hebben één kookboek "mijn-kookboek" en het "standaard" recept dat we moeten uitvoeren op de Ubuntu-box, dus de runlist.json in onze projectdirectory ( ./my-chef-project/runlist.json) zou er als volgt uit moeten zien:

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

Laatste stappen

Ons kookboek voor Chef solo is klaar om geserveerd te worden. Het is tijd om een ​​Ubuntu 18.04-machine in te richten en ChefDK erop te installeren:

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

Gaan terug naar onze Chef werkstation , alles wat we moeten doen, is de kookboeken map in een tarball, overdracht die tarball, samen met de runlist.jsonhet knooppunt op afstand we hierboven bevoorraad en voer de chef-solo commando:

(Het onderstaande commando moet worden uitgevoerd binnen het knooppunt of de 'chef-client' en niet het chef-werkstation)

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

Of hier is een one-liner (uit te voeren vanaf ./my-chef-project/CWD op 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'

Dat is het! Kijk hoe de standaarduitvoer zich vult met Chef-activiteit die probeert uw knooppunt te convergeren naar wat u in de kookboeken hebt gespecificeerd. Chef-solo installeert alle edelstenen die nodig zijn voor alle kookboeken. Als het chef-solo-commando succesvol is, zullen we een werkende Django-applicatie hebben die achter nginx op de Ubuntu-box draait. Navigeer naar het domein / IP om het te testen.

Opmerking: onthoud dat je in django dit domein / ip mogelijk moet instellen in de ALLOWED_HOSTSlijst in settings.py.

Reageren op veranderingen

Telkens wanneer we een wijziging aanbrengen in de inhoud van onze projectdirectory (recepten, sjablonen of de broncode van de applicatie enz.), Voert u eenvoudig de bovenstaande one-liner uit vanuit de projectdirectory.

Tip: Als het kookboek versie-gestuurd is met git (zoals het hoort), is een goede aanbeveling om git hooks in te stellen om deze one-liner uit te voeren.

De tarball hosten (optioneel)

Als je goed kijkt naar het laatste chef-solo-commando, merk dan op dat het --recipe-urlbedoeld is om een ​​URL te nemen. Dit betekent dat u een workflow kunt hebben waarbij een CI uw chef-solo-tarball bouwt, deze ergens uploadt en uw knooppunt configureert om er periodiek uit te halen.

Tip: gebruik krul om de veranderde tarball periodiek als een cronjob te trekken. curl -z $filezal de If-Modified-Sincekopteksten respecteren en zal de tar-bal alleen downloaden als het externe bestand is gewijzigd sinds de tijdstempel op de bestaande lokale $file.



Leave a Comment

Kan AI vechten met toenemend aantal ransomware-aanvallen?

Kan AI vechten met toenemend aantal ransomware-aanvallen?

Ransomware-aanvallen nemen toe, maar kan AI helpen het nieuwste computervirus het hoofd te bieden? Is AI het antwoord? Lees hier weten is AI boezem of vloek

ReactOS: is dit de toekomst van Windows?

ReactOS: is dit de toekomst van Windows?

ReactOS, een open source en gratis besturingssysteem is hier met de nieuwste versie. Kan het voldoen aan de behoeften van moderne Windows-gebruikers en Microsoft uitschakelen? Laten we meer te weten komen over deze oude stijl, maar een nieuwere OS-ervaring.

Blijf verbonden via WhatsApp Desktop-app 24 * 7

Blijf verbonden via WhatsApp Desktop-app 24 * 7

WhatsApp heeft eindelijk de Desktop-app voor Mac- en Windows-gebruikers gelanceerd. Nu heb je eenvoudig toegang tot WhatsApp vanuit Windows of Mac. Beschikbaar voor Windows 8+ en Mac OS 10.9+

Hoe AI procesautomatisering naar een hoger niveau kan tillen?

Hoe AI procesautomatisering naar een hoger niveau kan tillen?

Lees dit om te weten hoe kunstmatige intelligentie populair wordt onder de kleinschalige bedrijven en hoe het de kansen vergroot om ze te laten groeien en hun concurrenten voorsprong te geven.

macOS Catalina 10.15.4 Supplement Update veroorzaakt meer problemen dan het oplost

macOS Catalina 10.15.4 Supplement Update veroorzaakt meer problemen dan het oplost

Onlangs heeft Apple macOS Catalina 10.15.4 uitgebracht, een aanvullende update om problemen op te lossen, maar het lijkt erop dat de update meer problemen veroorzaakt die ertoe leiden dat mac-machines worden gemetseld. Lees dit artikel voor meer informatie

13 Commerciële data-extractietools voor big data

13 Commerciële data-extractietools voor big data

13 Commerciële data-extractietools voor big data

Wat is een logboekbestandssysteem en hoe werkt het?

Wat is een logboekbestandssysteem en hoe werkt het?

Onze computer slaat alle gegevens op een georganiseerde manier op, het zogenaamde Journaling-bestandssysteem. Het is een efficiënte methode waarmee de computer bestanden kan zoeken en weergeven zodra u op zoeken drukt.https://wethegeek.com/?p=94116&preview=true

Technologische singulariteit: een verre toekomst van de menselijke beschaving?

Technologische singulariteit: een verre toekomst van de menselijke beschaving?

Naarmate de wetenschap zich snel ontwikkelt en veel van onze inspanningen overneemt, nemen ook de risico's toe om onszelf te onderwerpen aan een onverklaarbare singulariteit. Lees, wat singulariteit voor ons kan betekenen.

Een inzicht in 26 Big Data-analysetechnieken: deel 1

Een inzicht in 26 Big Data-analysetechnieken: deel 1

Een inzicht in 26 Big Data-analysetechnieken: deel 1

De impact van kunstmatige intelligentie in de gezondheidszorg 2021

De impact van kunstmatige intelligentie in de gezondheidszorg 2021

AI in de zorg heeft de afgelopen decennia grote sprongen gemaakt. De toekomst van AI in de gezondheidszorg groeit dus nog steeds met de dag.