Slide 1

Slide 1 text

Getting Started with Salt.

Slide 2

Slide 2 text

Peter Baumgartner Founder of Lincoln Loop

Slide 3

Slide 3 text

What is SaltStack?

Slide 4

Slide 4 text

“SaltStack delivers a dynamic infrastructure communication bus used for orchestration, remote execution, configuration management and much more.”

Slide 5

Slide 5 text

SaltStack is: Configuration Management

Slide 6

Slide 6 text

Configuration Management

Slide 7

Slide 7 text

Before Configuration Management root@server:~# ls /etc/nginx/nginx* /etc/nginx/nginx.conf

Slide 8

Slide 8 text

Before Configuration Management root@server:~# ls /etc/nginx/nginx* /etc/nginx/nginx.conf /etc/nginx/nginx.conf.OLD

Slide 9

Slide 9 text

Before Configuration Management root@server:~# ls /etc/nginx/nginx* /etc/nginx/nginx.conf /etc/nginx/nginx.conf.OLD /etc/nginx/nginx.conf.BAK

Slide 10

Slide 10 text

Before Configuration Management root@server:~# ls /etc/nginx/nginx* /etc/nginx/nginx.conf /etc/nginx/nginx.conf.OLD /etc/nginx/nginx.conf.BAK /etc/nginx/nginx.conf.20130617.bak

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

After Configuration Management

Slide 13

Slide 13 text

Getting Started with Salt. Version control your servers Self-documenting Repeatable Reusable Benefits

Slide 14

Slide 14 text

SaltStack is: Remote Execution

Slide 15

Slide 15 text

Remote Execution Run command(s) against remote server(s) ! e.g. Fabric, Capistrano, Func

Slide 16

Slide 16 text

Remote Execution Examples Deploy your code Run one-off scripts Critical package updates System monitoring

Slide 17

Slide 17 text

Why Choose SaltStack?

Slide 18

Slide 18 text

Familiar Tools Python YAML Jinja2

Slide 19

Slide 19 text

Community Great Documentation (>800 pages) ! Insanely responsive (IRC, GitHub) ! Backed by for-profit org

Slide 20

Slide 20 text

Why Choose SaltStack?

Slide 21

Slide 21 text

Why Not Choose SaltStack?

Slide 22

Slide 22 text

Caution Young Project Moves Fast Not SSH 
 (SSH support is “alpha”)

Slide 23

Slide 23 text

Let’s Learn Salt!

Slide 24

Slide 24 text

First... a vocabulary lesson

Slide 25

Slide 25 text

Everything is Terrible Chef: knife, recipe, cookbook Puppet: terminus, metaparameters Ansible: playbook, inventory

Slide 26

Slide 26 text

Everything is Terrible Chef: knife, recipe, cookbook Puppet: terminus, metaparameters Ansible: playbook, inventory ! Salt might be the worst offender…

Slide 27

Slide 27 text

Mas•ter ˈmastər (noun) Server that manages the whole stack (auth, states, pillars)

Slide 28

Slide 28 text

Min•ion ˈminyən (noun) A server controlled by the master

Slide 29

Slide 29 text

State stāt (noun) A declarative representation of system state
 (how you want the minion configured)

Slide 30

Slide 30 text

Grain grān (noun) Static information about a minion (RAM, CPUs, OS, etc.)

Slide 31

Slide 31 text

Pil•lar ˈpilər (noun) Variables for one or more minions 
 (ports, file paths, configuration parameters)

Slide 32

Slide 32 text

No content

Slide 33

Slide 33 text

Top File täp fīl (noun) Matches states or pillars to minions

Slide 34

Slide 34 text

High•state hīstāt (noun) All the state data for a minion

Slide 35

Slide 35 text

No content

Slide 36

Slide 36 text

Let’s Really Get Started

Slide 37

Slide 37 text

Installation Options Binaries for most distros Pip install (for bleeding edge) http://bootstrap.saltstack.org
 (it probably does what you want)

