- Marin Crnković
- 10+ years of experience
- work @ web.burza
About me
Problem
- shared development server
- two (or more!) guys working on same file
- first guy to save loses his changes
Solution
- local development environment
- light, throwaway VMs using Vagrant
- configure VM for each project
Provisioning
- ssh into the box
- run a couple of commands
- edit a couple of files
- run some more commands
- edit some more files
- edit some commands
- run some files
big players
- Puppet
- Chef
- Ansible
- SaltStack
Saltstack
- Master
- Minion
- Execution modules
- State modules
- Pillars
- Grains
...phew
Master
- keeps states, pillars and top files
- talks to minions via ZeroMQ, SSH or RAET
Minions
- provide data about themselves (Grains)
- listen for commands from Master
- run execution modules
Top file
- describes environments
- defines set of states per minion
- pillars have a top file too
# /srv/salt/top.sls
base:
'*':
- default
'db*':
- mariaDB
development:
'app*':
- mailcatcher
production:
'app*':
- smtp
State
- describes state
# Short notation
apache2:
pkg.installed
# Verbose
install_apache:
pkg:
- installed
- name: apache2
Pillars
- set of variables for state configuration
- have own top file
Grains
- minion environment information
- OS, disk, RAM, CPU, GPU, ...
- write your own
- Config files are YAML
- ...that are written in Jinja templating language
- ...and Jinja == Twig
- Option to use JSON, python, python DSL, pyobjects and more
- XML is NOT supported. Go, SaltStack!
configuration
# /srv/salt/top.sls
base:
'*':
- apache
Top file
Basic example
# /srv/salt/apache.sls OR /srv/salt/apache/init.sls
apache:
pkg.installed:
- name: apache2
State configuration
# /srv/pillar/top.sls
base:
'os:Debian':
- match: grain
- debian_packages
'os:RedHat':
- match: grain
- redhat_packages
Pillar top file
Pillars and grains
# /srv/salt/apache.sls
apache:
pkg.installed:
- name: {{ pillar['pkgs']['apache'] }}
State configuration
# /srv/pillar/debian_packages.sls
pkgs:
apache: apache2
# /srv/pillar/redhat_packages.sls
pkgs:
apache: httpd
Pillars configuration
# /srv/salt/top.sls
base:
'*':
- website
Top file
Including and Extending
# /srv/salt/website/init.sls
include:
- apache.install
extend:
apache:
service:
- running
- enable: True
Website
# /srv/salt/apache/install.sls
apache:
pkg.installed:
- name: {{ salt['pillar.get']('pkgs:apache', 'apache2') }}
Apache
# /srv/salt/nginx/init.sls
nginx:
pkgrepo:
- managed
- name: deb http://nginx.org/packages/ubuntu/ trusty nginx
- key_url: http://nginx.org/keys/nginx_signing.key
Package repository
Nginx example
service:
- running
- watch:
- pkg: nginx
- file: /etc/nginx/nginx.conf
Configure service
pkg:
- installed
- require:
- pkgrepo: nginx
Install package
/etc/nginx/nginx.conf:
file:
- managed
# /srv/salt/nginx/nginx.conf.jinja
- source: salt://nginx/nginx.conf.jinja
- user: root
- group: root
- mode: 644
- template: jinja
Manage file
# /srv/salt/nginx/nginx.conf.jinja
user www-data;
worker_processes {{ 2 * grains['num_cpus'] }};
pid /run/nginx.pid;
Managed file template
Nginx example Continued
master $ salt '*' state.highstate
masterless-minion $ salt-call --local state.highstate
- Installing and configuring packages is easy
- So is starting and stopping services
- And executing commands on remote servers
- It is also possible to deploy servers in all major
cloud providers (AWS, Linode, DigitalOcean, Rackspace, ...)
Conclusion
- Configuration is a bunch of files
- Version them to roll back server to previous state
- Or fork the server
https://github.com/saltstack-formulas
Conclusion
- saltstack.com
- http://docs.saltstack.com/en/latest/index.html
- https://github.com/saltstack/salt-bootstrap
Thank you
Marin Crnković
@anorgan
https://joind.in/13779
Q/A
SaltStack
By Marin Crnković
SaltStack
- 3,101