Deploy a service#

As with other deployment tasks, do the setup tasks before (and the cleanup tasks after) 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-process' state.sls postgres,postgres.backup,kingfisher.collect.database,kingfisher.process.database

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/activate; pip-sync -q –pip-args “–exists-action w”

Requirements were installed

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

Django migrations were applied

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

Static files were collected

Function:, Name: . .ve/bin/activate; 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.