Salt Formulas and States Forrest Alvarez
Formulas are the evolution of Salt states, they are the future of
Salt.
Salt States
Core of Salt !Range from basic to very complex !Used for provisioning and deployment
States Refresher
Syntax is fairly simple !Modular focus !Ease of use
Example Statenginx: pkg: - installed service: - running - enable: True - reload: True
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
Salt States Can Become Complexapache: pkg: - installed {% if grains[‘os_family’] == ‘RedHat’ %} - name: httpd {% elif grains[‘os_family’] == ‘Debian’ %} - name: apache2 {% endif %}
Pillar ExploitationOS variables that shouldn’t be in pillar are !Pillar becomes bloated !Harder to understand for new users
Combine pillar and state complexity
Complexity leads to problemsDifferent operating systems !Multiple locations in a state !Several states require changes
How Do We Address This?Ease of use !Simple to modify multiple locations !Can be applied to existing configurations
Salt FormulasEvolution of the Salt states !Easy to write because you already are !Somewhat difficult to understand how they work
Formula Directory Structure/srv/salt/apache/init.sls !/srv/salt/apache/conf.sls !/srv/salt/apache/map.jinja !
The Core of Formulas, map.jinjaSets data based on OS grains !Merges with Pillar data !Centralizes variables !
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’)) %}
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
Beforeapache:
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
After{% from “apache/map.jinja” import apache with context %} !apache: pkg: - installed - name: {{ apache.server }} service: - running - name: {{ apache.service }} - enable: True
A Few Seconds After That
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
PillarsSplitting pillar data !Identifying it with sets of states Will all be combined in the end
Pillar Directory Structure/srv/pillar/top.sls !/srv/pillar/apache.sls !/srv/pillar/php.sls
The Pillar Top.slsbase: ‘*’: - apache - php
Extending Your Pillarapache: lookup: config: tmpl: salt://apache/files/redhat/httpd.conf
Merging Maps With PillarsMultiple pillars further reduce complexity !Easy to include several pillars in your top pillar !Pillar variables can overwrite map
Overwriting Maps
apache: lookup: config: tmpl: salt://apache/files/redhat/ server: my_custom_apache
Clear Location of VariablesWhere did I miss that conf name change? !Did I make sure to update all my requires? !Hey, could you modify this value?
The Simpler the BetterWorks great even if you only have a single OS !Easy to hand off !Fewer files to manage
Managing FormulasDirectory structure is the same as always !One map file per formula !Pillars are just included in your top pillar
Creating a Formulamap.jinja !Example Pillar !Modular structure
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
Premade Salt FormulasOver 75 formulas publicly available !Not all formulas require the map !Fork it with GIT and modify as needed
Contributing BackFork an existing repo !Ask for a repo to be made !Contact the members
IRC: forrest !Twitter: failvarez !GitHub: gravyboat
Questions?
SourcesXKCD: 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