Slide 1

Slide 1 text

Salt Formulas and States Forrest Alvarez

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

Formulas are the evolution of Salt states, they are the future of Salt.

Slide 4

Slide 4 text

Salt States Core of Salt Range from basic to very complex Used for provisioning and deployment

Slide 5

Slide 5 text

States Refresher Syntax is fairly simple Modular focus Ease of use

Slide 6

Slide 6 text

Example State nginx: pkg: - installed service: - running - enable: True - reload: True

Slide 7

Slide 7 text

State Directory Structure /srv/salt/nginx/init.sls - Installs and starts service /srv/salt/mysql/client.sls - installs client /srv/salt/mysql/server.sls - installs the server and starts the service

Slide 8

Slide 8 text

Salt States Can Become Complex apache: pkg: - installed {% if grains[‘os_family’] == ‘RedHat’ %} - name: httpd {% elif grains[‘os_family’] == ‘Debian’ %} - name: apache2 {% endif %}

Slide 9

Slide 9 text

Pillar Exploitation OS variables that shouldn’t be in pillar are Pillar becomes bloated Harder to understand for new users

Slide 10

Slide 10 text

Combine pillar and state complexity

Slide 11

Slide 11 text

Complexity leads to problems Different operating systems Multiple locations in a state Several states require changes

Slide 12

Slide 12 text

How Do We Address This? Ease of use Simple to modify multiple locations Can be applied to existing configurations

Slide 13

Slide 13 text

Salt Formulas Evolution of the Salt states Easy to write because you already are Somewhat difficult to understand how they work

Slide 14

Slide 14 text

Formula Directory Structure /srv/salt/apache/init.sls /srv/salt/apache/conf.sls /srv/salt/apache/map.jinja

Slide 15

Slide 15 text

The Core of Formulas, map.jinja Sets data based on OS grains Merges with Pillar data Centralizes variables

Slide 16

Slide 16 text

Creating The Map {% set apache = salt[‘grains.filter_by’]({ ‘Debian’: { ‘server’: ‘apache2’, ‘service’: ‘apache2’, ‘conf’: ‘/etc/apache2/apache.conf’, }, ‘RedHat’: { ‘server’: ‘httpd’, ‘service’: ‘httpd’, ‘conf’: ‘/etc/httpd/httpd.conf’, }, }, merge=salt[‘pillar.get’](‘apache:lookup’)) %}

Slide 17

Slide 17 text

Using Maps in States {% from “apache/map.jinja” import apache with context %} apache: pkg: - installed - name: {{ apache.server }} service: - running - name: {{ apache.service }} - enable: True

Slide 18

Slide 18 text

Before apache: pkg: - installed {% if grains[‘os_family’] == ‘RedHat’ %} - name: httpd {% elif grains[‘os_family’] == ‘Debian’ %} - name: apache2 {% endif %} service: - running {% if grains[‘os_family’] == ‘RedHat’ %} - name: httpd {% elif grains[‘os_family’] == ‘Debian’ %} - name: apache2 {% endif %} - enable: True

Slide 19

Slide 19 text

After {% from “apache/map.jinja” import apache with context %} apache: pkg: - installed - name: {{ apache.server }} service: - running - name: {{ apache.service }} - enable: True

Slide 20

Slide 20 text

A Few Seconds After That

Slide 21

Slide 21 text

More Maps in States {% from “apache/map.jinja” import apache with context %} include: - apache apache_conf: file: - managed - name: {{ apache.conf }} - source: {{ salt[‘pillar.get’](‘apache:lookup:config:tmpl’) }} # Notice this variable doesn’t live in our map - template: jinja - user: root - group: root - mode: ‘0644’ - watch_in: - service: apache

Slide 22

Slide 22 text

Pillars Splitting pillar data Identifying it with sets of states Will all be combined in the end

Slide 23

Slide 23 text

Pillar Directory Structure /srv/pillar/top.sls /srv/pillar/apache.sls /srv/pillar/php.sls

Slide 24

Slide 24 text

The Pillar Top.sls base: ‘*’: - apache - php

Slide 25

Slide 25 text

Extending Your Pillar apache: lookup: config: tmpl: salt://apache/files/redhat/httpd.conf

Slide 26

Slide 26 text

Merging Maps With Pillars Multiple pillars further reduce complexity Easy to include several pillars in your top pillar Pillar variables can overwrite map

Slide 27

Slide 27 text

Overwriting Maps apache: lookup: config: tmpl: salt://apache/files/redhat/ server: my_custom_apache

Slide 28

Slide 28 text

Clear Location of Variables Where did I miss that conf name change? Did I make sure to update all my requires? Hey, could you modify this value?

Slide 29

Slide 29 text

The Simpler the Better Works great even if you only have a single OS Easy to hand off Fewer files to manage

Slide 30

Slide 30 text

No content

Slide 31

Slide 31 text

Managing Formulas Directory structure is the same as always One map file per formula Pillars are just included in your top pillar

Slide 32

Slide 32 text

Creating a Formula map.jinja Example Pillar Modular structure

Slide 33

Slide 33 text

Writing Formulas Effectively Think about what is OS based Consider what might need to be expanded Look at how someone else would see your formula

Slide 34

Slide 34 text

Premade Salt Formulas Over 75 formulas publicly available Not all formulas require the map Fork it with GIT and modify as needed

Slide 35

Slide 35 text

Contributing Back Fork an existing repo Ask for a repo to be made Contact the members

Slide 36

Slide 36 text

IRC: forrest Twitter: failvarez GitHub: gravyboat Questions?

Slide 37

Slide 37 text

Sources XKCD: Kayak comic - http://xkcd.com/209/ Easy button - http://dealer-communications.com/wp-content/uploads/2014/01/easy_button.png Bad cabling - http://farm3.staticflickr.com/2353/2219131561_31feee1745.jpg Earl of Lemongrab - http://fc03.deviantart.net/fs70/i/2013/108/e/3/lemongrab_by_twillis-d6266g9.png Dat Map - http://cdn.memegenerator.net/instances/500x/43904408.jpg Bruce Lee - http://www.elliottcaras.com/wp-content/uploads/2013/11/Bruce-Lee-Simplicity-is-the-key-2-brilliance.jpg Structure of Salt - http://upload.wikimedia.org/wikipedia/commons/2/29/NaCl.png Github OctoCat - http://www.iconsdb.com/icons/download/black/github-10-512.png