Slide 38

Slide 38 text

Master Server root@master:~# apt-get install salt-master ...or run master-less

Slide 39

Slide 39 text

Minion # apt-get install salt-minion # echo "salt 10.10.1.1" >> /etc/hosts # salt-key -a minion.lincolnloop.com Accept the minion key on the master Point minion to the master

Slide 40

Slide 40 text

Write Your First State

Slide 41

Slide 41 text

Install a Package nginx: pkg.installed /srv/salt/mystate.sls

Slide 42

Slide 42 text

Create your Top File

Slide 43

Slide 43 text

base: myserver: - mystate /srv/salt/top.sls 
 The Top File

Slide 44

Slide 44 text

Highstate!

Slide 45

Slide 45 text

# salt 'myserver' state.highstate # salt-call state.highstate ...or pull from the minion Push from the master Highstate ...or master-less # salt-call state.highstate --local

Slide 46

Slide 46 text

[INFO ] Loading fresh modules for state activity [INFO ] Running state [nginx] at time 13:12:03.314726 [INFO ] Executing state pkg.installed for nginx [INFO ] Executing command "dpkg-query --showformat='${Status} ${Package} $ {Version} ${Architecture}\n' -W" in directory '/home/pete' [INFO ] Executing command 'grep-available -F Provides -s Package,Provides -e "^.+ $"' in directory '/home/pete' [INFO ] Executing command 'apt-get -q update' in directory '/home/pete' [INFO ] Executing command ['apt-get', '-q', '-y', '-o', 'DPkg::Options::=--force- confold', '-o', 'DPkg::Options::=--force-confdef', 'install', 'nginx'] in directory '/home/pete' [INFO ] Executing command "dpkg-query --showformat='${Status} ${Package} $ {Version} ${Architecture}\n' -W" in directory '/home/pete' [INFO ] In stalled Packages: libgd3 changed from absent to 2.1.0-2 libxpm4 changed from absent to 1:3.5.10-1 ttf-dejavu-core changed from absent to 2.33+svn2514-3ubuntu1 nginx-common changed from absent to 1.4.1-3ubuntu1.3 libvpx1 changed from absent to 1.2.0-2 fonts-dejavu-core changed from absent to 2.33+svn2514-3ubuntu1 nginx-full changed from absent to 1.4.1-3ubuntu1.3 fontconfig-config changed from absent to 2.10.93-0ubuntu1 libxslt1.1 changed from absent to 1.1.28-2 libtiff5 changed from absent to 4.0.2-4ubuntu3 libjpeg-turbo8 changed from absent to 1.3.0-0ubuntu1.1 libjbig0 changed from absent to 2.0-2ubuntu1 nginx changed from absent to 1.4.1-3ubuntu1.3 libjpeg8 changed from absent to 8c-2ubuntu8 libfontconfig1 changed from absent to 2.10.93-0ubuntu1 ! [INFO ] Loading fresh modules for state activity [INFO ] Completed state [nginx] at time 13:13:32.491024

Slide 47

Slide 47 text

local: ---------- ID: nginx Function: pkg.installed Result: True Comment: The following packages were installed/updated: nginx. Changes: ---------- fontconfig-config: ---------- new: 2.10.93-0ubuntu1 old: fonts-dejavu-core: ---------- new: 2.33+svn2514-3ubuntu1 old: libfontconfig1: ---------- new: 2.10.93-0ubuntu1 old: libgd3: ---------- new: 2.1.0-2 old: libjbig0: ---------- new: 2.0-2ubuntu1 old:

Slide 48

Slide 48 text

libjpeg-turbo8: ---------- new: 1.3.0-0ubuntu1.1 old: libjpeg8: ---------- new: 8c-2ubuntu8 old: libtiff5: ---------- new: 4.0.2-4ubuntu3 old: libvpx1: ---------- new: 1.2.0-2 old: libxpm4: ---------- new: 1:3.5.10-1 old: libxslt1.1: ---------- new: 1.1.28-2 old:

