Salt file.recurse source file not found (file encoding issue)

So I was running this:

    - clean: True
    - user: root
    - group: root
    - dir_mode: 755
    - file_mode: 644
    - source: salt://inst/mediawiki-1.29
    - require:
      - pkg: apache2

And getting an error like this:

          ID: /var/www/
    Function: file.recurse
      Result: False
     Comment: #### /var/www/ ####
              Source file 'salt://inst/mediawiki-1.29/vendor/james-heinrich/getid3/getid3/' not found

              #### /var/www/ ####
              Source file 'salt://inst/mediawiki-1.29/vendor/james-heinrich/getid3/getid3/' not found
     Started: 14:27:18.352264
    Duration: 134735.945 ms

The issue was that the source files mentioned weren’t in UTF-8 format. To convert the files I ran, e.g.:

$ iconv -f WINDOWS-1252 -t UTF-8//TRANSLIT < >

(Actually I couldn’t get the ‘iconv’ command to work so I edited manually in Vim)

Debugging JINJA in Salt Stack

So I was trying to figure out how to report the template source file within the template itself and I found myself wanting to know what was available in the JINJA globals for a Salt Stack JINJA template.

Turns out you use the show_full_context() function, like this:

Context is: {{ show_full_context() }}

You can parse the output to see what top-level items are available. In my case I found the ‘source’ setting for the JINJA template in use.

Hot tip: if you’re using Vim to inspect the show_full_context() output, try using ‘%’ or ‘]}’ to move between matching braces.

Bonus: while I was learning about reporting the JINJA context I discovered that you can call Salt functions from JINJA templates, like this:

# The following two function calls are equivalent.
{{ salt['']('whoami') }}
{{'whoami') }}