Drift/Salt: Difference between revisions

From Programvareverkstedet
(Made the setup instructions more elaborate now that more stuff about how we should set things up is known)
(Oppdatert dokumentasjon etter porting av rdist-treet til salt)
Line 6: Line 6:
<pre>
<pre>
ny-minion$ apt-get install salt-minion
ny-minion$ apt-get install salt-minion
ny-minion$ rediger /etc/salt/minion og legg til: "master: lommel.pvv.ntnu.no"
ny-minion$ rediger /etc/salt/grains og legg til gruppene maskinen er i, se dokumentasjonen for [[Drift/Salt#Grains|grains (grupper)]]
ny-minion$ rediger /etc/salt/grains og legg til gruppene maskinen er i, se dokumentasjonen for [[Drift/Salt#Grains|grains (grupper)]]
ny-minion$ service salt-minion restart
ny-minion$ service salt-minion restart
Line 17: Line 16:


Hvis alt har har gått bra, vil pingtesten gi true for maskinen din nå. Hvis ikke, kjør <code><nowiki>service salt-minion status</nowiki></code> som root på din nye minion for å få hint om hva som er galt. Konfigurasjonsfilen til salt ligger i <code><nowiki>/etc/salt/minion</nowiki></code>.
Hvis alt har har gått bra, vil pingtesten gi true for maskinen din nå. Hvis ikke, kjør <code><nowiki>service salt-minion status</nowiki></code> som root på din nye minion for å få hint om hva som er galt. Konfigurasjonsfilen til salt ligger i <code><nowiki>/etc/salt/minion</nowiki></code>.
Et kjent problem er at dns-oppsettet vårt ikke lar salt-minion finne salt-masteren vår med standardinnstillingene. Løsningen på dette er å legge til <code><nowiki>master: lommel</nowiki></code> i <code><nowiki>/etc/salt/minion</nowiki></code>.


I tilfellet man endrer hostname på en minion, gjør følgende for å få det oppdatert i salt: Stop salt-minion på den berørte maskinen. Slett nøkkelen til maskinen fra salt-master ved å kjøre <code><nowiki>salt-key -d minion_id</nowiki></code> på salt-masteren. Slett <code><nowiki>/etc/salt/minion/minion_id</nowiki></code>. Start salt-minion service-en. Autoriser den nye nøkkelen med det nye navnet i salt-master.
I tilfellet man endrer hostname på en minion, gjør følgende for å få det oppdatert i salt: Stop salt-minion på den berørte maskinen. Slett nøkkelen til maskinen fra salt-master ved å kjøre <code><nowiki>salt-key -d minion_id</nowiki></code> på salt-masteren. Slett <code><nowiki>/etc/salt/minion/minion_id</nowiki></code>. Start salt-minion service-en. Autoriser den nye nøkkelen med det nye navnet i salt-master.
Line 24: Line 21:
Husk å legge nyoppsatte maskiner til i riktige [[Drift/Salt#Grains|grains (grupper)]].
Husk å legge nyoppsatte maskiner til i riktige [[Drift/Salt#Grains|grains (grupper)]].


== Legge til nye filer ==
== Gjøre endringer ==
 
Endringer gjøres på salt-masteren (salt.pvv.ntnu.no, som for tiden peker på lommel.pvv.ntnu.no). Alle endringer gjøres som din personlige bruker.
 
=== Opprette bruker på salt-masteren ===
Om du ikke har en bruker, logg inn som root på serveren og lag en. Adduser vil spørre deg om «Current Kerberos password», men du kan bare trykke enter og si nei til å prøve igjen, så fungerer det fint.
 
<pre>
lommel ~ # adduser johndoe
Adding user `johndoe' ...
Adding new group `johndoe' (1000) ...
Adding new user `johndoe' (1000) with group `johndoe' ...
Current Kerberos password:
Current Kerberos password:
passwd: Authentication token manipulation error
passwd: password unchanged
Try again? [y/N] n
Changing the user information for johndoe
Enter the new value, or press ENTER for the default
Full Name []: John Doe
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n] n
</pre>


Salt sin autmagi fungerer best når filer ligger i <code><nowiki>/srv/salt/</nowiki></code> på master. For å spesifisere hvilken fil det er man har lyst til å bruke i kommandoer refferer til dem med <code><nowiki>salt://path/in/srv/salt</nowiki></code>.
Passordet du bruker vil være det samme som admin-principalen din i Kerberos har, altså johndoe/admin i eksempelet over. Om du ikke har en admin-principal, se [[Drift/Kerberos#Lage_admin-principal]].


=== Distribuere mapper ===
=== Gjøre endringer ===


Lag en overordnet mappe som inneholder både mappen du ønsker å distribuere og en sls-fil i salt-mappen: <code><nowiki>/srv/salt/overordnet_mappe</nowiki></code>. Der legger du mappen du ønsker å distribuere, og lager en fil du kaller for <code><nowiki>init.sls</nowiki></code>. Den formateres slik:
Når du logger inn første gang vil du automatisk få sjekket ut salt-treet i ~/salt. Gjør endringene dine der inne, og push master til origin for å aktivere endringene.


<pre><nowiki>
Det kan være lurt å teste med en maskin først, ved å logge inn den og gjøre en dry-run (du kan kjøre kommandoer rett fra salt-masteren også, men det er uansett en fordel å ha et skall på maskinen i tilfelle noe går galt):
/path/til/der/du/vil/at/mappen/skal/ende/opp//minions
file.recurse:
  - source: salt://overornet_mappe/mappen_du_vil_distribuere
#optional felter:
  - include_empty: True #sørger for at tomme undermapper kommer med
  - dir_mode: 777 #må bruke dir_mode når man dister mapper, bruk mode: hvis du dister filer
  - user: brukernavn #hilken bruker skal mappen, undermapper og filer tilhøre
  - group: eall_s #default-gruppen er root. Skal mappen tilhøre noen andre bruk eall_s eksplisitt
</nowiki></pre>


For å så få distribuert mappen kjør følgende kommando: <code><nowiki>salt '*' state.sls overordnet_mappe</nowiki></code>
<pre
salt-call state.highstate test=True
</pre>


== Grains ==
== Grains ==
Line 54: Line 69:


roles:
roles:
   - workstations
   - standard
   - typing_machine
   - desktop
</pre>
</pre>
I skrivende stund har vi følgende roller:
{|
|standard
|Alle maskiner med standard-oppsett (det vil si at brukere kan logge inn der)
|-
|file-server
|Filservere, som f.eks. microbel.
|-
| mysql-server
| Mysql-serveren
|-
| web-frontend
| Web-frontend (ikke den som hoster brukerenes hjemmesider)
|-
| web-homes
| Web-backend for brukeres hjemmesider
|-
| wiki
| Mediawiki-serveren
|-
| desktop
| Desktopmaskiner
|-
| pkgsync
| Maskinen bruker pkgsync for pakker
|-
| fwlogin
| Maskinen lytter på SSH på port 80 og 443
|-
|saltmaster
|salt-masteren (skal ikke ha standardoppsett)
|}


Når minions har blitt lagt til i roller er det viktig å huske på å synkronisere disse med masteren. Den letteste måten å gjøre det på er å kjøre <code><nowiki>salt '*' saltutil.sync_grains</nowiki></code> fra salt-masteren.
Når minions har blitt lagt til i roller er det viktig å huske på å synkronisere disse med masteren. Den letteste måten å gjøre det på er å kjøre <code><nowiki>salt '*' saltutil.sync_grains</nowiki></code> fra salt-masteren.
Line 62: Line 111:
For å nå maskiner gjennom egendefinerte grains bruk <code><nowiki>salt -G 'attributt:verdi' kommando</nowiki></code>. Et eksempel er <code><nowiki>salt -G 'roles:workstation' test.ping</nowiki></code>.
For å nå maskiner gjennom egendefinerte grains bruk <code><nowiki>salt -G 'attributt:verdi' kommando</nowiki></code>. Et eksempel er <code><nowiki>salt -G 'roles:workstation' test.ping</nowiki></code>.


== States og håndheving ==
== Tekniske ting ==
 
Litt nyttig info om hvordan ting fungerer under panseret
 
=== Distribuere mapper ===
 
Lag en overordnet mappe som inneholder både mappen du ønsker å distribuere og en sls-fil i salt-mappen: <code><nowiki>/srv/salt/overordnet_mappe</nowiki></code>. Der legger du mappen du ønsker å distribuere, og lager en fil du kaller for <code><nowiki>init.sls</nowiki></code>. Den formateres slik:
 
<pre><nowiki>
/path/til/der/du/vil/at/mappen/skal/ende/opp/på/minions
file.recurse:
  - source: salt://overornet_mappe/mappen_du_vil_distribuere
#optional felter:
  - include_empty: True #sørger for at tomme undermapper kommer med
  - dir_mode: 777 #må bruke dir_mode når man dister mapper, bruk mode: hvis du dister filer
  - user: brukernavn #hilken bruker skal mappen, undermapper og filer tilhøre
  - group: eall_s #default-gruppen er root. Skal mappen tilhøre noen andre bruk eall_s eksplisitt
</nowiki></pre>
 
For å så få distribuert mappen kjør følgende kommando: <code><nowiki>salt '*' state.sls overordnet_mappe</nowiki></code>
 
=== States og håndheving ===


Salt oppererer med SLS filer (<b>S</b>a<b>L</b>t <b>S</b>tate) for å holde orden på reglene for distribusjon og hvordan disse skal håndheves. Legg SLS filene i <code><nowiki>/srv/salt/</nowiki></code>. En av de viktigste SLS filene er <code><nowiki>/srv/salt/top.sls</nowiki></code> da den spesifiserer hvilke SLS filer som skal anvendes på hvilke minions. (Alle sls-filene er på salt-master.)
Salt oppererer med SLS filer (<b>S</b>a<b>L</b>t <b>S</b>tate) for å holde orden på reglene for distribusjon og hvordan disse skal håndheves. Legg SLS filene i <code><nowiki>/srv/salt/</nowiki></code>. En av de viktigste SLS filene er <code><nowiki>/srv/salt/top.sls</nowiki></code> da den spesifiserer hvilke SLS filer som skal anvendes på hvilke minions. (Alle sls-filene er på salt-master.)

Revision as of 22:35, 4 October 2015

Salt er, som Drift/Puppet, et system for å distribuere filer og sørge for at maskiner har samme oppsett.

Sette opp ny salt minion

Installasjon

ny-minion$ apt-get install salt-minion
ny-minion$ rediger /etc/salt/grains og legg til gruppene maskinen er i, se dokumentasjonen for [[Drift/Salt#Grains|grains (grupper)]]
ny-minion$ service salt-minion restart
ny-minion$ ssh root@salt.pvv.ntnu.no
salt-master# salt-key -L
salt-master# salt-key -a hostname.pvv.ntnu.no
salt-master# salt hostname.pvv.ntnu.no saltutil.sync_grains
salt-master# salt hostname.pvv.ntnu.no state.sls minion_configuration

Hvis alt har har gått bra, vil pingtesten gi true for maskinen din nå. Hvis ikke, kjør service salt-minion status som root på din nye minion for å få hint om hva som er galt. Konfigurasjonsfilen til salt ligger i /etc/salt/minion.

I tilfellet man endrer hostname på en minion, gjør følgende for å få det oppdatert i salt: Stop salt-minion på den berørte maskinen. Slett nøkkelen til maskinen fra salt-master ved å kjøre salt-key -d minion_id på salt-masteren. Slett /etc/salt/minion/minion_id. Start salt-minion service-en. Autoriser den nye nøkkelen med det nye navnet i salt-master.

Husk å legge nyoppsatte maskiner til i riktige grains (grupper).

Gjøre endringer

Endringer gjøres på salt-masteren (salt.pvv.ntnu.no, som for tiden peker på lommel.pvv.ntnu.no). Alle endringer gjøres som din personlige bruker.

Opprette bruker på salt-masteren

Om du ikke har en bruker, logg inn som root på serveren og lag en. Adduser vil spørre deg om «Current Kerberos password», men du kan bare trykke enter og si nei til å prøve igjen, så fungerer det fint.

lommel ~ # adduser johndoe
Adding user `johndoe' ...
Adding new group `johndoe' (1000) ...
Adding new user `johndoe' (1000) with group `johndoe' ...
Current Kerberos password: 
Current Kerberos password: 
passwd: Authentication token manipulation error
passwd: password unchanged
Try again? [y/N] n
Changing the user information for johndoe
Enter the new value, or press ENTER for the default
	Full Name []: John Doe
	Room Number []: 
	Work Phone []: 
	Home Phone []: 
	Other []: 
Is the information correct? [Y/n] n

Passordet du bruker vil være det samme som admin-principalen din i Kerberos har, altså johndoe/admin i eksempelet over. Om du ikke har en admin-principal, se Drift/Kerberos#Lage_admin-principal.

Gjøre endringer

Når du logger inn første gang vil du automatisk få sjekket ut salt-treet i ~/salt. Gjør endringene dine der inne, og push master til origin for å aktivere endringene.

Det kan være lurt å teste med en maskin først, ved å logge inn på den og gjøre en dry-run (du kan kjøre kommandoer rett fra salt-masteren også, men det er uansett en fordel å ha et skall på maskinen i tilfelle noe går galt):


== Grains ==
Salt kan bruke grains for å gjøre noe på en gruppe med maskiner. <code>salt 'hostname*' grains.items</code> viser alle grains hostname er med i. For eksempel kan man si <code>salt -G 'os_familt:Debian' test.ping</code> for å pinge maskiner som er basert på Debian.

For å legge en minion til en gruppe gjør følgende på minion-en:

=== Konfigurasjon ===
<pre>$ vim /etc/salt/grains

roles:
  - standard
  - desktop

I skrivende stund har vi følgende roller:

standard Alle maskiner med standard-oppsett (det vil si at brukere kan logge inn der)
file-server Filservere, som f.eks. microbel.
mysql-server Mysql-serveren
web-frontend Web-frontend (ikke den som hoster brukerenes hjemmesider)
web-homes Web-backend for brukeres hjemmesider
wiki Mediawiki-serveren
desktop Desktopmaskiner
pkgsync Maskinen bruker pkgsync for pakker
fwlogin Maskinen lytter på SSH på port 80 og 443
saltmaster salt-masteren (skal ikke ha standardoppsett)

Når minions har blitt lagt til i roller er det viktig å huske på å synkronisere disse med masteren. Den letteste måten å gjøre det på er å kjøre salt '*' saltutil.sync_grains fra salt-masteren.

For å nå maskiner gjennom egendefinerte grains bruk salt -G 'attributt:verdi' kommando. Et eksempel er salt -G 'roles:workstation' test.ping.

Tekniske ting

Litt nyttig info om hvordan ting fungerer under panseret

Distribuere mapper

Lag en overordnet mappe som inneholder både mappen du ønsker å distribuere og en sls-fil i salt-mappen: /srv/salt/overordnet_mappe. Der legger du mappen du ønsker å distribuere, og lager en fil du kaller for init.sls. Den formateres slik:

/path/til/der/du/vil/at/mappen/skal/ende/opp/på/minions
 file.recurse:
  - source: salt://overornet_mappe/mappen_du_vil_distribuere
#optional felter:
  - include_empty: True #sørger for at tomme undermapper kommer med 
  - dir_mode: 777 #må bruke dir_mode når man dister mapper, bruk mode: hvis du dister filer
  - user: brukernavn #hilken bruker skal mappen, undermapper og filer tilhøre
  - group: eall_s #default-gruppen er root. Skal mappen tilhøre noen andre bruk eall_s eksplisitt

For å så få distribuert mappen kjør følgende kommando: salt '*' state.sls overordnet_mappe

States og håndheving

Salt oppererer med SLS filer (SaLt State) for å holde orden på reglene for distribusjon og hvordan disse skal håndheves. Legg SLS filene i /srv/salt/. En av de viktigste SLS filene er /srv/salt/top.sls da den spesifiserer hvilke SLS filer som skal anvendes på hvilke minions. (Alle sls-filene er på salt-master.)

For eksempel hvis vi har SLS filene:

/srv/salt/top.sls
/srv/salt/common/init.sls
/srv/salt/common/packages.sls
/srv/salt/sl_eksempel.sls

La så filene se slik ut:

#top.sls:
base:
  '*':
    - common
  'roles:desktop':
    - match: grain
    - sl_eksempel
#common/init.sls:
include:
  - common.packages
#common/packages.sls:
vim:
  pkg:
    - installed
grep:
  pkg:
    - installed
#sl_eksempel.sls:
sl:
  pkg:
    - installed

Hva filene sier:

  • top.sls sier at at alle maskiner skal få staten som er spesifisert i 'common'. Siden 'common' er en mappe og ikke en SLS fil vil det implisitt bety at staten som er gitt i common/init.sls brukes istedenfor.
    • Den sier også at alle maskiner som matcher grainen roles:desktop skal ha staten spesifisert i sl_eksempel.sls
  • common/init.sls starter med å ved includen si at alt som er i /srv/salt/common/packages også skal kjøres i tillegg til innholdet den har (som for dette eksempelet er ikke noe mer)
  • packages.sls sier at to pakker, vim og grep, skal være installert på alle maskiner som hører til staten.
  • sl_eksempel.sls sier at pakken sl skal være installert.

For at minionsene skal gå inn å sjekke hvilke states de skal ha, og anvende dem, kjør:
salt '*' state.highstate
på salt-master.

Sørg for at Salt-minion er kjørende og at den jevnlig poller om nye ting fra master

Lag en mappe /srv/salt/minion_configuration som inneholder en init.sls fil og en minion fil. La init.sls se slik ut:

salt-minion: # sier at det er salt-minion servicen vi påvirker
  service:
    # sier at den skal være kjørende:
    - running
    - enable: True
    # sier at servicen skal restartes om man merker en endring i den oppgitte filen:
    - watch:
      - file /etc/salt/minion
/etc/salt/minion: #sier at denne filen skal speile den oppgitte fra master
  file.managed:
    # filen som skal kopieres over til minionen
    - source salt://minion_configuration/minion
    # bruker, gruppe, og premissions for filen når den ender opp på minionen:
    - user: root
    - group: root
    - mode: 644
    # sier at filen er et jinjatemplate, og at variablene i templatet skal byttes ut
    # med verdiene gitt for dem i context-seksjonen:
    - template: jinja
    - context:
      saltmaster: lommel.pvv.ntnu.no
      timer: 4

Kopier så inn en minion-fil til /srv/salt/minion_configuration/minion, og legg til disse linjene:

#sett inn under "#master: salt" eller istedenfor det som måtte stå på på linjen som begynner med "master:"
master: {{saltmaster}}

#sier at highstate skal schedules til å kjøre hver 'timer' time:
schedule:
  highstate:
    function: state.highstate
    hours: {{ timer }}

Behandlig av errors og feilmeldinger som kan dukke opp ofte

Hvis du får feilen:
No matching sls found for 'sls_file_or_folder_name' in env 'base'
Så har du sannsynligvis skrevet filnavn.sls (må være uten .sls), eller mappenavnet feil.

Nyttige kommandoer og syntax

Viktig om syntax:

  • All indentering er med mellomrom da tabs ser ut til å krasje, to ser ut til å være standard

Hvordan kopiere enkeltfiler ad-hoc fra salt-master til minions:
salt-cp "*" /path/to/file/on/salt/master /path/to/file/on/minions

Hvordan kjøre kode på minions:
salt "*" cmd.run "ps -e | grep salt"

For å kjøre på enkeltmaskiner istedenfor alle eller grains skriv inn navnet istedenfor "*". Eksempel:
salt maskinnavn.pvv.ntnu.no cmd.run "ps -e | grep salt"

For å sjekke om en pakke er installer og hvilken versjon den har:
salt "*" pkg.version "grep"

For å installere eller oppgradere en pakke:
salt maskinnavn.pvv.ntnu.no pkg.install sl

For å avinstallere en pakke:
salt maskinnavn.pvv.ntnu.no pkg.remove sl

For å se salt-pkg kommandoer:
salt maskinnavn.pvv.ntnu.no pkg. og spam tab.