<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://tech.uvoo.io/index.php?action=history&amp;feed=atom&amp;title=Salt_Cheat_Sheet</id>
	<title>Salt Cheat Sheet - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://tech.uvoo.io/index.php?action=history&amp;feed=atom&amp;title=Salt_Cheat_Sheet"/>
	<link rel="alternate" type="text/html" href="https://tech.uvoo.io/index.php?title=Salt_Cheat_Sheet&amp;action=history"/>
	<updated>2026-05-01T13:06:05Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.2</generator>
	<entry>
		<id>https://tech.uvoo.io/index.php?title=Salt_Cheat_Sheet&amp;diff=716&amp;oldid=prev</id>
		<title>Busk: Created page with &quot;- Shameless rip from  - https://sites.google.com/site/mrxpalmeiras/saltstack/salt-cheat-sheet  ``` Contents  1 BOOTSTRAP 2 SERVICES 3 TARGETING 4 KEY MANAGEMENT 5 SERVER DIAGN...&quot;</title>
		<link rel="alternate" type="text/html" href="https://tech.uvoo.io/index.php?title=Salt_Cheat_Sheet&amp;diff=716&amp;oldid=prev"/>
		<updated>2020-07-21T12:31:49Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;- Shameless rip from  - https://sites.google.com/site/mrxpalmeiras/saltstack/salt-cheat-sheet  ``` Contents  1 BOOTSTRAP 2 SERVICES 3 TARGETING 4 KEY MANAGEMENT 5 SERVER DIAGN...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;- Shameless rip from&lt;br /&gt;
 - https://sites.google.com/site/mrxpalmeiras/saltstack/salt-cheat-sheet&lt;br /&gt;
