Deploy a service

As with other deployment tasks, do the setup tasks before the steps below. If you run into trouble, read the Troubleshoot guide.

1. Run Salt function

To limit the output to changes and failures, add a --state-output=changes option to the commands below, for example:

./ --state-output=changes 'docs' state.apply

Deploy a service

Indicate the desired target and use the state.apply function, for example:

./ 'docs' state.apply

The state.apply function often completes within one minute. You can ignore this warning: DeprecationWarning: encoding is deprecated, Use raw=False instead.


If you want to check whether a deployment is simply slow (frequent) or actually stalled (rare), watch Salt’s activity.


To override Pillar data, use, for example:

./ 'mytarget-dev' state.apply pillar='{"python_apps":{"myapp":{"git":{"branch":"BRANCH_NAME"}}}}'

Deploy part of a service

To run a specific state file, run, for example:

./ 'docs' state.sls elasticsearch

To run a specific SLS ID, run, for example:

./ '*' state.sls_id root_authorized_keys core.sshd


The requirements of the state file or SLS ID must be met. For example, to only create a PostgreSQL user, run:

./ --state-output=changes 'kingfisher-main' state.sls postgres,postgres.backup

2. Check Salt output

Look for these lines at the end of the output in the primary terminal:

Summary for docs
Succeeded: ## (changed=#)
Failed:     0


  1. Check that the app is still responding in your web browser.

  2. If there are any failed states, look for each in the output (red text) (or search for Result: False) and debug.

  3. If there are any changed states, look for each in the output (blue text) (or grep for Changes:   \n[^\n-]) and verify the changes.

Common changed states are:

Function: service.running, ID: apache2

Apache was reloaded

For a Django app, common changed states are:

Function: git.latest

A new commit was deployed

Function:, Name: .ve/bin/pip-sync -q –pip-args “–exists-action w”

Requirements were installed

Function:, Name: .ve/bin/python migrate –settings … –noinput

Django migrations were applied

Function:, Name: .ve/bin/python collectstatic –settings … –noinput

Static files were collected

Function:, Name: .ve/bin/python compilemessages –settings … –

Message catalogs were compiled

Function: service.running, ID: uwsgi

uWSGI was reloaded

States that always report changes:

  •, unless onchanges is specified

  • pip.installed, if upgrade is set

  • postgres_privileges.present, if object_name is ALL

3. Manual cleanup

If you changed the server name of a virtual host that uses HTTPS, you will need to Acquire SSL certificates for the new server name.

If you removed a Salt configuration, follow the linked steps to cleanup manually.