Slide 49

Slide 49 text

nginx: ---------- new: 1.4.1-3ubuntu1.3 old: nginx-common: ---------- new: 1.4.1-3ubuntu1.3 old: nginx-full: ---------- new: 1.4.1-3ubuntu1.3 old: ttf-dejavu-core: ---------- new: 2.33+svn2514-3ubuntu1 old: ! Summary ------------ Succeeded: 1 Failed: 0 ------------ Total: 1

Slide 50

Slide 50 text

No content

Slide 51

Slide 51 text

No content

Slide 52

Slide 52 text

Leveling Up Your States

Slide 53

Slide 53 text

Create a User pete: user.present: - shell: /bin/bash - home: /home/pete - groups: - sudo

Slide 54

Slide 54 text

Add an SSH Key pete: user.present: - shell: /bin/bash - home: /home/pete - groups: - sudo ssh_auth.present: - user: pete - source: salt://pete.pub - require: - user: pete

Slide 55

Slide 55 text

Checkout a Repo [email protected]/ipmb/mysite.git: git.latest: - rev: develop - target: /usr/local/src/mysite - require: - pkg: git-core

Slide 56

Slide 56 text

Run Arbitrary Commands python manage.py syncdb --noinput: cmd.run: - cwd: /usr/local/src/mysite - require: - git: [email protected]/ipmb/mysite.git

Slide 57

Slide 57 text

Built-in States Over 50 built-in pip, virtualenv mysql, postgres services, files, cron ...or build your own (in Python)

Slide 58

Slide 58 text

Using Pillars

Slide 59

Slide 59 text

Pil•lar ˈpilər (noun) Variables for one or more minions 
 (ports, file paths, configuration parameters)

Slide 60

Slide 60 text

mysite: - branch: develop /srv/pillar/mysite.sls Example Pillar

Slide 61

Slide 61 text

base: 'myserver': - mysite /srv/pillar/top.sls Pillar Top File

Slide 62

Slide 62 text

base: '*': - default '*.lincolnloop.com': - lincoln_loop 'os:Ubuntu': - match: grain - pkgs.ubuntu /srv/pillar/top.sls Advanced Pillar Top File

Slide 63

Slide 63 text

[email protected]/ipmb/mysite.git: git.latest: - rev: {{ pillar.mysite.branch }} - target: /usr/local/src/mysite - require: - pkg: git-core Adding Pillars to a State

Slide 64

Slide 64 text

[email protected]/ipmb/mysite.git: git.latest: - rev: {{ pillar.mysite.get('branch', 'master') }} - target: /usr/local/src/mysite - require: - pkg: git-core Setting a Default

Slide 65

Slide 65 text

redis_maxmemory: {{ (grains.mem_total * 0.5)|int }}mb Using Grains in a Pillar

Slide 66

Slide 66 text

/etc/redis.conf: file.managed: - template: jinja - source: salt://redis_server/redis.conf.jinja - defaults: maxmemory: {{ pillar.redis_maxmemory }} Using Pillars in Files

Slide 67

Slide 67 text

daemonize yes pidfile /var/run/redis.pid port 6379 bind 127.0.0.1 maxmemory {{ maxmemory }} ... Using Pillars in Files /srv/salt/redis_server/redis.conf.jinja


Slide 68

Slide 68 text

Advanced Topics Salt-cloud Custom Modules Scheduler Renderers Returners Reactor

Slide 69

Slide 69 text

Tips & Tricks

Slide 70

Slide 70 text

Tips & Tricks output_mode: mixed

Slide 71

Slide 71 text

Tips & Tricks Jinja2 is powerful Don't go nuts

Slide 72

Slide 72 text

Tips & Tricks Update often ...and review the change log

Slide 73

Slide 73 text

Tips & Tricks Test before you deploy Make friends with Vagrant or Docker

Slide 74

Slide 74 text

Thank you! Questions? ! Peter Baumgartner http://lincolnloop.com @ipmb