&lt;br /&gt;
```&lt;br /&gt;
Contents&lt;br /&gt;
&lt;br /&gt;
1 BOOTSTRAP&lt;br /&gt;
2 SERVICES&lt;br /&gt;
3 TARGETING&lt;br /&gt;
4 KEY MANAGEMENT&lt;br /&gt;
5 SERVER DIAGNOSTICS&lt;br /&gt;
6 GRAINS&lt;br /&gt;
7 MINE&lt;br /&gt;
8 PACKAGES AND INSTALLATION&lt;br /&gt;
9 JOBS AND PROCESS CONTROL&lt;br /&gt;
10 REACTOR&lt;br /&gt;
11 DEBUG&lt;br /&gt;
12 FILE OPERATIONS&lt;br /&gt;
13 USER AND GROUP MGMT&lt;br /&gt;
14 STATES&lt;br /&gt;
15 SSH Management (Agentless)&lt;br /&gt;
16 PILLAR&lt;br /&gt;
17 PORTS &amp;amp; NETWORK&lt;br /&gt;
18 JINJA&lt;br /&gt;
19 ETC&lt;br /&gt;
DOCS &amp;amp; FILES&lt;br /&gt;
Modules List&lt;br /&gt;
https://docs.saltstack.com/en/latest/salt-modindex.html&lt;br /&gt;
State List&lt;br /&gt;
https://docs.saltstack.com/en/latest/ref/states/all/index.html#all-salt-states&lt;br /&gt;
&lt;br /&gt;
Salt source files&lt;br /&gt;
/usr/lib/python&amp;lt;version&amp;gt;/site-packages/salt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
BOOTSTRAP&lt;br /&gt;
Bootstrap Install&lt;br /&gt;
https://repo.saltstack.com/#bootstrap&lt;br /&gt;
&lt;br /&gt;
wget -O bootstrap_salt.sh https://bootstrap.saltstack.com &lt;br /&gt;
&lt;br /&gt;
install Master&lt;br /&gt;
sh bootstrap_salt.sh -M  &lt;br /&gt;
&lt;br /&gt;
install specific Salt version&lt;br /&gt;
sh bootstrap_salt.sh git v2015.8.8&lt;br /&gt;
SERVICES&lt;br /&gt;
&lt;br /&gt;
Start / Stop / Restart service on Minion&lt;br /&gt;
salt 'target' service.start &amp;quot;service name&amp;quot;  (start/stop/restart)&lt;br /&gt;
&lt;br /&gt;
Restart Minion on Win target&lt;br /&gt;
salt 'target' cmd.run 'start powershell &amp;quot;Restart-Service -Name salt-minion&amp;quot;'&lt;br /&gt;
&lt;br /&gt;
Restart Minion on Linux target&lt;br /&gt;
salt 'target' cmd.run 'service salt-minion restart&amp;quot;'&lt;br /&gt;
&lt;br /&gt;
Execute a script remotely&lt;br /&gt;
salt target cmd.exec_code python 'import sys; print sys.version'&lt;br /&gt;
2.7.8 GCC 4.9.1&lt;br /&gt;
&lt;br /&gt;
salt target cmd.exec_code sh 'echo $PATH'&lt;br /&gt;
/usr/local/bin:/usr/local/sbin&lt;br /&gt;
&lt;br /&gt;
Check service on minion&lt;br /&gt;
salt target service.status httpd&lt;br /&gt;
&lt;br /&gt;
Check if service is available&lt;br /&gt;
salt target service.available httpd&lt;br /&gt;
&lt;br /&gt;
get all services&lt;br /&gt;
salt target service.get_all&lt;br /&gt;
&lt;br /&gt;
reload a service config (avoids restart)&lt;br /&gt;
salt target service.reload httpd&lt;br /&gt;
&lt;br /&gt;
start | stop | restart a service&lt;br /&gt;
salt target service.start httpd&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TARGETING&lt;br /&gt;
by OS grain&lt;br /&gt;
salt -G os:Windows cmd.run &amp;quot;net stop Firewall&amp;quot;   &lt;br /&gt;
&lt;br /&gt;
by other grains&lt;br /&gt;
salt –G 'server_type:app and env:prod' state.highstate&lt;br /&gt;
&lt;br /&gt;
target EC2 instances only&lt;br /&gt;
salt -G uuid:ec2\* test.ping&lt;br /&gt;
&lt;br /&gt;
compound match&lt;br /&gt;
salt –C 'server_type:web and clo*' state.sls nginx&lt;br /&gt;
&lt;br /&gt;
list based match&lt;br /&gt;
salt –L 'hostname1,hostname2,hostname3' state.sls ntp&lt;br /&gt;
&lt;br /&gt;
Nodegroup match&lt;br /&gt;
salt –N ny_db_servers cmd.run 'ps –ef | grep mysql'&lt;br /&gt;
&lt;br /&gt;
regex OR&lt;br /&gt;
salt -E &amp;quot;(nyweb|db5)&amp;quot; test.ping&lt;br /&gt;
&lt;br /&gt;
by pillar value&lt;br /&gt;
salt -I 'role:webserver' test.ping&lt;br /&gt;
KEY MANAGEMENT&lt;br /&gt;
&lt;br /&gt;
Add Minions to Master&lt;br /&gt;
salt-key -L (show pending to be accepted)&lt;br /&gt;
salt-key -A (accept all pending)&lt;br /&gt;
salt-key -a target (accept by hostname)&lt;br /&gt;
&lt;br /&gt;
Remove inactive minions from Salt&lt;br /&gt;
salt-run manage.down removekeys=True&lt;br /&gt;
&lt;br /&gt;
Remove minions by name&lt;br /&gt;
salt-key -D targetName&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
SERVER DIAGNOSTICS&lt;br /&gt;
&lt;br /&gt;
Test Connection&lt;br /&gt;
salt 'target' test.ping&lt;br /&gt;
&lt;br /&gt;
Diagnostics&lt;br /&gt;
salt target status.all_status // gets all info&lt;br /&gt;
status.cpu_info&lt;br /&gt;
status.cpustats&lt;br /&gt;
status.uptime&lt;br /&gt;
status.diskusage  // or disk.usage&lt;br /&gt;
status.loadavg&lt;br /&gt;
status.meminfo&lt;br /&gt;
status.netdev  // network device&lt;br /&gt;
status.netstats //network stats&lt;br /&gt;
status.procs&lt;br /&gt;
status.version //system version&lt;br /&gt;
status.vmstats //virtual mem stats&lt;br /&gt;
status.w  //who is logged in&lt;br /&gt;
&lt;br /&gt;
Show Minions by State (Up/Down)&lt;br /&gt;
 salt-run manage.up&lt;br /&gt;
 salt-run manage.down&lt;br /&gt;
 salt-run manage.status  (show all by status)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Compliance and Audit&lt;br /&gt;
&lt;br /&gt;
to get a compliance result, run a State check with test=True&lt;br /&gt;
salt \* state.highstate test=True&lt;br /&gt;
&lt;br /&gt;
This will return any differences from existing configuration to whats in&lt;br /&gt;
the Top file&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Show Salt Master version&lt;br /&gt;
salt --versions-report&lt;br /&gt;
&lt;br /&gt;
Show Salt Minion version&lt;br /&gt;
salt-call --versions-report&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Start Minion in Debug mode&lt;br /&gt;
salt-master --log-level=debug&lt;br /&gt;
&lt;br /&gt;
Restart everything on Master:&lt;br /&gt;
pkill salt-minion  //Kill minion&lt;br /&gt;
pkill salt-syndic  // Kill Syndic&lt;br /&gt;
salt-run cache.clear_all   //Clear all cache&lt;br /&gt;
salt '*' saltutil.sync_grains   //Sync grains&lt;br /&gt;
salt-master -d  //Start master daemon&lt;br /&gt;
salt-minion -d  //Start minion daemon&lt;br /&gt;
salt-syndic -d  //Start syndic daemon&lt;br /&gt;
&lt;br /&gt;
Agent Env Info&lt;br /&gt;
&lt;br /&gt;
show all information about a minion (lots of data)&lt;br /&gt;
salt minion status.all_status&lt;br /&gt;
&lt;br /&gt;
show memory&lt;br /&gt;
salt minion status.meminfo&lt;br /&gt;
&lt;br /&gt;
show disk usage&lt;br /&gt;
salt minion status.diskusage&lt;br /&gt;
&lt;br /&gt;
show who is logged in&lt;br /&gt;
salt minion status.w&lt;br /&gt;
&lt;br /&gt;
GRAINS&lt;br /&gt;
&lt;br /&gt;
Show Grain data&lt;br /&gt;
salt '*' grains.ls   &lt;br /&gt;
salt '*' grains.items&lt;br /&gt;
&lt;br /&gt;
get specific Grain &lt;br /&gt;
salt cent7 grains.get selinux&lt;br /&gt;
cent7:&lt;br /&gt;
    ----------&lt;br /&gt;
    enabled:&lt;br /&gt;
        True&lt;br /&gt;
    enforced:&lt;br /&gt;
        Enforcing&lt;br /&gt;
&lt;br /&gt;
can also do the same with &lt;br /&gt;
salt cent7 grains.item selinux&lt;br /&gt;
&lt;br /&gt;
set a Grain data on a node&lt;br /&gt;
salt cent7 grains.set 'apps:Myapp:port' 2500&lt;br /&gt;
&lt;br /&gt;
salt cent7 grains.item apps&lt;br /&gt;
cent7:&lt;br /&gt;
    ----------&lt;br /&gt;
    apps:&lt;br /&gt;
        ----------&lt;br /&gt;
        Myapp:&lt;br /&gt;
            ----------&lt;br /&gt;
            port:&lt;br /&gt;
                2500&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
All grain data is stored on the minion in /etc/salt/grains file&lt;br /&gt;
if adding more data manually, refresh Grains on the Master to pick up changes&lt;br /&gt;
salt target saltutil.refresh_modules&lt;br /&gt;
&lt;br /&gt;
Use grain in a state file&lt;br /&gt;
apache:&lt;br /&gt;
  pkg.installed:&lt;br /&gt;
    {% if grains['os'] == 'RedHat' %}&lt;br /&gt;
    - name: httpd&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
show JSON output&lt;br /&gt;
salt target grains.item ipv4 --out=json&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;target&amp;quot;: {&lt;br /&gt;
        &amp;quot;ipv4&amp;quot;: [&lt;br /&gt;
            &amp;quot;10.0.2.15&amp;quot;, &lt;br /&gt;
            &amp;quot;127.0.0.1&amp;quot;, &lt;br /&gt;
            &amp;quot;192.168.56.102&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Use grain as a variable&lt;br /&gt;
{% set nodename = grains['nodename'] %}&lt;br /&gt;
&lt;br /&gt;
base:&lt;br /&gt;
  '*':&lt;br /&gt;
    - common&lt;br /&gt;
    - packages&lt;br /&gt;
    - users&lt;br /&gt;
    - servers.{{ nodename }}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
MINE&lt;br /&gt;
&lt;br /&gt;
show mine data&lt;br /&gt;
salt \* mine.get \* x509.get_pem_entries&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PACKAGES AND INSTALLATION&lt;br /&gt;
&lt;br /&gt;
Verbose output (timeout 300 sec)&lt;br /&gt;
salt 'target' state.hightstate -t 300 -v&lt;br /&gt;
&lt;br /&gt;
Show package version&lt;br /&gt;
salt 'target' pkg.version apache&lt;br /&gt;
&lt;br /&gt;
install package on minions&lt;br /&gt;
salt 'target' pkg.install apache&lt;br /&gt;
&lt;br /&gt;
Uninstall pkg&lt;br /&gt;
salt 'target' pkg.remove 'npp'&lt;br /&gt;
salt 'target' pkg.purge 'npp'&lt;br /&gt;
&lt;br /&gt;
Show Installed Packages or Software&lt;br /&gt;
salt 'target' pkg.list_pkgs&lt;br /&gt;
&lt;br /&gt;
show all packages that need updates&lt;br /&gt;
salt target pkg.list_upgrades&lt;br /&gt;
&lt;br /&gt;
upgrade all packages&lt;br /&gt;
salt target pkg.upgrade&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Windows (Chocolatey)&lt;br /&gt;
install chocolatey&lt;br /&gt;
salt wintarget chocolatey.bootstrap  &lt;br /&gt;
&lt;br /&gt;
install pkg using choco&lt;br /&gt;
salt mrxwin7 chocolatey.install 7zip &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JOBS AND PROCESS CONTROL&lt;br /&gt;
&lt;br /&gt;
Show all Salt jobs run history&lt;br /&gt;
salt-run jobs.list_jobs&lt;br /&gt;
&lt;br /&gt;
Show active Salt jobs&lt;br /&gt;
salt-run jobs.active    // returns a Job ID&lt;br /&gt;
&lt;br /&gt;
Show currently running processes on a minion&lt;br /&gt;
salt '*' saltutil.running&lt;br /&gt;
&lt;br /&gt;
Kill active job&lt;br /&gt;
salt 'target' saltutil.kill_job $JOB_ID&lt;br /&gt;
salt '*' saltutil.term_job &amp;lt;job id&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Clear Job cache&lt;br /&gt;
salt '*' saltutil.clear_cache&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
REACTOR&lt;br /&gt;
&lt;br /&gt;
examples of reactor matching&lt;br /&gt;
&lt;br /&gt;
/etc/salt/master.d/reactor.conf&lt;br /&gt;
reactor:&lt;br /&gt;
  - 'sayhello':&lt;br /&gt;
    - /srv/reactor/test.sls&lt;br /&gt;
&lt;br /&gt;
/srv/reactor/test.sls&lt;br /&gt;
{% if data['id'].startswith('web') %}&lt;br /&gt;
sayhello:&lt;br /&gt;
  local.state.apply:&lt;br /&gt;
    - tgt: {{ data['id'] }}&lt;br /&gt;
    - arg:&lt;br /&gt;
      - say-hello&lt;br /&gt;
  &lt;br /&gt;
  local.cmd.run:&lt;br /&gt;
    - tgt: minion1&lt;br /&gt;
    - arg: &lt;br /&gt;
      - &amp;quot;echo 'hello' &amp;gt; /tmp hello&amp;quot;&lt;br /&gt;
&lt;br /&gt;
{% endif %}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
DEBUG&lt;br /&gt;
&lt;br /&gt;
Run highstate in debug&lt;br /&gt;
salt-call -l debug state.highstate&lt;br /&gt;
&lt;br /&gt;
Run specific state in debug&lt;br /&gt;
salt-call -l debug state.sls elasticsearch&lt;br /&gt;
&lt;br /&gt;
show highstate process (debug YAML syntax errors)&lt;br /&gt;
salt-call state.show_highstate&lt;br /&gt;
&lt;br /&gt;
show specific State details&lt;br /&gt;
salt 'target' state.show_sls apache &lt;br /&gt;
&lt;br /&gt;
show only Changed and Failed during run&lt;br /&gt;
modify /etc/salt/master  and /etc/salt/minion, restart Master after change&lt;br /&gt;
state_verbose: True&lt;br /&gt;
state_output: mixed&lt;br /&gt;
&lt;br /&gt;
start minion in debug, see connection errors&lt;br /&gt;
salt-minion -l debug&lt;br /&gt;
&lt;br /&gt;
https://docs.saltstack.com/en/latest/topics/troubleshooting/minion.html&lt;br /&gt;
&lt;br /&gt;
if Master not seeing Minion key requests, add IPTables rules to Master,&lt;br /&gt;
root@master# iptables -I INPUT -s 172.31.23.0/24 -p tcp -m multiport --dports 4505,4506 -j ACCEPT&lt;br /&gt;
root@master# iptables -I INPUT -s 172.31.25.0/24 -p tcp -m multiport --dports 4505,4506 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# reject everything else,&lt;br /&gt;
root@master# iptables -A INPUT -p tcp -m multiport --dports 4505,4506 -j REJECT&lt;br /&gt;
&lt;br /&gt;
Log Jinja variables to Minion&lt;br /&gt;
{% do salt.log.error('testing jinja logging') -%}&lt;br /&gt;
&lt;br /&gt;
show Options passed to a State (ie, test=true)&lt;br /&gt;
{% do salt.log.error(opts['test']) -%}&lt;br /&gt;
&lt;br /&gt;
Output variables from State file,&lt;br /&gt;
show_var:&lt;br /&gt;
    - test.show_notification:&lt;br /&gt;
        - text:  This is my var {{ var }}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Exit w failure message&lt;br /&gt;
&lt;br /&gt;
fail_run:&lt;br /&gt;
  test.fail_without_changes:&lt;br /&gt;
    - name: your message here&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
FILE OPERATIONS&lt;br /&gt;
Check if file contains a string (true/false)&lt;br /&gt;
salt '*' file.contains /etc/ssh/sshd_config 'Port'&lt;br /&gt;
&lt;br /&gt;
Check if a file on the Salt minions contains a certain regex (search file on minions):&lt;br /&gt;
salt &amp;quot;*&amp;quot; file.contains_regex /etc/resolv.conf &amp;quot;timeout.4&amp;quot;&lt;br /&gt;
&lt;br /&gt;
check if file is a file or directory&lt;br /&gt;
salt target file.stats /etc/hosts&lt;br /&gt;
&lt;br /&gt;
Find a file&lt;br /&gt;
salt '*' file.find /etc name=host\*.\*&lt;br /&gt;
result&lt;br /&gt;
- /etc/host.conf&lt;br /&gt;
- /etc/hosts.allow&lt;br /&gt;
- /etc/hosts.deny'&lt;br /&gt;
copy small file ( &amp;gt; 100kb)  from Master to minion&lt;br /&gt;
salt-cp 'target' /opt/file (source)  /opt (destination)&lt;br /&gt;
&lt;br /&gt;
copy dir from Master /srv/salt area to minion&lt;br /&gt;
salt 'target' cp.get_dir salt://myDir /target/dir&lt;br /&gt;
&lt;br /&gt;
copy large file from Master /srv/salt/distribution folder to minion&lt;br /&gt;
salt 'target' cp.get_file salt://distribution/myFile.tar   /tmp/myFile.tar&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
copy file from one minion to another using MinionFS (only works on Salt 2016.3.2)&lt;br /&gt;
https://docs.saltstack.com/en/latest/topics/tutorials/minionfs.html&lt;br /&gt;
&lt;br /&gt;
add MinionFS to master conf file&lt;br /&gt;
vi /etc/salt/master&lt;br /&gt;
&lt;br /&gt;
add this lines: &lt;br /&gt;
minionfs_mountpoint: salt://minionfs&lt;br /&gt;
file_recv: True&lt;br /&gt;
&lt;br /&gt;
restart Master&lt;br /&gt;
&lt;br /&gt;
get the file from the minion and store it in MinionFS&lt;br /&gt;
salt 'target' cp.push /path/to/file/or/dir/on/minion&lt;br /&gt;
&lt;br /&gt;
files are stored on Master in here:&lt;br /&gt;
/var/cache/salt/master/minions/&amp;lt;minion&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
copy file from Minion to Master&lt;br /&gt;
on Master, set &amp;quot;file_recv: True&amp;quot;  in /etc/salt/master, restart Master&lt;br /&gt;
&lt;br /&gt;
to copy file, &lt;br /&gt;
&lt;br /&gt;
salt \* cp.push /path/to/file/on/minion&lt;br /&gt;
&lt;br /&gt;
all files are stored on Master /var/cache/salt/master/minions/&amp;lt;minion&amp;gt;/files&lt;br /&gt;
&lt;br /&gt;
add host entry to a minion&lt;br /&gt;
salt target hosts.add_host 192.168.55.100 hostname&lt;br /&gt;
&lt;br /&gt;
Replace contents of file with new value&lt;br /&gt;
salt '*' file.sed /etc/ssh/sshd_config 'Port 22' 'Port 2201'&lt;br /&gt;
&lt;br /&gt;
Create folder&lt;br /&gt;
salt '*' file.makedirs /tmp/testFolder/ (for windows use native Win syntax, ie C:/temp/dir)&lt;br /&gt;
&lt;br /&gt;
Delete folder&lt;br /&gt;
salt '*' file.remove /tmp/testFolder&lt;br /&gt;
&lt;br /&gt;
Create new file&lt;br /&gt;
salt '*' file.touch /tmp/testFolder/emptyFile&lt;br /&gt;
&lt;br /&gt;
manage file content in State file&lt;br /&gt;
/etc/fstab:&lt;br /&gt;
  file.line: &lt;br /&gt;
    - content: &amp;quot;proc    /proc&amp;quot;&lt;br /&gt;
    - mode: insert&lt;br /&gt;
    - after&lt;br /&gt;
&lt;br /&gt;
replace contents of file&lt;br /&gt;
update_modprobe:&lt;br /&gt;
  file.replace:&lt;br /&gt;
    - name: /etc/modprobe.d/salt_cis.conf&lt;br /&gt;
    - pattern: &amp;quot;^install {{ fs }} /bin/true&amp;quot;&lt;br /&gt;
    - repl: install {{ fs }} /bin/true&lt;br /&gt;
    - append_if_not_found: True&lt;br /&gt;
&lt;br /&gt;
create symlink&lt;br /&gt;
symlink:&lt;br /&gt;
  file.symlink:&lt;br /&gt;
    - name: /path/to/A&lt;br /&gt;
    - target: /symlink/path/A&lt;br /&gt;
create directory&lt;br /&gt;
&lt;br /&gt;
/home/qb/q3:&lt;br /&gt;
  file.directory:&lt;br /&gt;
    - user: qb&lt;br /&gt;
    - group: qb&lt;br /&gt;
    - dir_mode: 755&lt;br /&gt;
    - file_mode: 755&lt;br /&gt;
    - require:&lt;br /&gt;
        - user: qb&lt;br /&gt;
&lt;br /&gt;
replace file contents using Augeas&lt;br /&gt;
sshd_config:&lt;br /&gt;
  augeas.change:&lt;br /&gt;
    - context: /files/etc/ssh/sshd_config&lt;br /&gt;
    - changes:&lt;br /&gt;
      - set Port 8888&lt;br /&gt;
      - set PasswordAuthentication yes&lt;br /&gt;
      - set PubkeyAuthentication yes&lt;br /&gt;
&lt;br /&gt;
copy directory from Master to minion&lt;br /&gt;
&lt;br /&gt;
app_ta_nix_dir:&lt;br /&gt;
    file.recurse:&lt;br /&gt;
        - name: /opt/splunkforwarder/etc/apps/Splunk_TA_nix&lt;br /&gt;
        - source: salt://{{ slspath }}/files/apps/Splunk_TA_nix&lt;br /&gt;
        - makedirs: True&lt;br /&gt;
        - user: splunk&lt;br /&gt;
        - group: splunk&lt;br /&gt;
        - file_mode: 0755&lt;br /&gt;
&lt;br /&gt;
File Managed&lt;br /&gt;
&lt;br /&gt;
try several files if 1st one doesnt exist&lt;br /&gt;
&lt;br /&gt;
monit_config:&lt;br /&gt;
    file.managed:&lt;br /&gt;
        - name: /etc/monit/monit.conf&lt;br /&gt;
        - source: &lt;br /&gt;
            - salt://{{ slspath }}/files/configs/host/{{ grains.id }}.j2&lt;br /&gt;
            - salt://{{ slspath }}/files/configs/profile/{{ salt['pillar.get']('profile') }}.j2&lt;br /&gt;
            - salt://{{ slspath }}/files/configs/default.j2&lt;br /&gt;
        - template: jinja&lt;br /&gt;
        - makedirs: True&lt;br /&gt;
        - mode: 0600&lt;br /&gt;
        - user: monit&lt;br /&gt;
        - group: monit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
USER AND GROUP MGMT&lt;br /&gt;
&lt;br /&gt;
Set user's password to 123123&lt;br /&gt;
salt '*' shadow.set_password user02&lt;br /&gt;
'$6$EYk3o52W$DaSUIfHpYMBkSShFYXdODyrHbmQlCNKFghNl9FZzZshUn240GCOn5szQ3piyBMtt/x4m.'&lt;br /&gt;
&lt;br /&gt;
Generate a password&lt;br /&gt;
salt 'target' shadow.gen_password myP@ssword&lt;br /&gt;
$6$nTul6WP1$EJ6THWEYKgOuGjqSEhnv8ZcYET6z/sDsSB.YBoyImRWEoDjguvcUahnY3UuNtNpECVhwxsjWI6ucvCc1&lt;br /&gt;
&lt;br /&gt;
Additional ways to generate you own password:&lt;br /&gt;
python -c &amp;quot;import crypt, getpass, pwd; print crypt.crypt('yourpassword', '\$6\$SALTsalt\$')&amp;quot;&lt;br /&gt;
openssl passwd -1&lt;br /&gt;
&lt;br /&gt;
Add User&lt;br /&gt;
salt target user.add Joe&lt;br /&gt;
&lt;br /&gt;
Remove User&lt;br /&gt;
salt '*' user.delete Joe remove=True force=True&lt;br /&gt;
&lt;br /&gt;
Show all users on a target&lt;br /&gt;
salt target user.list_users&lt;br /&gt;
&lt;br /&gt;
Info on all users on a target&lt;br /&gt;
salt target user.getent&lt;br /&gt;
&lt;br /&gt;
Info on specific user&lt;br /&gt;
salt target user.info Joe&lt;br /&gt;
&lt;br /&gt;
Add User to Group&lt;br /&gt;
salt target user.chgroups Joe Administrator, LocalAdmin True&lt;br /&gt;
// or&lt;br /&gt;
salt target group.adduser admins Joe&lt;br /&gt;
&lt;br /&gt;
Remove User from Group&lt;br /&gt;
salt target group.deluser admins Joe&lt;br /&gt;
&lt;br /&gt;
Show users Groups&lt;br /&gt;
salt target user.list_groups Joe&lt;br /&gt;
&lt;br /&gt;
Change Users Shell&lt;br /&gt;
salt '*' user.chshell user02 /bin/bash&lt;br /&gt;
&lt;br /&gt;
get info on all groups&lt;br /&gt;
salt target group.getent&lt;br /&gt;
&lt;br /&gt;
get info o a particular group&lt;br /&gt;
salt target group.info splunk&lt;br /&gt;
&lt;br /&gt;
Delete group&lt;br /&gt;
salt target group.delete splunk&lt;br /&gt;
&lt;br /&gt;
STATES&lt;br /&gt;
Highstate &lt;br /&gt;
salt '*' state.highstate&lt;br /&gt;
&lt;br /&gt;
Deploy specific state&lt;br /&gt;
salt '*' state.apply webserver&lt;br /&gt;
Run multiple state executions on same minion at once (by design Salt limits 1 state per minion at once)&lt;br /&gt;
salt target state.sls yourState concurrent=True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Requisites &lt;br /&gt;
&lt;br /&gt;
https://docs.saltstack.com/en/latest/ref/states/requisites.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
unless&lt;br /&gt;
vim:&lt;br /&gt;
  pkg.installed:&lt;br /&gt;
    - unless:&lt;br /&gt;
      - rpm -q vim-enhanced&lt;br /&gt;
      - ls /usr/bin/vim&lt;br /&gt;
&lt;br /&gt;
onlyif&lt;br /&gt;
set_RTC:&lt;br /&gt;
  cmd.run:&lt;br /&gt;
    - name: &amp;quot;/usr/bin/timedatectl set-local-rtc 0&amp;quot;&lt;br /&gt;
    - onlyif: &amp;quot;/usr/bin/timedatectl  | grep &amp;quot;RTC in local TZ&amp;quot; | grep yes&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
require&lt;br /&gt;
bar:&lt;br /&gt;
  pkg.installed:&lt;br /&gt;
    - require:&lt;br /&gt;
      - sls: foo&lt;br /&gt;
&lt;br /&gt;
onchanges&lt;br /&gt;
extract_package:&lt;br /&gt;
  archive.extracted:&lt;br /&gt;
    - name: /usr/local/share/myapp&lt;br /&gt;
    - source: /usr/local/share/myapp.tar.xz&lt;br /&gt;
    - archive_format: tar&lt;br /&gt;
    - onchanges:&lt;br /&gt;
      - file: Deploy server package&lt;br /&gt;
&lt;br /&gt;
watch&lt;br /&gt;
ntpd:&lt;br /&gt;
  service.running:&lt;br /&gt;
    - watch:&lt;br /&gt;
      - file: /etc/ntp.conf&lt;br /&gt;
&lt;br /&gt;
prereq&lt;br /&gt;
prereq allows for actions to be taken based on the expected results of a state that has not yet been executed. The state containing the prereq requisite is defined as the pre-requiring state. The state specified in the prereq statement is defined as the pre-required state.&lt;br /&gt;
&lt;br /&gt;
graceful-down:&lt;br /&gt;
  cmd.run:&lt;br /&gt;
    - name: service apache graceful&lt;br /&gt;
    - prereq:&lt;br /&gt;
      - file: site-code&lt;br /&gt;
&lt;br /&gt;
use&lt;br /&gt;
The use requisite is used to inherit the arguments passed in another id declaration. This is useful when many files need to have the same defaults.&lt;br /&gt;
/etc/foo.conf:&lt;br /&gt;
  file.managed:&lt;br /&gt;
    - source: salt://foo.conf&lt;br /&gt;
    - template: jinja&lt;br /&gt;
    - mkdirs: True&lt;br /&gt;
    - user: apache&lt;br /&gt;
    - group: apache&lt;br /&gt;
    - mode: 755&lt;br /&gt;
&lt;br /&gt;
/etc/bar.conf:&lt;br /&gt;
  file.managed:&lt;br /&gt;
    - source: salt://bar.conf&lt;br /&gt;
    - use:&lt;br /&gt;
      - file: /etc/foo.conf&lt;br /&gt;
&lt;br /&gt;
require_in&lt;br /&gt;
vim:&lt;br /&gt;
  pkg.installed:&lt;br /&gt;
    - require_in:&lt;br /&gt;
      - file: /etc/vimrc&lt;br /&gt;
&lt;br /&gt;
import YAML data into a state (same with import_json, import_text)&lt;br /&gt;
&lt;br /&gt;
{% import_yaml 'formula/facl/files/configs/test.yaml' as myconfig %}&lt;br /&gt;
&lt;br /&gt;
show_config:&lt;br /&gt;
  - test.show_notification:&lt;br /&gt;
    - text: {{ myconfig }}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
SSH Management (Agentless)&lt;br /&gt;
&lt;br /&gt;
edit the Roster file, include node's IP address and user to use (do this on Master)&lt;br /&gt;
&lt;br /&gt;
vi /etc/salt/roster&lt;br /&gt;
&lt;br /&gt;
# Sample salt-ssh config file&lt;br /&gt;
mrxcloud1:&lt;br /&gt;
   host: 104.131.102.230      # The IP addr or DNS hostname&lt;br /&gt;
   user: fred     # Remote executions will be executed as user fred&lt;br /&gt;
   passwd: foobarbaz      # The password to use for login, if omitted, keys are used&lt;br /&gt;
   sudo: True      # Whether to sudo to root, not enabled by default&lt;br /&gt;
&lt;br /&gt;
Run command on node (salt-ssh -i)&lt;br /&gt;
salt-ssh -i mrxcloud1 cmd.run &amp;quot;uname -a&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To run SSH as another user (non-root)&lt;br /&gt;
&lt;br /&gt;
copy /etc/salt directory to /home/user and change perms to user:group&lt;br /&gt;
should look like,&lt;br /&gt;
/home/user/salt/master&lt;br /&gt;
/home/user/salt/minion&lt;br /&gt;
/home/user/salt/minion.d&lt;br /&gt;
/home/user/salt/minion_uid&lt;br /&gt;
/home/user/salt/pki&lt;br /&gt;
/home/user/salt/var&lt;br /&gt;
/home/user/salt/roster&lt;br /&gt;
&lt;br /&gt;
configure Roster file: /home/joe.shmo/salt/roster&lt;br /&gt;
&lt;br /&gt;
edit /home/joe.shmo/salt/master&lt;br /&gt;
&lt;br /&gt;
change the following paths&lt;br /&gt;
pidfile: /home/user/salt/var/run/salt-master.pid&lt;br /&gt;
log_file: /home/user/salt/var/log/salt/master&lt;br /&gt;
pki_dir: /home/user/salt/pki/master&lt;br /&gt;
cachedir: /home/user/salt/var/cache/salt/master&lt;br /&gt;
&lt;br /&gt;
Add to the Roster file, the path to the user's private key&lt;br /&gt;
machine1:&lt;br /&gt;
  host: machine1.company.com&lt;br /&gt;
  user: joe.shmo&lt;br /&gt;
  sudo: True&lt;br /&gt;
  priv: /home/joe.shmo/.ssh/id_rsa&lt;br /&gt;
&lt;br /&gt;
run command with -c option&lt;br /&gt;
salt-ssh -c ~/salt -i machine1 cmd.run &amp;quot;/sbin/service jira status&amp;quot;&lt;br /&gt;
&lt;br /&gt;
apply a state file&lt;br /&gt;
salt-ssh '*' state.apply network&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Salt Roster File - Ansible-syntax (configure Roster to have variables and Groups)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PILLAR&lt;br /&gt;
Sample Pillar structure to create system users pillar structure&lt;br /&gt;
&lt;br /&gt;
Salt top file calls the Users state&lt;br /&gt;
&lt;br /&gt;
/srv/salt/top.sls&lt;br /&gt;
&lt;br /&gt;
base:&lt;br /&gt;
  '*':&lt;br /&gt;
    - common&lt;br /&gt;
    - users&lt;br /&gt;
Pillar top file tells what pillars to load for what nodes&lt;br /&gt;
&lt;br /&gt;
/srv/pillar/top.sls&lt;br /&gt;
&lt;br /&gt;
base:&lt;br /&gt;
  '*':&lt;br /&gt;
    - users&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Users Pillar contains actual data for users&lt;br /&gt;
/srv/pillar/users.sls&lt;br /&gt;
users:&lt;br /&gt;
  spiderman:&lt;br /&gt;
    uid: 1280&lt;br /&gt;
    fullname: 'spider man'&lt;br /&gt;
    shell: /bin/bash&lt;br /&gt;
    ssh-keys:&lt;br /&gt;
      - ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAt1IFQP9xxx&lt;br /&gt;
&lt;br /&gt;
  black.hood:&lt;br /&gt;
    uid: 1281&lt;br /&gt;
    fullname: black hood&lt;br /&gt;
    shell: '/bin/bash'&lt;br /&gt;
    ssh-keys:&lt;br /&gt;
      - ssh-rsa AADRN34zf12fdfd343434wAAAQEAwAAAQEA&lt;br /&gt;
&lt;br /&gt;
  supergirl:&lt;br /&gt;
    uid: 1282&lt;br /&gt;
    fullname: super girl!&lt;br /&gt;
    shell: '/bin/bash'&lt;br /&gt;
    ssh-keys:&lt;br /&gt;
      - ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBNWRiUmFXjxrp4V&lt;br /&gt;
      - ssh-rsa ABCDEF134343434343dfdfdf343111dgfdfdfdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Salt Users state parses array and creates users,&lt;br /&gt;
&lt;br /&gt;
/srv/salt/users.sls&lt;br /&gt;
{% for user, args in pillar.get('users',{}).iteritems() %}&lt;br /&gt;
&lt;br /&gt;
{{ user }}:&lt;br /&gt;
&lt;br /&gt;
  group.present:&lt;br /&gt;
    - gid: {{ args['uid'] }}&lt;br /&gt;
&lt;br /&gt;
  user.present:&lt;br /&gt;
    - fullname: {{ args['fullname'] }}&lt;br /&gt;
    - uid: {{ args['uid'] }}&lt;br /&gt;
    - gid: {{ args['uid'] }}&lt;br /&gt;
    - shell: {{ args['shell'] }}&lt;br /&gt;
    - home: /home/{{ user }}&lt;br /&gt;
&lt;br /&gt;
{% endfor %}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Refresh pillars on all nodes&lt;br /&gt;
salt \* saltutil.refresh_pillar&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Look at pillar data&lt;br /&gt;
salt \* pillar.items&lt;br /&gt;
&lt;br /&gt;
get a Pillar value in a state file or Jinja file  (and pass a default value if no pillar is found)&lt;br /&gt;
{{ salt['pillar.get']('role:name', 'default') }}&lt;br /&gt;
&lt;br /&gt;
get Pillar value by passing a variable&lt;br /&gt;
{% for rt in salt['pillar.get']('network:routes:{0}:networks'.format(interface)) -%}&lt;br /&gt;
get nested pillar value (use semi colon to get to specific key)&lt;br /&gt;
salt nycweb01 pillar.get users:joe&lt;br /&gt;
PORTS &amp;amp; NETWORK&lt;br /&gt;
Master - Agent ports: 4505 (master to agent), 4506 (agent to master)&lt;br /&gt;
&lt;br /&gt;
Get IP of a Minion&lt;br /&gt;
salt target network.ip_addrs&lt;br /&gt;
&lt;br /&gt;
Ping from Minion&lt;br /&gt;
salt target network.ping someHostname&lt;br /&gt;
&lt;br /&gt;
get all active TCP connections on a minion&lt;br /&gt;
salt target network.active_tcp&lt;br /&gt;
&lt;br /&gt;
get ARP table &lt;br /&gt;
salt target network.arp&lt;br /&gt;
&lt;br /&gt;
test port connectivity for certain port&lt;br /&gt;
salt target network.connect www.google.com 80&lt;br /&gt;
&lt;br /&gt;
get hardware address for a MAC&lt;br /&gt;
salt target network.hw_addr eth0&lt;br /&gt;
&lt;br /&gt;
get intet address for interface&lt;br /&gt;
salt target network.interface eth0&lt;br /&gt;
&lt;br /&gt;
get all interfaces&lt;br /&gt;
salt target network.interfaces&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JINJA&lt;br /&gt;
 For Loop&lt;br /&gt;
{% for usr in 'moe','larry','curly' %}&lt;br /&gt;
{{ usr }}:&lt;br /&gt;
  group:&lt;br /&gt;
    - present&lt;br /&gt;
  user:&lt;br /&gt;
    - present&lt;br /&gt;
    - gid_from_name: True&lt;br /&gt;
    - require:&lt;br /&gt;
      - group: {{ usr }}&lt;br /&gt;
{% endfor %}&lt;br /&gt;
If Conditional&lt;br /&gt;
&lt;br /&gt;
{% if var == 2 %}&lt;br /&gt;
    Var is 2&lt;br /&gt;
{% elif var == 5 %}&lt;br /&gt;
    var is 5&lt;br /&gt;
{% else %}&lt;br /&gt;
    var is not 2&lt;br /&gt;
{% endif %}&lt;br /&gt;
 While loop&lt;br /&gt;
&lt;br /&gt;
{% range number from 3 to 6 %}&lt;br /&gt;
      {{ number }}&lt;br /&gt;
      (...)&lt;br /&gt;
  {% endrange %}&lt;br /&gt;
&lt;br /&gt;
Comparisons&lt;br /&gt;
&lt;br /&gt;
{% if 'Watermelon' ends with 'n' %}&lt;br /&gt;
 It ends with N&lt;br /&gt;
{% endif %}&lt;br /&gt;
&lt;br /&gt;
{% if varA == varB %}&lt;br /&gt;
{% if varA != varB %}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
get shell command value from inside Jinja&lt;br /&gt;
{% set procs = salt['cmd.run']('ps aux') %}&lt;br /&gt;
&lt;br /&gt;
disable tab space in a for loop&lt;br /&gt;
{% for server in servers %}&lt;br /&gt;
{{ server }}&lt;br /&gt;
{% endfor %}&lt;br /&gt;
&lt;br /&gt;
results in: &lt;br /&gt;
   server1&lt;br /&gt;
   server2&lt;br /&gt;
&lt;br /&gt;
to disable this, add &lt;br /&gt;
&lt;br /&gt;
#jinja2: lstrip_blocks: True&lt;br /&gt;
&lt;br /&gt;
to top of the template&lt;br /&gt;
&lt;br /&gt;
Run a state only if a file doesnt exist,&lt;br /&gt;
&lt;br /&gt;
{% if not salt['file.directory_exists']('/opt/q') %}&lt;br /&gt;
&lt;br /&gt;
deploy_kdb:&lt;br /&gt;
    file.managed:&lt;br /&gt;
        - name: /opt/q.tar.gz&lt;br /&gt;
        - source: salt://repo/q.tar.gz&lt;br /&gt;
&lt;br /&gt;
extract_kdb:&lt;br /&gt;
    archive.extracted:&lt;br /&gt;
        - name: /opt/&lt;br /&gt;
        - source: /opt/q.tar.gz&lt;br /&gt;
        - user: kdb&lt;br /&gt;
        - group: kdb&lt;br /&gt;
&lt;br /&gt;
{% endif %}&lt;br /&gt;
&lt;br /&gt;
Test for File&lt;br /&gt;
&lt;br /&gt;
{% if not salt['file.file_exists']('/opt/file') %}&lt;br /&gt;
&lt;br /&gt;
render parameter&lt;br /&gt;
{{ var_name }}&lt;br /&gt;
&lt;br /&gt;
set a parameter&lt;br /&gt;
{% set fruit = 'apple' %}&lt;br /&gt;
&lt;br /&gt;
Iterate dictionary (For Loop)&lt;br /&gt;
{% for name, app in applications.iteritems() %}&lt;br /&gt;
   {{ name }}&lt;br /&gt;
   {{ app['version'] }}&lt;br /&gt;
{% endfor %}&lt;br /&gt;
&lt;br /&gt;
sort a list&lt;br /&gt;
{% for vm in vcenter['vm_list']|sort %}&lt;br /&gt;
    {{ vm }}&lt;br /&gt;
{% endfor %}&lt;br /&gt;
&lt;br /&gt;
or by attribute or reverse&lt;br /&gt;
{% for vm in vcenter['vm_list']|sort(attribute='osname', reverse = True) %}&lt;br /&gt;
get total # of elements in list&lt;br /&gt;
{{ myList|length }}&lt;br /&gt;
&lt;br /&gt;
If statement with AND &amp;amp; OR&lt;br /&gt;
{% if var is None and var2 == 'blah' % or val3 == 'shmaa' %}&lt;br /&gt;
&lt;br /&gt;
convert variable uppercase / lowercase&lt;br /&gt;
{{ somevar | upper }}&lt;br /&gt;
&lt;br /&gt;
set a default value if value doesnt exist&lt;br /&gt;
{{ somevar or 'default message here' }}&lt;br /&gt;
&lt;br /&gt;
match by regex&lt;br /&gt;
{% if grains.id | regex_match('nyc(.*)', ignorecase=True) %}&lt;br /&gt;
&lt;br /&gt;
will match any grain in regex pattern&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jinja Tricks&lt;br /&gt;
 &lt;br /&gt;
difference&lt;br /&gt;
{{ [1, 2, 3] | difference([2, 3, 4]) | join(', ') }}&lt;br /&gt;
&amp;gt;&amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
avg, min, max, is_list, &lt;br /&gt;
{{ [1, 2, 3] | avg }}&lt;br /&gt;
&lt;br /&gt;
generate random UID&lt;br /&gt;
{{ 'random' | uuid }}&lt;br /&gt;
&lt;br /&gt;
date format&lt;br /&gt;
{{ 1457456400 | date_format }}&lt;br /&gt;
{{ 1457456400 | date_format('%d.%m.%Y %H:%M') }}&lt;br /&gt;
2017-03-08&lt;br /&gt;
08.03.2017 17:00&lt;br /&gt;
string to number&lt;br /&gt;
{{ '5' | to_num }}&lt;br /&gt;
&lt;br /&gt;
run Salt execution module&lt;br /&gt;
{{ salt.cmd.run('whoami') }}&lt;br /&gt;
{{ salt.group.add('newgroup1') }}&lt;br /&gt;
regex match&lt;br /&gt;
{{ 'abcd' | regex_match('BC(.*)', ignorecase=True) }}&lt;br /&gt;
&lt;br /&gt;
regex search&lt;br /&gt;
{{ 'muppet baby' | regex_search('pet(.*)', ignorecase=True) }}&lt;br /&gt;
&amp;gt;&amp;gt; baby&lt;br /&gt;
&lt;br /&gt;
compare_lists, compare_dicts&lt;br /&gt;
{{ [1,2,3] | compare_lists([1,2,4]) }}&lt;br /&gt;
&amp;gt;&amp;gt; {'new': 4, 'old': 3}&lt;br /&gt;
&lt;br /&gt;
list files in a directory&lt;br /&gt;
{{ '/etc/salt/' | list_files | join('\n') }}&lt;br /&gt;
&lt;br /&gt;
escape Jinja syntax&lt;br /&gt;
{% raw %}&lt;br /&gt;
    some text that contains jinja {% characters that need to be escaped&lt;br /&gt;
{% endraw %}&lt;br /&gt;
&lt;br /&gt;
iterate a dictionary&lt;br /&gt;
parent_dict = [{'A':'val1','B':'val2'}]&lt;br /&gt;
{% for item in parent_dict %}&lt;br /&gt;
  {% for key,val in item.items() %}&lt;br /&gt;
     {{ key }} {{ val }}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ETC&lt;br /&gt;
&lt;br /&gt;
generate random password hash&lt;br /&gt;
python -c &amp;quot;import crypt; print(crypt.crypt('password', crypt.mksalt(crypt.METHOD_SHA512)))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
```&lt;/div&gt;</summary>
		<author><name>Busk</name></author>
	</entry>
</feed>