# Configuration file examples

## Example master configuration file

    ##### Primary configuration settings #####
    ##########################################
    # This configuration file is used to manage the behavior of the Salt Master.
    # Values that are commented out but have an empty line after the comment are
    # defaults that do not need to be set in the config. If there is no blank line
    # after the comment then the value is presented as an example and is not the
    # default.

    # Per default, the master will automatically include all config files
    # from master.d/*.conf (master.d is a directory in the same directory
    # as the main master config file).
    #default_include: master.d/*.conf

    # The address of the interface to bind to:
    #interface: 0.0.0.0

    # Whether the master should listen for IPv6 connections. If this is set to True,
    # the interface option must be adjusted, too. (For example: "interface: '::'")
    #ipv6: False

    # The tcp port used by the publisher:
    #publish_port: 4505

    # The user under which the salt master will run. Salt will update all
    # permissions to allow the specified user to run the master. The exception is
    # the job cache, which must be deleted if this user is changed. If the
    # modified files cause conflicts, set verify_env to False.
    #user: root

    # Tell the master to also use salt-ssh when running commands against minions.
    #enable_ssh_minions: False

    # The port used by the communication interface. The ret (return) port is the
    # interface used for the file server, authentication, job returns, etc.
    #ret_port: 4506

    # Specify the location of the daemon process ID file:
    #pidfile: /var/run/salt-master.pid

    # The root directory prepended to these options: pki_dir, cachedir,
    # sock_dir, log_file, autosign_file, autoreject_file, extension_modules,
    # key_logfile, pidfile, autosign_grains_dir:
    #root_dir: /

    # The path to the master's configuration file.
    #conf_file: /etc/salt/master

    # Directory used to store public key data:
    #pki_dir: /etc/salt/pki/master

    # Key cache. Increases master speed for large numbers of accepted
    # keys. Available options: 'sched'. (Updates on a fixed schedule.)
    # Note that enabling this feature means that minions will not be
    # available to target for up to the length of the maintenance loop
    # which by default is 60s.
    #key_cache: ''

    # Directory to store job and cache data:
    # This directory may contain sensitive data and should be protected accordingly.
    #
    #cachedir: /var/cache/salt/master

    # Directory where custom modules sync to. This directory can contain
    # subdirectories for each of Salt's module types such as "runners",
    # "output", "wheel", "modules", "states", "returners", "engines",
    # "utils", etc.
    #
    # Note, any directories or files not found in the `module_dirs`
    # location will be removed from the extension_modules path.

    #extension_modules: /var/cache/salt/master/extmods

    # Directory for custom modules. This directory can contain subdirectories for
    # each of Salt's module types such as "runners", "output", "wheel", "modules",
    # "states", "returners", "engines", "utils", etc.
    #module_dirs: []

    # Verify and set permissions on configuration directories at startup:
    #verify_env: True

    # Set the number of hours to keep old job information in the job cache.
    # This option is deprecated by the keep_jobs_seconds option.
    #keep_jobs: 24

    # Set the number of seconds to keep old job information in the job cache:
    #keep_jobs_seconds: 86400

    # The number of seconds to wait when the client is requesting information
    # about running jobs.
    #gather_job_timeout: 10

    # Set the default timeout for the salt command and api. The default is 5
    # seconds.
    #timeout: 5

    # The loop_interval option controls the seconds for the master's maintenance
    # process check cycle. This process updates file server backends, cleans the
    # job cache and executes the scheduler.
    #loop_interval: 60

    # Set the default outputter used by the salt command. The default is "nested".
    #output: nested

    # To set a list of additional directories to search for salt outputters, set the
    # outputter_dirs option.
    #outputter_dirs: []

    # Set the default output file used by the salt command. Default is to output
    # to the CLI and not to a file. Functions the same way as the "--out-file"
    # CLI option, only sets this to a single file for all salt commands.
    #output_file: None

    # Return minions that timeout when running commands like test.ping
    #show_timeout: True

    # Tell the client to display the jid when a job is published.
    #show_jid: False

    # By default, output is colored. To disable colored output, set the color value
    # to False.
    #color: True

    # Do not strip off the colored output from nested results and state outputs
    # (true by default).
    # strip_colors: False

    # To display a summary of the number of minions targeted, the number of
    # minions returned, and the number of minions that did not return, set the
    # cli_summary value to True. (False by default.)
    #
    #cli_summary: False

    # Set the directory used to hold unix sockets:
    #sock_dir: /var/run/salt/master

    # The master can take a while to start up when lspci and/or dmidecode is used
    # to populate the grains for the master. Enable if you want to see GPU hardware
    # data for your master.
    # enable_gpu_grains: False

    # The master maintains a job cache. While this is a great addition, it can be
    # a burden on the master for larger deployments (over 5000 minions).
    # Disabling the job cache will make previously executed jobs unavailable to
    # the jobs system and is not generally recommended.
    #job_cache: True

    # Cache minion grains, pillar and mine data via the cache subsystem in the
    # cachedir or a database.
    #minion_data_cache: True

    # Cache subsystem module to use for minion data cache.
    #cache: localfs
    # Enables a fast in-memory cache booster and sets the expiration time.
    #memcache_expire_seconds: 0
    # Set a memcache limit in items (bank + key) per cache storage (driver + driver_opts).
    #memcache_max_items: 1024
    # Each time a cache storage got full cleanup all the expired items not just the oldest one.
    #memcache_full_cleanup: False
    # Enable collecting the memcache stats and log it on `debug` log level.
    #memcache_debug: False

    # Store all returns in the given returner.
    # Setting this option requires that any returner-specific configuration also
    # be set. See various returners in salt/returners for details on required
    # configuration values. (See also, event_return_queue, and event_return_queue_max_seconds below.)
    #
    #event_return: mysql

    # On busy systems, enabling event_returns can cause a considerable load on
    # the storage system for returners. Events can be queued on the master and
    # stored in a batched fashion using a single transaction for multiple events.
    # By default, events are not queued.
    #event_return_queue: 0

    # In some cases enabling event return queueing can be very helpful, but the bus
    # may not busy enough to flush the queue consistently.  Setting this to a reasonable
    # value (1-30 seconds) will cause the queue to be flushed when the oldest event is older
    # than `event_return_queue_max_seconds` regardless of how many events are in the queue.
    #event_return_queue_max_seconds: 0

    # Only return events matching tags in a whitelist, supports glob matches.
    #event_return_whitelist:
    #  - salt/master/a_tag
    #  - salt/run/*/ret

    # Store all event returns **except** the tags in a blacklist, supports globs.
    #event_return_blacklist:
    #  - salt/master/not_this_tag
    #  - salt/wheel/*/ret

    # Passing very large events can cause the minion to consume large amounts of
    # memory. This value tunes the maximum size of a message allowed onto the
    # master event bus. The value is expressed in bytes.
    #max_event_size: 1048576

    # Windows platforms lack posix IPC and must rely on slower TCP based inter-
    # process communications. Set ipc_mode to 'tcp' on such systems
    #ipc_mode: ipc

    # Overwrite the default tcp ports used by the minion when ipc_mode is set to 'tcp'
    #tcp_master_pub_port: 4510
    #tcp_master_pull_port: 4511

    # By default, the master AES key rotates every 24 hours. The next command
    # following a key rotation will trigger a key refresh from the minion which may
    # result in minions which do not respond to the first command after a key refresh.
    #
    # To tell the master to ping all minions immediately after an AES key refresh, set
    # ping_on_rotate to True. This should mitigate the issue where a minion does not
    # appear to initially respond after a key is rotated.
    #
    # Note that ping_on_rotate may cause high load on the master immediately after
    # the key rotation event as minions reconnect. Consider this carefully if this
    # salt master is managing a large number of minions.
    #
    # If disabled, it is recommended to handle this event by listening for the
    # 'aes_key_rotate' event with the 'key' tag and acting appropriately.
    # ping_on_rotate: False

    # By default, the master deletes its cache of minion data when the key for that
    # minion is removed. To preserve the cache after key deletion, set
    # 'preserve_minion_cache' to True.
    #
    # WARNING: This may have security implications if compromised minions auth with
    # a previous deleted minion ID.
    #preserve_minion_cache: False

    # Allow or deny minions from requesting their own key revocation
    #allow_minion_key_revoke: True

    # If max_minions is used in large installations, the master might experience
    # high-load situations because of having to check the number of connected
    # minions for every authentication. This cache provides the minion-ids of
    # all connected minions to all MWorker-processes and greatly improves the
    # performance of max_minions.
    # con_cache: False

    # The master can include configuration from other files. To enable this,
    # pass a list of paths to this option. The paths can be either relative or
    # absolute; if relative, they are considered to be relative to the directory
    # the main master configuration file lives in (this file). Paths can make use
    # of shell-style globbing. If no files are matched by a path passed to this
    # option, then the master will log a warning message.
    #
    # Include a config file from some other path:
    # include: /etc/salt/extra_config
    #
    # Include config from several files and directories:
    # include:
    #   - /etc/salt/extra_config

    #####  Large-scale tuning settings   #####
    ##########################################
    # Max open files
    #
    # Each minion connecting to the master uses AT LEAST one file descriptor, the
    # master subscription connection. If enough minions connect you might start
    # seeing on the console (and then salt-master crashes):
    #   Too many open files (tcp_listener.cpp:335)
    #   Aborted (core dumped)
    #
    # By default this value will be the one of `ulimit -Hn`, ie, the hard limit for
    # max open files.
    #
    # If you wish to set a different value than the default one, uncomment and
    # configure this setting. Remember that this value CANNOT be higher than the
    # hard limit. Raising the hard limit depends on your OS and/or distribution,
    # a good way to find the limit is to search the internet. For example:
    #   raise max open files hard limit debian
    #
    #max_open_files: 100000

    # The number of worker threads to start. These threads are used to manage
    # return calls made from minions to the master. If the master seems to be
    # running slowly, increase the number of threads. This setting can not be
    # set lower than 3.
    #worker_threads: 5

    # Set the ZeroMQ high water marks
    # http://api.zeromq.org/3-2:zmq-setsockopt

    # The listen queue size / backlog
    #zmq_backlog: 1000

    # The publisher interface ZeroMQPubServerChannel
    #pub_hwm: 1000

    # The master may allocate memory per-event and not
    # reclaim it.
    # To set a high-water mark for memory allocation, use
    # ipc_write_buffer to set a high-water mark for message
    # buffering.
    # Value: In bytes. Set to 'dynamic' to have Salt select
    # a value for you. Default is disabled.
    # ipc_write_buffer: 'dynamic'

    # These two batch settings, batch_safe_limit and batch_safe_size, are used to
    # automatically switch to a batch mode execution. If a command would have been
    # sent to more than <batch_safe_limit> minions, then run the command in
    # batches of <batch_safe_size>. If no batch_safe_size is specified, a default
    # of 8 will be used. If no batch_safe_limit is specified, then no automatic
    # batching will occur.
    #batch_safe_limit: 100
    #batch_safe_size: 8

    # Master stats enables stats events to be fired from the master at close
    # to the defined interval
    #master_stats: False
    #master_stats_event_iter: 60

    #####        Security settings       #####
    ##########################################
    # Enable passphrase protection of Master private key.  Although a string value
    # is acceptable; passwords should be stored in an external vaulting mechanism
    # and retrieved via sdb. See https://docs.saltproject.io/en/latest/topics/sdb/.
    # Passphrase protection is off by default but an example of an sdb profile and
    # query is as follows.
    # masterkeyring:
    #  driver: keyring
    #  service: system
    #
    # key_pass: sdb://masterkeyring/key_pass

    # Enable passphrase protection of the Master signing_key. This only applies if
    # master_sign_pubkey is set to True.  This is disabled by default.
    # master_sign_pubkey: True
    # signing_key_pass: sdb://masterkeyring/signing_pass

    # Enable "open mode", this mode still maintains encryption, but turns off
    # authentication, this is only intended for highly secure environments or for
    # the situation where your keys end up in a bad state. If you run in open mode
    # you do so at your own risk!
    #open_mode: False

    # Enable auto_accept, this setting will automatically accept all incoming
    # public keys from the minions. Note that this is insecure.
    #auto_accept: False

    # The size of key that should be generated when creating new keys.
    #keysize: 2048

    # Time in minutes that an incoming public key with a matching name found in
    # pki_dir/minion_autosign/keyid is automatically accepted. Expired autosign keys
    # are removed when the master checks the minion_autosign directory.
    # 0 equals no timeout
    # autosign_timeout: 120

    # If the autosign_file is specified, incoming keys specified in the
    # autosign_file will be automatically accepted. This is insecure.  Regular
    # expressions as well as globing lines are supported. The file must be readonly
    # except for the owner. Use permissive_pki_access to allow the group write access.
    #autosign_file: /etc/salt/autosign.conf

    # Works like autosign_file, but instead allows you to specify minion IDs for
    # which keys will automatically be rejected. Will override both membership in
    # the autosign_file and the auto_accept setting.
    #autoreject_file: /etc/salt/autoreject.conf

    # If the autosign_grains_dir is specified, incoming keys from minions with grain
    # values matching those defined in files in this directory will be accepted
    # automatically. This is insecure. Minions need to be configured to send the grains.
    #autosign_grains_dir: /etc/salt/autosign_grains

    # Enable permissive access to the salt keys. This allows you to run the
    # master or minion as root, but have a non-root group be given access to
    # your pki_dir. To make the access explicit, root must belong to the group
    # you've given access to. This is potentially quite insecure. If an autosign_file
    # is specified, enabling permissive_pki_access will allow group access to that
    # specific file.
    #permissive_pki_access: False

    # Allow users on the master access to execute specific commands on minions.
    # This setting should be treated with care since it opens up execution
    # capabilities to non root users. By default this capability is completely
    # disabled.
    #publisher_acl:
    #  larry:
    #    - test.ping
    #    - network.*
    #
    # Blacklist any of the following users or modules
    #
    # This example would blacklist all non sudo users, including root from
    # running any commands. It would also blacklist any use of the "cmd"
    # module. This is completely disabled by default.
    #
    #
    # Check the list of configured users in client ACL against users on the
    # system and throw errors if they do not exist.
    #client_acl_verify: True
    #
    #publisher_acl_blacklist:
    #  users:
    #    - root
    #    - '^(?!sudo_).*$'   #  all non sudo users
    #  modules:
    #    - cmd

    # Enforce publisher_acl & publisher_acl_blacklist when users have sudo
    # access to the salt command.
    #
    #sudo_acl: False

    # The external auth system uses the Salt auth modules to authenticate and
    # validate users to access areas of the Salt system.
    #external_auth:
    #  pam:
    #    fred:
    #      - test.*
    #
    # Time (in seconds) for a newly generated token to live. Default: 12 hours
    #token_expire: 43200
    #
    # Allow eauth users to specify the expiry time of the tokens they generate.
    # A boolean applies to all users or a dictionary of whitelisted eauth backends
    # and usernames may be given.
    # token_expire_user_override:
    #   pam:
    #     - fred
    #     - tom
    #   ldap:
    #     - gary
    #
    #token_expire_user_override: False

    # Set to True to enable keeping the calculated user's auth list in the token
    # file. This is disabled by default and the auth list is calculated or requested
    # from the eauth driver each time.
    #
    # Note: `keep_acl_in_token` will be forced to True when using external authentication
    # for REST API (`rest` is present under `external_auth`). This is because the REST API
    # does not store the password, and can therefore not retroactively fetch the ACL, so
    # the ACL must be stored in the token.
    #keep_acl_in_token: False

    # Auth subsystem module to use to get authorized access list for a user. By default it's
    # the same module used for external authentication.
    #eauth_acl_module: django

    # Allow minions to push files to the master. This is disabled by default, for
    # security purposes.
    #file_recv: False

    # Set a hard-limit on the size of the files that can be pushed to the master.
    # It will be interpreted as megabytes. Default: 100
    #file_recv_max_size: 100

    # Signature verification on messages published from the master.
    # This causes the master to cryptographically sign all messages published to its event
    # bus, and minions then verify that signature before acting on the message.
    #
    # This is False by default.
    #
    # Note that to facilitate interoperability with masters and minions that are different
    # versions, if sign_pub_messages is True but a message is received by a minion with
    # no signature, it will still be accepted, and a warning message will be logged.
    # Conversely, if sign_pub_messages is False, but a minion receives a signed
    # message it will be accepted, the signature will not be checked, and a warning message
    # will be logged. This behavior went away in Salt 2014.1.0 and these two situations
    # will cause minion to throw an exception and drop the message.
    # sign_pub_messages: False

    # Signature verification on messages published from minions
    # This requires that minions cryptographically sign the messages they
    # publish to the master.  If minions are not signing, then log this information
    # at loglevel 'INFO' and drop the message without acting on it.
    # require_minion_sign_messages: False

    # The below will drop messages when their signatures do not validate.
    # Note that when this option is False but `require_minion_sign_messages` is True
    # minions MUST sign their messages but the validity of their signatures
    # is ignored.
    # These two config options exist so a Salt infrastructure can be moved
    # to signing minion messages gradually.
    # drop_messages_signature_fail: False

    # Use TLS/SSL encrypted connection between master and minion.
    # Can be set to a dictionary containing keyword arguments corresponding to Python's
    # 'ssl.wrap_socket' method.
    # Default is None.
    #ssl:
    #    keyfile: <path_to_keyfile>
    #    certfile: <path_to_certfile>
    #    ssl_version: PROTOCOL_TLSv1_2

    #####     Salt-SSH Configuration     #####
    ##########################################
    # Define the default salt-ssh roster module to use
    #roster: flat

    # Pass in an alternative location for the salt-ssh `flat` roster file
    #roster_file: /etc/salt/roster

    # Define locations for `flat` roster files so they can be chosen when using Salt API.
    # An administrator can place roster files into these locations. Then when
    # calling Salt API, parameter 'roster_file' should contain a relative path to
    # these locations. That is, "roster_file=/foo/roster" will be resolved as
    # "/etc/salt/roster.d/foo/roster" etc. This feature prevents passing insecure
    # custom rosters through the Salt API.
    #
    #rosters:
    # - /etc/salt/roster.d
    # - /opt/salt/some/more/rosters

    # The ssh password to log in with.
    #ssh_passwd: ''

    #The target system's ssh port number.
    #ssh_port: 22

    # Comma-separated list of ports to scan.
    #ssh_scan_ports: 22

    # Scanning socket timeout for salt-ssh.
    #ssh_scan_timeout: 0.01

    # Boolean to run command via sudo.
    #ssh_sudo: False

    # Boolean to run ssh_pre_flight script defined in roster. By default
    # the script will only run if the thin_dir does not exist on the targeted
    # minion. This forces the script to run regardless of the thin dir existing
    # or not.
    #ssh_run_pre_flight: True

    # Number of seconds to wait for a response when establishing an SSH connection.
    #ssh_timeout: 60

    # The user to log in as.
    #ssh_user: root

    # The log file of the salt-ssh command:
    #ssh_log_file: /var/log/salt/ssh

    # Pass in minion option overrides that will be inserted into the SHIM for
    # salt-ssh calls. The local minion config is not used for salt-ssh. Can be
    # overridden on a per-minion basis in the roster (`minion_opts`)
    #ssh_minion_opts:
    #  gpg_keydir: /root/gpg

    # Set this to True to default to using ~/.ssh/id_rsa for salt-ssh
    # authentication with minions
    #ssh_use_home_key: False

    # Set this to True to default salt-ssh to run with ``-o IdentitiesOnly=yes``.
    # This option is intended for situations where the ssh-agent offers many
    # different identities and allows ssh to ignore those identities and use the
    # only one specified in options.
    #ssh_identities_only: False

    # List-only nodegroups for salt-ssh. Each group must be formed as either a
    # comma-separated list, or a YAML list. This option is useful to group minions
    # into easy-to-target groups when using salt-ssh. These groups can then be
    # targeted with the normal -N argument to salt-ssh.
    #ssh_list_nodegroups: {}

    # salt-ssh has the ability to update the flat roster file if a minion is not
    # found in the roster.  Set this to True to enable it.
    #ssh_update_roster: False

    #####    Master Module Management    #####
    ##########################################
    # Manage how master side modules are loaded.

    # Add any additional locations to look for master runners:
    #runner_dirs: []

    # Add any additional locations to look for master utils:
    #utils_dirs: []

    # Enable Cython for master side modules:
    #cython_enable: False

    #####      State System settings     #####
    ##########################################
    # The state system uses a "top" file to tell the minions what environment to
    # use and what modules to use. The state_top file is defined relative to the
    # root of the base environment as defined in "File Server settings" below.
    #state_top: top.sls

    # The master_tops option replaces the external_nodes option by creating
    # a plugable system for the generation of external top data. The external_nodes
    # option is deprecated by the master_tops option.
    #
    # To gain the capabilities of the classic external_nodes system, use the
    # following configuration:
    # master_tops:
    #   ext_nodes: <Shell command which returns yaml>
    #
    #master_tops: {}

    # The renderer to use on the minions to render the state data
    #renderer: jinja|yaml

    # Default Jinja environment options for all templates except sls templates
    #jinja_env:
    #  block_start_string: '{%'
    #  block_end_string: '%}'
    #  variable_start_string: '{{'
    #  variable_end_string: '}}'
    #  comment_start_string: '{#'
    #  comment_end_string: '#}'
    #  line_statement_prefix:
    #  line_comment_prefix:
    #  trim_blocks: False
    #  lstrip_blocks: False
    #  newline_sequence: '\n'
    #  keep_trailing_newline: False

    # Jinja environment options for sls templates
    #jinja_sls_env:
    #  block_start_string: '{%'
    #  block_end_string: '%}'
    #  variable_start_string: '{{'
    #  variable_end_string: '}}'
    #  comment_start_string: '{#'
    #  comment_end_string: '#}'
    #  line_statement_prefix:
    #  line_comment_prefix:
    #  trim_blocks: False
    #  lstrip_blocks: False
    #  newline_sequence: '\n'
    #  keep_trailing_newline: False

    # The failhard option tells the minions to stop immediately after the first
    # failure detected in the state execution, defaults to False
    #failhard: False

    # The state_verbose and state_output settings can be used to change the way
    # state system data is printed to the display. By default all data is printed.
    # The state_verbose setting can be set to True or False, when set to False
    # all data that has a result of True and no changes will be suppressed.
    #state_verbose: True

    # The state_output setting controls which results will be output full multi line
    # full, terse - each state will be full/terse
    # mixed - only states with errors will be full
    # changes - states with changes and errors will be full
    # full_id, mixed_id, changes_id and terse_id are also allowed;
    # when set, the state ID will be used as name in the output
    #state_output: full

    # The state_output_diff setting changes whether or not the output from
    # successful states is returned. Useful when even the terse output of these
    # states is cluttering the logs. Set it to True to ignore them.
    #state_output_diff: False

    # The state_output_profile setting changes whether profile information
    # will be shown for each state run.
    #state_output_profile: True

    # The state_output_pct setting changes whether success and failure information
    # as a percent of total actions will be shown for each state run.
    #state_output_pct: False

    # The state_compress_ids setting aggregates information about states which have
    # multiple "names" under the same state ID in the highstate output.
    #state_compress_ids: False

    # Automatically aggregate all states that have support for mod_aggregate by
    # setting to 'True'. Or pass a list of state module names to automatically
    # aggregate just those types.
    #
    # state_aggregate:
    #   - pkg
    #
    #state_aggregate: False

    # Send progress events as each function in a state run completes execution
    # by setting to 'True'. Progress events are in the format
    # 'salt/job/<JID>/prog/<MID>/<RUN NUM>'.
    #state_events: False

    #####      File Server settings      #####
    ##########################################
    # Salt runs a lightweight file server written in zeromq to deliver files to
    # minions. This file server is built into the master daemon and does not
    # require a dedicated port.

    # The file server works on environments passed to the master, each environment
    # can have multiple root directories, the subdirectories in the multiple file
    # roots cannot match, otherwise the downloaded files will not be able to be
    # reliably ensured. A base environment is required to house the top file.
    # Example:
    # file_roots:
    #   base:
    #     - /srv/salt/
    #   dev:
    #     - /srv/salt/dev/services
    #     - /srv/salt/dev/states
    #   prod:
    #     - /srv/salt/prod/services
    #     - /srv/salt/prod/states
    #
    #file_roots:
    #  base:
    #    - /srv/salt
    #

    # The master_roots setting configures a master-only copy of the file_roots dictionary,
    # used by the state compiler.
    #master_roots:
    #  base:
    #    - /srv/salt-master

    # When using multiple environments, each with their own top file, the
    # default behaviour is an unordered merge. To prevent top files from
    # being merged together and instead to only use the top file from the
    # requested environment, set this value to 'same'.
    #top_file_merging_strategy: merge

    # To specify the order in which environments are merged, set the ordering
    # in the env_order option. Given a conflict, the last matching value will
    # win.
    #env_order: ['base', 'dev', 'prod']

    # If top_file_merging_strategy is set to 'same' and an environment does not
    # contain a top file, the top file in the environment specified by default_top
    # will be used instead.
    #default_top: base

    # The hash_type is the hash to use when discovering the hash of a file on
    # the master server. The default is sha256, but md5, sha1, sha224, sha384 and
    # sha512 are also supported.
    #
    # WARNING: While md5 and sha1 are also supported, do not use them due to the
    # high chance of possible collisions and thus security breach.
    #
    # Prior to changing this value, the master should be stopped and all Salt
    # caches should be cleared.
    #hash_type: sha256

    # The buffer size in the file server can be adjusted here:
    #file_buffer_size: 1048576

    # A regular expression (or a list of expressions) that will be matched
    # against the file path before syncing the modules and states to the minions.
    # This includes files affected by the file.recurse state.
    # For example, if you manage your custom modules and states in subversion
    # and don't want all the '.svn' folders and content synced to your minions,
    # you could set this to '/\.svn($|/)'. By default nothing is ignored.
    #file_ignore_regex:
    #  - '/\.svn($|/)'
    #  - '/\.git($|/)'

    # A file glob (or list of file globs) that will be matched against the file
    # path before syncing the modules and states to the minions. This is similar
    # to file_ignore_regex above, but works on globs instead of regex. By default
    # nothing is ignored.
    # file_ignore_glob:
    #  - '*.pyc'
    #  - '*/somefolder/*.bak'
    #  - '*.swp'

    # File Server Backend
    #
    # Salt supports a modular fileserver backend system, this system allows
    # the salt master to link directly to third party systems to gather and
    # manage the files available to minions. Multiple backends can be
    # configured and will be searched for the requested file in the order in which
    # they are defined here. The default setting only enables the standard backend
    # "roots" which uses the "file_roots" option.
    #fileserver_backend:
    #  - roots
    #
    # To use multiple backends list them in the order they are searched:
    #fileserver_backend:
    #  - git
    #  - roots
    #
    # Uncomment the line below if you do not want the file_server to follow
    # symlinks when walking the filesystem tree. This is set to True
    # by default. Currently this only applies to the default roots
    # fileserver_backend.
    #fileserver_followsymlinks: False
    #
    # Uncomment the line below if you do not want symlinks to be
    # treated as the files they are pointing to. By default this is set to
    # False. By uncommenting the line below, any detected symlink while listing
    # files on the Master will not be returned to the Minion.
    #fileserver_ignoresymlinks: True
    #
    # The fileserver can fire events off every time the fileserver is updated,
    # these are disabled by default, but can be easily turned on by setting this
    # flag to True
    #fileserver_events: False

    # Git File Server Backend Configuration
    #
    # Optional parameter used to specify the provider to be used for gitfs. Must be
    # either pygit2 or gitpython. If unset, then both will be tried (in that
    # order), and the first one with a compatible version installed will be the
    # provider that is used.
    #
    #gitfs_provider: pygit2

    # Along with gitfs_password, is used to authenticate to HTTPS remotes.
    # gitfs_user: ''

    # Along with gitfs_user, is used to authenticate to HTTPS remotes.
    # This parameter is not required if the repository does not use authentication.
    #gitfs_password: ''

    # By default, Salt will not authenticate to an HTTP (non-HTTPS) remote.
    # This parameter enables authentication over HTTP. Enable this at your own risk.
    #gitfs_insecure_auth: False

    # Along with gitfs_privkey (and optionally gitfs_passphrase), is used to
    # authenticate to SSH remotes. This parameter (or its per-remote counterpart)
    # is required for SSH remotes.
    #gitfs_pubkey: ''

    # Along with gitfs_pubkey (and optionally gitfs_passphrase), is used to
    # authenticate to SSH remotes. This parameter (or its per-remote counterpart)
    # is required for SSH remotes.
    #gitfs_privkey: ''

    # This parameter is optional, required only when the SSH key being used to
    # authenticate is protected by a passphrase.
    #gitfs_passphrase: ''

    # When using the git fileserver backend at least one git remote needs to be
    # defined. The user running the salt master will need read access to the repo.
    #
    # The repos will be searched in order to find the file requested by a client
    # and the first repo to have the file will return it.
    # When using the git backend branches and tags are translated into salt
    # environments.
    # Note: file:// repos will be treated as a remote, so refs you want used must
    # exist in that repo as *local* refs.
    #gitfs_remotes:
    #  - git://github.com/saltstack/salt-states.git
    #  - file:///var/git/saltmaster
    #
    # The gitfs_ssl_verify option specifies whether to ignore ssl certificate
    # errors when contacting the gitfs backend. You might want to set this to
    # false if you're using a git backend that uses a self-signed certificate but
    # keep in mind that setting this flag to anything other than the default of True
    # is a security concern, you may want to try using the ssh transport.
    #gitfs_ssl_verify: True
    #
    # The gitfs_root option gives the ability to serve files from a subdirectory
    # within the repository. The path is defined relative to the root of the
    # repository and defaults to the repository root.
    #gitfs_root: somefolder/otherfolder
    #
    # The refspecs fetched by gitfs remotes
    #gitfs_refspecs:
    #  - '+refs/heads/*:refs/remotes/origin/*'
    #  - '+refs/tags/*:refs/tags/*'
    #
    #
    #####         Pillar settings        #####
    ##########################################
    # Salt Pillars allow for the building of global data that can be made selectively
    # available to different minions based on minion grain filtering. The Salt
    # Pillar is laid out in the same fashion as the file server, with environments,
    # a top file and sls files. However, pillar data does not need to be in the
    # highstate format, and is generally just key/value pairs.
    #pillar_roots:
    #  base:
    #    - /srv/pillar
    #
    #ext_pillar:
    #  - hiera: /etc/hiera.yaml
    #  - cmd_yaml: cat /etc/salt/yaml

    # A list of paths to be recursively decrypted during pillar compilation.
    # Entries in this list can be formatted either as a simple string, or as a
    # key/value pair, with the key being the pillar location, and the value being
    # the renderer to use for pillar decryption. If the former is used, the
    # renderer specified by decrypt_pillar_default will be used.
    #decrypt_pillar:
    #  - 'foo:bar': gpg
    #  - 'lorem:ipsum:dolor'

    # The delimiter used to distinguish nested data structures in the
    # decrypt_pillar option.
    #decrypt_pillar_delimiter: ':'

    # The default renderer used for decryption, if one is not specified for a given
    # pillar key in decrypt_pillar.
    #decrypt_pillar_default: gpg

    # List of renderers which are permitted to be used for pillar decryption.
    #decrypt_pillar_renderers:
    #  - gpg

    # If this is `True` and the ciphertext could not be decrypted, then an error is
    # raised.
    #gpg_decrypt_must_succeed: False

    # The ext_pillar_first option allows for external pillar sources to populate
    # before file system pillar. This allows for targeting file system pillar from
    # ext_pillar.
    #ext_pillar_first: False

    # The external pillars permitted to be used on-demand using pillar.ext
    #on_demand_ext_pillar:
    #  - libvirt
    #  - virtkey

    # The pillar_gitfs_ssl_verify option specifies whether to ignore ssl certificate
    # errors when contacting the pillar gitfs backend. You might want to set this to
    # false if you're using a git backend that uses a self-signed certificate but
    # keep in mind that setting this flag to anything other than the default of True
    # is a security concern, you may want to try using the ssh transport.
    #pillar_gitfs_ssl_verify: True

    # The pillar_opts option adds the master configuration file data to a dict in
    # the pillar called "master". This is used to set simple configurations in the
    # master config file that can then be used on minions.
    #pillar_opts: False

    # The pillar_safe_render_error option prevents the master from passing pillar
    # render errors to the minion. This is set on by default because the error could
    # contain templating data which would give that minion information it shouldn't
    # have, like a password! When set true the error message will only show:
    #   Rendering SLS 'my.sls' failed. Please see master log for details.
    #pillar_safe_render_error: True

    # The pillar_source_merging_strategy option allows you to configure merging strategy
    # between different sources. It accepts five values: none, recurse, aggregate, overwrite,
    # or smart. None will not do any merging at all. Recurse will merge recursively mapping of data.
    # Aggregate instructs aggregation of elements between sources that use the #!yamlex renderer. Overwrite
    # will overwrite elements according the order in which they are processed. This is
    # behavior of the 2014.1 branch and earlier. Smart guesses the best strategy based
    # on the "renderer" setting and is the default value.
    #pillar_source_merging_strategy: smart

    # Recursively merge lists by aggregating them instead of replacing them.
    #pillar_merge_lists: False

    # Set this option to True to force the pillarenv to be the same as the effective
    # saltenv when running states. If pillarenv is specified this option will be
    # ignored.
    #pillarenv_from_saltenv: False

    # Set this option to 'True' to force a 'KeyError' to be raised whenever an
    # attempt to retrieve a named value from pillar fails. When this option is set
    # to 'False', the failed attempt returns an empty string. Default is 'False'.
    #pillar_raise_on_missing: False

    # Git External Pillar (git_pillar) Configuration Options
    #
    # Specify the provider to be used for git_pillar. Must be either pygit2 or
    # gitpython. If unset, then both will be tried in that same order, and the
    # first one with a compatible version installed will be the provider that
    # is used.
    #git_pillar_provider: pygit2

    # If the desired branch matches this value, and the environment is omitted
    # from the git_pillar configuration, then the environment for that git_pillar
    # remote will be base.
    #git_pillar_base: master

    # If the branch is omitted from a git_pillar remote, then this branch will
    # be used instead
    #git_pillar_branch: master

    # Environment to use for git_pillar remotes. This is normally derived from
    # the branch/tag (or from a per-remote env parameter), but if set this will
    # override the process of deriving the env from the branch/tag name.
    #git_pillar_env: ''

    # Path relative to the root of the repository where the git_pillar top file
    # and SLS files are located.
    #git_pillar_root: ''

    # Specifies whether or not to ignore SSL certificate errors when contacting
    # the remote repository.
    #git_pillar_ssl_verify: False

    # When set to False, if there is an update/checkout lock for a git_pillar
    # remote and the pid written to it is not running on the master, the lock
    # file will be automatically cleared and a new lock will be obtained.
    #git_pillar_global_lock: True

    # Git External Pillar Authentication Options
    #
    # Along with git_pillar_password, is used to authenticate to HTTPS remotes.
    #git_pillar_user: ''

    # Along with git_pillar_user, is used to authenticate to HTTPS remotes.
    # This parameter is not required if the repository does not use authentication.
    #git_pillar_password: ''

    # By default, Salt will not authenticate to an HTTP (non-HTTPS) remote.
    # This parameter enables authentication over HTTP.
    #git_pillar_insecure_auth: False

    # Along with git_pillar_privkey (and optionally git_pillar_passphrase),
    # is used to authenticate to SSH remotes.
    #git_pillar_pubkey: ''

    # Along with git_pillar_pubkey (and optionally git_pillar_passphrase),
    # is used to authenticate to SSH remotes.
    #git_pillar_privkey: ''

    # This parameter is optional, required only when the SSH key being used
    # to authenticate is protected by a passphrase.
    #git_pillar_passphrase: ''

    # The refspecs fetched by git_pillar remotes
    #git_pillar_refspecs:
    #  - '+refs/heads/*:refs/remotes/origin/*'
    #  - '+refs/tags/*:refs/tags/*'

    # A master can cache pillars locally to bypass the expense of having to render them
    # for each minion on every request. This feature should only be enabled in cases
    # where pillar rendering time is known to be unsatisfactory and any attendant security
    # concerns about storing pillars in a master cache have been addressed.
    #
    # When enabling this feature, be certain to read through the additional ``pillar_cache_*``
    # configuration options to fully understand the tunable parameters and their implications.
    #
    # Note: setting ``pillar_cache: True`` has no effect on targeting Minions with Pillars.
    # See https://docs.saltproject.io/en/latest/topics/targeting/pillar.html
    #pillar_cache: False

    # If and only if a master has set ``pillar_cache: True``, the cache TTL controls the amount
    # of time, in seconds, before the cache is considered invalid by a master and a fresh
    # pillar is recompiled and stored.
    # The cache TTL does not prevent pillar cache from being refreshed before its TTL expires.
    #pillar_cache_ttl: 3600

    # If and only if a master has set `pillar_cache: True`, one of several storage providers
    # can be utilized.
    #
    # `disk`: The default storage backend. This caches rendered pillars to the master cache.
    #         Rendered pillars are serialized and deserialized as msgpack structures for speed.
    #         Note that pillars are stored UNENCRYPTED. Ensure that the master cache
    #         has permissions set appropriately. (Same defaults are provided.)
    #
    # memory: [EXPERIMENTAL] An optional backend for pillar caches which uses a pure-Python
    #         in-memory data structure for maximal performance. There are several caveats,
    #         however. First, because each master worker contains its own in-memory cache,
    #         there is no guarantee of cache consistency between minion requests. This
    #         works best in situations where the pillar rarely if ever changes. Secondly,
    #         and perhaps more importantly, this means that unencrypted pillars will
    #         be accessible to any process which can examine the memory of the ``salt-master``!
    #         This may represent a substantial security risk.
    #
    #pillar_cache_backend: disk

    # A master can also cache GPG data locally to bypass the expense of having to render them
    # for each minion on every request. This feature should only be enabled in cases
    # where pillar rendering time is known to be unsatisfactory and any attendant security
    # concerns about storing decrypted GPG data in a master cache have been addressed.
    #
    # When enabling this feature, be certain to read through the additional ``gpg_cache_*``
    # configuration options to fully understand the tunable parameters and their implications.
    #gpg_cache: False

    # If and only if a master has set ``gpg_cache: True``, the cache TTL controls the amount
    # of time, in seconds, before the cache is considered invalid by a master and a fresh
    # pillar is recompiled and stored.
    #gpg_cache_ttl: 86400

    # If and only if a master has set `gpg_cache: True`, one of several storage providers
    # can be utilized. Available options are the same as ``pillar_cache_backend``.
    #gpg_cache_backend: disk

    ######        Reactor Settings        #####
    ###########################################
    # Define a salt reactor. See https://docs.saltproject.io/en/latest/topics/reactor/
    #reactor: []

    #Set the TTL for the cache of the reactor configuration.
    #reactor_refresh_interval: 60

    #Configure the number of workers for the runner/wheel in the reactor.
    #reactor_worker_threads: 10

    #Define the queue size for workers in the reactor.
    #reactor_worker_hwm: 10000

    #####          Syndic settings       #####
    ##########################################
    # The Salt syndic is used to pass commands through a master from a higher
    # master. Using the syndic is simple. If this is a master that will have
    # syndic servers(s) below it, then set the "order_masters" setting to True.
    #
    # If this is a master that will be running a syndic daemon for passthrough, then
    # the "syndic_master" setting needs to be set to the location of the master server
    # to receive commands from.

    # Set the order_masters setting to True if this master will command lower
    # masters' syndic interfaces.
    #order_masters: False

    # If this master will be running a salt syndic daemon, syndic_master tells
    # this master where to receive commands from.
    #syndic_master: masterofmasters

    # This is the 'ret_port' of the MasterOfMaster:
    #syndic_master_port: 4506

    # PID file of the syndic daemon:
    #syndic_pidfile: /var/run/salt-syndic.pid

    # The log file of the salt-syndic daemon:
    #syndic_log_file: /var/log/salt/syndic

    # The behaviour of the multi-syndic when connection to a master of masters failed.
    # Can specify ``random`` (default) or ``ordered``. If set to ``random``, masters
    # will be iterated in random order. If ``ordered`` is specified, the configured
    # order will be used.
    #syndic_failover: random

    # The number of seconds for the salt client to wait for additional syndics to
    # check in with their lists of expected minions before giving up.
    #syndic_wait: 5

    #####      Peer Publish settings     #####
    ##########################################
    # Salt minions can send commands to other minions, but only if the minion is
    # allowed to. By default "Peer Publication" is disabled, and when enabled it
    # is enabled for specific minions and specific commands. This allows secure
    # compartmentalization of commands based on individual minions.

    # The configuration uses regular expressions to match minions and then a list
    # of regular expressions to match functions. The following will allow the
    # minion authenticated as foo.example.com to execute functions from the test
    # and pkg modules.
    #peer:
    #  foo.example.com:
    #    - test.*
    #    - pkg.*
    #
    # This will allow all minions to execute all commands:
    #peer:
    #  .*:
    #    - .*
    #
    # This is not recommended, since it would allow anyone who gets root on any
    # single minion to instantly have root on all of the minions!

    # Minions can also be allowed to execute runners from the salt master.
    # Since executing a runner from the minion could be considered a security risk,
    # it needs to be enabled. This setting functions just like the peer setting
    # except that it opens up runners instead of module functions.
    #
    # All peer runner support is turned off by default and must be enabled before
    # using. This will enable all peer runners for all minions:
    #peer_run:
    #  .*:
    #    - .*
    #
    # To enable just the manage.up runner for the minion foo.example.com:
    #peer_run:
    #  foo.example.com:
    #    - manage.up
    #
    #
    #####         Mine settings     #####
    #####################################
    # Restrict mine.get access from minions. By default any minion has a full access
    # to get all mine data from master cache. In acl definion below, only pcre matches
    # are allowed.
    # mine_get:
    #   .*:
    #     - .*
    #
    # The example below enables minion foo.example.com to get 'network.interfaces' mine
    # data only, minions web* to get all network.* and disk.* mine data and all other
    # minions won't get any mine data.
    # mine_get:
    #   foo.example.com:
    #     - network.interfaces
    #   web.*:
    #     - network.*
    #     - disk.*

    #####         Logging settings       #####
    ##########################################
    # The location of the master log file
    # The master log can be sent to a regular file, local path name, or network
    # location. Remote logging works best when configured to use rsyslogd(8) (e.g.:
    # ``file:///dev/log``), with rsyslogd(8) configured for network logging. The URI
    # format is: <file|udp|tcp>://<host|socketpath>:<port-if-required>/<log-facility>
    #log_file: /var/log/salt/master
    #log_file: file:///dev/log
    #log_file: udp://loghost:10514

    #log_file: /var/log/salt/master
    #key_logfile: /var/log/salt/key

    # The level of messages to send to the console.
    # One of 'garbage', 'trace', 'debug', info', 'warning', 'error', 'critical'.
    #
    # The following log levels are considered INSECURE and may log sensitive data:
    # ['profile', 'garbage', 'trace', 'debug', 'all']
    #
    #log_level: warning

    # The level of messages to send to the log file.
    # One of 'garbage', 'trace', 'debug', 'info', 'warning', 'error', 'critical'.
    # If using 'log_granular_levels' this must be set to the highest desired level.
    #log_level_logfile: warning

    # The date and time format used in log messages. Allowed date/time formatting
    # can be seen here: http://docs.python.org/library/time.html#time.strftime
    #log_datefmt: '%H:%M:%S'
    #log_datefmt_logfile: '%Y-%m-%d %H:%M:%S'

    # The format of the console logging messages. Allowed formatting options can
    # be seen here: http://docs.python.org/library/logging.html#logrecord-attributes
    #
    # Console log colors are specified by these additional formatters:
    #
    # %(colorlevel)s
    # %(colorname)s
    # %(colorprocess)s
    # %(colormsg)s
    #
    # Since it is desirable to include the surrounding brackets, '[' and ']', in
    # the coloring of the messages, these color formatters also include padding as
    # well.  Color LogRecord attributes are only available for console logging.
    #
    #log_fmt_console: '%(colorlevel)s %(colormsg)s'
    #log_fmt_console: '[%(levelname)-8s] %(message)s'
    #
    #log_fmt_logfile: '%(asctime)s,%(msecs)03d [%(name)-17s][%(levelname)-8s] %(message)s'

    # This can be used to control logging levels more specificically.  This
    # example sets the main salt library at the 'warning' level, but sets
    # 'salt.modules' to log at the 'debug' level:
    #   log_granular_levels:
    #     'salt': 'warning'
    #     'salt.modules': 'debug'
    #
    #log_granular_levels: {}

    #####         Node Groups           ######
    ##########################################
    # Node groups allow for logical groupings of minion nodes. A group consists of
    # a group name and a compound target. Nodgroups can reference other nodegroups
    # with 'N@' classifier. Ensure that you do not have circular references.
    #
    #nodegroups:
    #  group1: 'L@foo.domain.com,bar.domain.com,baz.domain.com or bl*.domain.com'
    #  group2: 'G@os:Debian and foo.domain.com'
    #  group3: 'G@os:Debian and N@group1'
    #  group4:
    #    - 'G@foo:bar'
    #    - 'or'
    #    - 'G@foo:baz'

    #####     Range Cluster settings     #####
    ##########################################
    # The range server (and optional port) that serves your cluster information
    # https://github.com/ytoolshed/range/wiki/%22yamlfile%22-module-file-spec
    #
    #range_server: range:80

    #####  Windows Software Repo settings #####
    ###########################################
    # Location of the repo on the master:
    #winrepo_dir_ng: '/srv/salt/win/repo-ng'
    #
    # List of git repositories to include with the local repo:
    #winrepo_remotes_ng:
    #  - 'https://github.com/saltstack/salt-winrepo-ng.git'

    #####  Windows Software Repo settings - Pre 2015.8 #####
    ########################################################
    # Legacy repo settings for pre-2015.8 Windows minions.
    #
    # Location of the repo on the master:
    #winrepo_dir: '/srv/salt/win/repo'
    #
    # Location of the master's repo cache file:
    #winrepo_mastercachefile: '/srv/salt/win/repo/winrepo.p'
    #
    # List of git repositories to include with the local repo:
    #winrepo_remotes:
    #  - 'https://github.com/saltstack/salt-winrepo.git'

    # The refspecs fetched by winrepo remotes
    #winrepo_refspecs:
    #  - '+refs/heads/*:refs/remotes/origin/*'
    #  - '+refs/tags/*:refs/tags/*'
    #

    #####      Returner settings          ######
    ############################################
    # Which returner(s) will be used for minion's result:
    #return: mysql

    ######    Miscellaneous  settings     ######
    ############################################
    # Default match type for filtering events tags: startswith, endswith, find, regex, fnmatch
    #event_match_type: startswith

    # Save runner returns to the job cache
    #runner_returns: True

    # Permanently include any available Python 3rd party modules into thin and minimal Salt
    # when they are generated for Salt-SSH or other purposes.
    # The modules should be named by the names they are actually imported inside the Python.
    # The value of the parameters can be either one module or a comma separated list of them.
    #thin_extra_mods: foo,bar
    #min_extra_mods: foo,bar,baz

    ######      Keepalive settings        ######
    ############################################
    # Warning: Failure to set TCP keepalives on the salt-master can result in
    # not detecting the loss of a minion when the connection is lost or when
    # its host has been terminated without first closing the socket.
    # Salt's Presence System depends on this connection status to know if a minion
    # is "present".
    # ZeroMQ now includes support for configuring SO_KEEPALIVE if supported by
    # the OS. If connections between the minion and the master pass through
    # a state tracking device such as a firewall or VPN gateway, there is
    # the risk that it could tear down the connection the master and minion
    # without informing either party that their connection has been taken away.
    # Enabling TCP Keepalives prevents this from happening.

    # Overall state of TCP Keepalives, enable (1 or True), disable (0 or False)
    # or leave to the OS defaults (-1), on Linux, typically disabled. Default True, enabled.
    #tcp_keepalive: True

    # How long before the first keepalive should be sent in seconds. Default 300
    # to send the first keepalive after 5 minutes, OS default (-1) is typically 7200 seconds
    # on Linux see /proc/sys/net/ipv4/tcp_keepalive_time.
    #tcp_keepalive_idle: 300

    # How many lost probes are needed to consider the connection lost. Default -1
    # to use OS defaults, typically 9 on Linux, see /proc/sys/net/ipv4/tcp_keepalive_probes.
    #tcp_keepalive_cnt: -1

    # How often, in seconds, to send keepalives after the first one. Default -1 to
    # use OS defaults, typically 75 seconds on Linux, see
    # /proc/sys/net/ipv4/tcp_keepalive_intvl.
    #tcp_keepalive_intvl: -1

    #####         NetAPI settings          #####
    ############################################
    # Allow the raw_shell parameter to be used when calling Salt SSH client via API
    #netapi_allow_raw_shell: True

    # Set a list of clients to enable in in the API
    #netapi_enable_clients: []

    #####          Master Cluster Settings          #####
    #####################################################
    # Settings for configuring salt master to work in a cluster configuration behind
    # a load balancer.

    # When defined, the master will operate in cluster mode. The master will send
    # the cluster key and id to minions instead of its own key and id. The master
    # will also forward its local event bus to other masters defined by
    # ``cluster_peers``
    #cluster_id: master_cluster

    # Defines the other masters in the cluster. Can be IP addresses or hostnames
    #cluster_peers:
    #  - master 2
    #  - master 3

    # When ``cluster_pki_dir`` is defined, this sets the location of where this
    # cluster will store its cluster public and private key as well as any minion
    # keys. This setting will default to the value of ``pki_dir``, but should be
    # changed to the filesystem location shared between peers in the cluster.
    #cluster_pki_dir: /my/gluster/share/pki

    # The port required to be open for a master cluster to properly function
    #cluster_pool_port: 4520

## Example minion configuration file

    ##### Primary configuration settings #####
    ##########################################
    # This configuration file is used to manage the behavior of the Salt Minion.
    # With the exception of the location of the Salt Master Server, values that are
    # commented out but have an empty line after the comment are defaults that need
    # not be set in the config. If there is no blank line after the comment, the
    # value is presented as an example and is not the default.

    # Per default the minion will automatically include all config files
    # from minion.d/*.conf (minion.d is a directory in the same directory
    # as the main minion config file).
    #default_include: minion.d/*.conf

    # Set the location of the salt master server. If the master server cannot be
    # resolved, then the minion will fail to start.
    #master: salt

    # Set http proxy information for the minion when doing requests
    #proxy_host:
    #proxy_port:
    #proxy_username:
    #proxy_password:

    # List of hosts to bypass HTTP proxy. This key does nothing unless proxy_host etc is
    # configured, it does not support any kind of wildcards.
    #no_proxy: []

    # If multiple masters are specified in the 'master' setting, the default behavior
    # is to always try to connect to them in the order they are listed. If random_master
    # is set to True, the order will be randomized upon Minion startup instead. This can
    # be helpful in distributing the load of many minions executing salt-call requests,
    # for example, from a cron job. If only one master is listed, this setting is ignored
    # and a warning will be logged.
    #random_master: False

    # NOTE: Deprecated in Salt 2019.2.0. Use 'random_master' instead.
    #master_shuffle: False

    # Minions can connect to multiple masters simultaneously (all masters
    # are "hot"), or can be configured to failover if a master becomes
    # unavailable.  Multiple hot masters are configured by setting this
    # value to "str".  Failover masters can be requested by setting
    # to "failover".  MAKE SURE TO SET master_alive_interval if you are
    # using failover.
    # Setting master_type to 'disable' lets you have a running minion (with engines and
    # beacons) without a master connection
    # master_type: str

    # Poll interval in seconds for checking if the master is still there.  Only
    # respected if master_type above is "failover". To disable the interval entirely,
    # set the value to -1. (This may be necessary on machines which have high numbers
    # of TCP connections, such as load balancers.)
    # master_alive_interval: 30

    # If the minion is in multi-master mode and the master_type configuration option
    # is set to "failover", this setting can be set to "True" to force the minion
    # to fail back to the first master in the list if the first master is back online.
    #master_failback: False

    # If the minion is in multi-master mode, the "master_type" configuration is set to
    # "failover", and the "master_failback" option is enabled, the master failback
    # interval can be set to ping the top master with this interval, in seconds.
    #master_failback_interval: 0

    # Set whether the minion should connect to the master via IPv6:
    #ipv6: False

    # Set the number of seconds to wait before attempting to resolve
    # the master hostname if name resolution fails. Defaults to 30 seconds.
    # Set to zero if the minion should shutdown and not retry.
    # retry_dns: 30

    # Set the number of times to attempt to resolve
    # the master hostname if name resolution fails. Defaults to None,
    # which will attempt the resolution indefinitely.
    # retry_dns_count: 3

    # Set the port used by the master reply and authentication server.
    #master_port: 4506

    # The user to run salt.
    #user: root

    # The user to run salt remote execution commands as via sudo. If this option is
    # enabled then sudo will be used to change the active user executing the remote
    # command. If enabled the user will need to be allowed access via the sudoers
    # file for the user that the salt minion is configured to run as. The most
    # common option would be to use the root user. If this option is set the user
    # option should also be set to a non-root user. If migrating from a root minion
    # to a non root minion the minion cache should be cleared and the minion pki
    # directory will need to be changed to the ownership of the new user.
    #sudo_user: root

    # Specify the location of the daemon process ID file.
    #pidfile: /var/run/salt-minion.pid

    # The root directory prepended to these options: pki_dir, cachedir, log_file,
    # sock_dir, pidfile.
    #root_dir: /

    # The path to the minion's configuration file.
    #conf_file: /etc/salt/minion

    # The directory to store the pki information in
    #pki_dir: /etc/salt/pki/minion

    # Explicitly declare the id for this minion to use, if left commented the id
    # will be the hostname as returned by the python call: socket.getfqdn()
    # Since salt uses detached ids it is possible to run multiple minions on the
    # same machine but with different ids, this can be useful for salt compute
    # clusters.
    #id:

    # Cache the minion id to a file when the minion's id is not statically defined
    # in the minion config. Defaults to "True". This setting prevents potential
    # problems when automatic minion id resolution changes, which can cause the
    # minion to lose connection with the master. To turn off minion id caching,
    # set this config to ``False``.
    #minion_id_caching: True

    # Convert minion id to lowercase when it is being generated. Helpful when some
    # hosts get the minion id in uppercase. Cached ids will remain the same and
    # not converted. For example, Windows minions often have uppercase minion
    # names when they are set up but not always. To turn on, set this config to
    # ``True``.
    #minion_id_lowercase: False

    # Append a domain to a hostname in the event that it does not exist.  This is
    # useful for systems where socket.getfqdn() does not actually result in a
    # FQDN (for instance, Solaris).
    #append_domain:

    # Custom static grains for this minion can be specified here and used in SLS
    # files just like all other grains. This example sets 4 custom grains, with
    # the 'roles' grain having two values that can be matched against.
    #grains:
    #  roles:
    #    - webserver
    #    - memcache
    #  deployment: datacenter4
    #  cabinet: 13
    #  cab_u: 14-15
    #
    # Where cache data goes.
    # This data may contain sensitive data and should be protected accordingly.
    #cachedir: /var/cache/salt/minion

    # Append minion_id to these directories.  Helps with
    # multiple proxies and minions running on the same machine.
    # Allowed elements in the list: pki_dir, cachedir, extension_modules
    # Normally not needed unless running several proxies and/or minions on the same machine
    # Defaults to ['cachedir'] for proxies, [] (empty list) for regular minions
    #append_minionid_config_dirs:

    # Verify and set permissions on configuration directories at startup.
    #verify_env: True

    # The minion can locally cache the return data from jobs sent to it, this
    # can be a good way to keep track of jobs the minion has executed
    # (on the minion side). By default this feature is disabled, to enable, set
    # cache_jobs to True.
    #cache_jobs: False

    # Set the directory used to hold unix sockets.
    #sock_dir: /var/run/salt/minion

    # In order to calculate the fqdns grain, all the IP addresses from the minion
    # are processed with underlying calls to `socket.gethostbyaddr` which can take
    # 5 seconds to be released (after reaching `socket.timeout`) when there is no
    # fqdn for that IP. These calls to `socket.gethostbyaddr` are processed
    # asynchronously, however, it still adds 5 seconds every time grains are
    # generated if an IP does not resolve. In Windows grains are regenerated each
    # time a new process is spawned. Therefore, the default for Windows is `False`.
    # On macOS, FQDN resolution can be very slow, therefore the default for macOS is
    # `False` as well. All other OSes default to `True`
    # enable_fqdns_grains: True

    # The minion can take a while to start up when lspci and/or dmidecode is used
    # to populate the grains for the minion. Set this to False if you do not need
    # GPU hardware grains for your minion.
    # enable_gpu_grains: True

    # Set the default outputter used by the salt-call command. The default is
    # "nested".
    #output: nested

    # To set a list of additional directories to search for salt outputters, set the
    # outputter_dirs option.
    #outputter_dirs: []

    # By default output is colored. To disable colored output, set the color value
    # to False.
    #color: True

    # Do not strip off the colored output from nested results and state outputs
    # (true by default).
    # strip_colors: False

    # Backup files that are replaced by file.managed and file.recurse under
    # 'cachedir'/file_backup relative to their original location and appended
    # with a timestamp. The only valid setting is "minion". Disabled by default.
    #
    # Alternatively this can be specified for each file in state files:
    # /etc/ssh/sshd_config:
    #   file.managed:
    #     - source: salt://ssh/sshd_config
    #     - backup: minion
    #
    #backup_mode: minion

    # When waiting for a master to accept the minion's public key, salt will
    # continuously attempt to reconnect until successful. This is the time, in
    # seconds, between those reconnection attempts.
    #acceptance_wait_time: 10

    # If this is nonzero, the time between reconnection attempts will increase by
    # acceptance_wait_time seconds per iteration, up to this maximum. If this is
    # set to zero, the time between reconnection attempts will stay constant.
    #acceptance_wait_time_max: 0

    # If the master rejects the minion's public key, retry instead of exiting.
    # Rejected keys will be handled the same as waiting on acceptance.
    #rejected_retry: False

    # When the master key changes, the minion will try to re-auth itself to receive
    # the new master key. In larger environments this can cause a SYN flood on the
    # master because all minions try to re-auth immediately. To prevent this and
    # have a minion wait for a random amount of time, use this optional parameter.
    # The wait-time will be a random number of seconds between 0 and the defined value.
    #random_reauth_delay: 60

    # To avoid overloading a master when many minions startup at once, a randomized
    # delay may be set to tell the minions to wait before connecting to the master.
    # This value is the number of seconds to choose from for a random number. For
    # example, setting this value to 60 will choose a random number of seconds to delay
    # on startup between zero seconds and sixty seconds. Setting to '0' will disable
    # this feature.
    #random_startup_delay: 0

    # When waiting for a master to accept the minion's public key, salt will
    # continuously attempt to reconnect until successful. This is the timeout value,
    # in seconds, for each individual attempt. After this timeout expires, the minion
    # will wait for acceptance_wait_time seconds before trying again. Unless your master
    # is under unusually heavy load, this should be left at the default.
    #auth_timeout: 60

    # Number of consecutive SaltReqTimeoutError that are acceptable when trying to
    # authenticate.
    #auth_tries: 7

    # The number of attempts to connect to a master before giving up.
    # Set this to -1 for unlimited attempts. This allows for a master to have
    # downtime and the minion to reconnect to it later when it comes back up.
    # In 'failover' mode, it is the number of attempts for each set of masters.
    # In this mode, it will cycle through the list of masters for each attempt.
    #
    # This is different than auth_tries because auth_tries attempts to
    # retry auth attempts with a single master. auth_tries is under the
    # assumption that you can connect to the master but not gain
    # authorization from it. master_tries will still cycle through all
    # the masters in a given try, so it is appropriate if you expect
    # occasional downtime from the master(s).
    #master_tries: 1

    # If authentication fails due to SaltReqTimeoutError during a ping_interval,
    # cause sub minion process to restart.
    #auth_safemode: False

    # Ping Master to ensure connection is alive (minutes).
    #ping_interval: 0

    # To auto recover minions if master changes IP address (DDNS)
    #    master_alive_interval: 10
    #    master_tries: -1
    #
    # Minions won't know master is missing until a ping fails. After the ping fail,
    # the minion will attempt authentication and likely fails out and cause a restart.
    # When the minion restarts it will resolve the masters IP and attempt to reconnect.

    # If you don't have any problems with syn-floods, don't bother with the
    # three recon_* settings described below, just leave the defaults!
    #
    # The ZeroMQ pull-socket that binds to the masters publishing interface tries
    # to reconnect immediately, if the socket is disconnected (for example if
    # the master processes are restarted). In large setups this will have all
    # minions reconnect immediately which might flood the master (the ZeroMQ-default
    # is usually a 100ms delay). To prevent this, these three recon_* settings
    # can be used.
    # recon_default: the interval in milliseconds that the socket should wait before
    #                trying to reconnect to the master (1000ms = 1 second)
    #
    # recon_max: the maximum time a socket should wait. each interval the time to wait
    #            is calculated by doubling the previous time. if recon_max is reached,
    #            it starts again at recon_default. Short example:
    #
    #            reconnect 1: the socket will wait 'recon_default' milliseconds
    #            reconnect 2: 'recon_default' * 2
    #            reconnect 3: ('recon_default' * 2) * 2
    #            reconnect 4: value from previous interval * 2
    #            reconnect 5: value from previous interval * 2
    #            reconnect x: if value >= recon_max, it starts again with recon_default
    #
    # recon_randomize: generate a random wait time on minion start. The wait time will
    #                  be a random value between recon_default and recon_default +
    #                  recon_max. Having all minions reconnect with the same recon_default
    #                  and recon_max value kind of defeats the purpose of being able to
    #                  change these settings. If all minions have the same values and your
    #                  setup is quite large (several thousand minions), they will still
    #                  flood the master. The desired behavior is to have timeframe within
    #                  all minions try to reconnect.
    #
    # Example on how to use these settings. The goal: have all minions reconnect within a
    # 60 second timeframe on a disconnect.
    # recon_default: 1000
    # recon_max: 59000
    # recon_randomize: True
    #
    # Each minion will have a randomized reconnect value between 'recon_default'
    # and 'recon_default + recon_max', which in this example means between 1000ms
    # 60000ms (or between 1 and 60 seconds). The generated random-value will be
    # doubled after each attempt to reconnect. Lets say the generated random
    # value is 11 seconds (or 11000ms).
    # reconnect 1: wait 11 seconds
    # reconnect 2: wait 22 seconds
    # reconnect 3: wait 33 seconds
    # reconnect 4: wait 44 seconds
    # reconnect 5: wait 55 seconds
    # reconnect 6: wait time is bigger than 60 seconds (recon_default + recon_max)
    # reconnect 7: wait 11 seconds
    # reconnect 8: wait 22 seconds
    # reconnect 9: wait 33 seconds
    # reconnect x: etc.
    #
    # In a setup with ~6000 hosts these settings would average the reconnects
    # to about 100 per second and all hosts would be reconnected within 60 seconds.
    # recon_default: 100
    # recon_max: 5000
    # recon_randomize: False
    #
    #
    # The loop_interval sets how long in seconds the minion will wait between
    # evaluating the scheduler and running cleanup tasks.  This defaults to 1
    # second on the minion scheduler.
    #loop_interval: 1

    # Some installations choose to start all job returns in a cache or a returner
    # and forgo sending the results back to a master. In this workflow, jobs
    # are most often executed with --async from the Salt CLI and then results
    # are evaluated by examining job caches on the minions or any configured returners.
    # WARNING: Setting this to False will **disable** returns back to the master.
    #pub_ret: True

    # The grains can be merged, instead of overridden, using this option.
    # This allows custom grains to defined different subvalues of a dictionary
    # grain. By default this feature is disabled, to enable set grains_deep_merge
    # to ``True``.
    #grains_deep_merge: False

    # The grains_refresh_every setting allows for a minion to periodically check
    # its grains to see if they have changed and, if so, to inform the master
    # of the new grains. This operation is moderately expensive, therefore
    # care should be taken not to set this value too low.
    #
    # Note: This value is expressed in __minutes__!
    #
    # A value of 10 minutes is a reasonable default.
    #
    # If the value is set to zero, this check is disabled.
    #grains_refresh_every: 1

    # The grains_refresh_pre_exec setting allows for a minion to check its grains
    # prior to the execution of any operation to see if they have changed and, if
    # so, to inform the master of the new grains. This operation is moderately
    # expensive, therefore care should be taken before enabling this behavior.
    #grains_refresh_pre_exec: False

    # Cache grains on the minion. Default is False.
    #grains_cache: False

    # Cache rendered pillar data on the minion. Default is False.
    # This may cause 'cachedir'/pillar to contain sensitive data that should be
    # protected accordingly.
    #minion_pillar_cache: False

    # Grains cache expiration, in seconds. If the cache file is older than this
    # number of seconds then the grains cache will be dumped and fully re-populated
    # with fresh data. Defaults to 5 minutes. Will have no effect if 'grains_cache'
    # is not enabled.
    # grains_cache_expiration: 300

    # Determines whether or not the salt minion should run scheduled mine updates.
    # Defaults to "True". Set to "False" to disable the scheduled mine updates
    # (this essentially just does not add the mine update function to the minion's
    # scheduler).
    #mine_enabled: True

    # Determines whether or not scheduled mine updates should be accompanied by a job
    # return for the job cache. Defaults to "False". Set to "True" to include job
    # returns in the job cache for mine updates.
    #mine_return_job: False

    # Example functions that can be run via the mine facility
    # NO mine functions are established by default.
    # Note these can be defined in the minion's pillar as well.
    #mine_functions:
    #  test.ping: []
    #  network.ip_addrs:
    #    interface: eth0
    #    cidr: '10.0.0.0/8'

    # The number of minutes between mine updates.
    #mine_interval: 60

    # Windows platforms lack posix IPC and must rely on slower TCP based inter-
    # process communications.  ipc_mode is set to 'tcp' on such systems.
    #ipc_mode: ipc

    # Overwrite the default tcp ports used by the minion when ipc_mode is set to 'tcp'
    #tcp_pub_port: 4510
    #tcp_pull_port: 4511

    # Passing very large events can cause the minion to consume large amounts of
    # memory. This value tunes the maximum size of a message allowed onto the
    # minion event bus. The value is expressed in bytes.
    #max_event_size: 1048576

    # When a minion starts up it sends a notification on the event bus with a tag
    # that looks like this: `salt/minion/<minion_id>/start`. For historical reasons
    # the minion also sends a similar event with an event tag like this:
    # `minion_start`. This duplication can cause a lot of clutter on the event bus
    # when there are many minions. Set `enable_legacy_startup_events: False` in the
    # minion config to ensure only the `salt/minion/<minion_id>/start` events are
    # sent. Beginning with the `Sodium` Salt release this option will default to
    # `False`
    #enable_legacy_startup_events: True

    # To detect failed master(s) and fire events on connect/disconnect, set
    # master_alive_interval to the number of seconds to poll the masters for
    # connection events.
    #
    #master_alive_interval: 30

    # The minion can include configuration from other files. To enable this,
    # pass a list of paths to this option. The paths can be either relative or
    # absolute; if relative, they are considered to be relative to the directory
    # the main minion configuration file lives in (this file). Paths can make use
    # of shell-style globbing. If no files are matched by a path passed to this
    # option then the minion will log a warning message.
    #
    # Include a config file from some other path:
    # include: /etc/salt/extra_config
    #
    # Include config from several files and directories:
    #include:
    #  - /etc/salt/extra_config
    #  - /etc/roles/webserver

    # The syndic minion can verify that it is talking to the correct master via the
    # key fingerprint of the higher-level master with the "syndic_finger" config.
    #syndic_finger: ''
    #
    #
    #
    #####   Minion module management     #####
    ##########################################
    # Disable specific modules. This allows the admin to limit the level of
    # access the master has to the minion.  The default here is the empty list,
    # below is an example of how this needs to be formatted in the config file
    #disable_modules:
    #  - cmdmod
    #  - test
    #disable_returners: []

    # This is the reverse of disable_modules.  The default, like disable_modules, is the empty list,
    # but if this option is set to *anything* then *only* those modules will load.
    # Note that this is a very large hammer and it can be quite difficult to keep the minion working
    # the way you think it should since Salt uses many modules internally itself.  At a bare minimum
    # you need the following enabled or else the minion won't start.
    #whitelist_modules:
    #  - cmdmod
    #  - test
    #  - config

    # Modules can be loaded from arbitrary paths. This enables the easy deployment
    # of third party modules. Modules for returners and minions can be loaded.
    # Specify a list of extra directories to search for minion modules and
    # returners. These paths must be fully qualified!
    #module_dirs: []
    #returner_dirs: []
    #states_dirs: []
    #render_dirs: []
    #utils_dirs: []
    #
    # A module provider can be statically overwritten or extended for the minion
    # via the providers option, in this case the default module will be
    # overwritten by the specified module. In this example the pkg module will
    # be provided by the yumpkg5 module instead of the system default.
    #providers:
    #  pkg: yumpkg5
    #
    # Enable Cython modules searching and loading. (Default: False)
    #cython_enable: False
    #
    # Specify a max size (in bytes) for modules on import. This feature is currently
    # only supported on *nix operating systems and requires psutil.
    # modules_max_memory: -1

    #####    State Management Settings    #####
    ###########################################
    # The default renderer to use in SLS files. This is configured as a
    # pipe-delimited expression. For example, jinja|yaml will first run jinja
    # templating on the SLS file, and then load the result as YAML. This syntax is
    # documented in further depth at the following URL:
    #
    # https://docs.saltproject.io/en/latest/ref/renderers/#composing-renderers
    #
    # NOTE: The "shebang" prefix (e.g. "#!jinja|yaml") described in the
    # documentation linked above is for use in an SLS file to override the default
    # renderer, it should not be used when configuring the renderer here.
    #
    #renderer: jinja|yaml
    #
    # The failhard option tells the minions to stop immediately after the first
    # failure detected in the state execution. Defaults to False.
    #failhard: False
    #
    # Reload the modules prior to a highstate run.
    #autoload_dynamic_modules: True
    #
    # clean_dynamic_modules keeps the dynamic modules on the minion in sync with
    # the dynamic modules on the master, this means that if a dynamic module is
    # not on the master it will be deleted from the minion. By default, this is
    # enabled and can be disabled by changing this value to False.
    #clean_dynamic_modules: True
    #
    # Renamed from ``environment`` to ``saltenv``. If ``environment`` is used,
    # ``saltenv`` will take its value. If both are used, ``environment`` will be
    # ignored and ``saltenv`` will be used.
    # Normally the minion is not isolated to any single environment on the master
    # when running states, but the environment can be isolated on the minion side
    # by statically setting it. Remember that the recommended way to manage
    # environments is to isolate via the top file.
    #saltenv: None
    #
    # Isolates the pillar environment on the minion side. This functions the same
    # as the environment setting, but for pillar instead of states.
    #pillarenv: None
    #
    # Set this option to True to force the pillarenv to be the same as the
    # effective saltenv when running states. Note that if pillarenv is specified,
    # this option will be ignored.
    #pillarenv_from_saltenv: False
    #
    # Set this option to 'True' to force a 'KeyError' to be raised whenever an
    # attempt to retrieve a named value from pillar fails. When this option is set
    # to 'False', the failed attempt returns an empty string. Default is 'False'.
    #pillar_raise_on_missing: False
    #
    # If using the local file directory, then the state top file name needs to be
    # defined, by default this is top.sls.
    #state_top: top.sls
    #
    # Run states when the minion daemon starts. To enable, set startup_states to:
    # 'highstate' -- Execute state.highstate
    # 'sls' -- Read in the sls_list option and execute the named sls files
    # 'top' -- Read top_file option and execute based on that file on the Master
    #startup_states: ''
    #
    # List of states to run when the minion starts up if startup_states is 'sls':
    #sls_list:
    #  - edit.vim
    #  - hyper
    #
    # List of grains to pass in start event when minion starts up:
    #start_event_grains:
    #  - machine_id
    #  - uuid
    #
    # Top file to execute if startup_states is 'top':
    #top_file: ''

    # Automatically aggregate all states that have support for mod_aggregate by
    # setting to True. Or pass a list of state module names to automatically
    # aggregate just those types.
    #
    # state_aggregate:
    #   - pkg
    #
    #state_aggregate: False

    # Instead of failing immediately when another state run is in progress, a value
    # of True will queue the new state run to begin running once the other has
    # finished. This option starts a new thread for each queued state run, so use
    # this option sparingly. Additionally, it can be set to an integer representing
    # the maximum queue size which can be attained before the state runs will fail
    # to be queued. This can prevent runaway conditions where new threads are
    # started until system performance is hampered.
    #
    #state_queue: False

    # Disable requisites during state runs by specifying a single requisite
    # or a list of requisites to disable.
    #
    # disabled_requisites: require_in
    #
    # disabled_requisites:
    #     - require
    #     - require_in

    # If set, this parameter expects a dictionary of state module names as keys
    # and list of conditions which must be satisfied in order to run any functions
    # in that state module.
    #
    #global_state_conditions:
    #  "*": ["G@global_noop:false"]
    #  service: ["not G@virtual_subtype:chroot"]

    #####     File Directory Settings    #####
    ##########################################
    # The Salt Minion can redirect all file server operations to a local directory,
    # this allows for the same state tree that is on the master to be used if
    # copied completely onto the minion. This is a literal copy of the settings on
    # the master but used to reference a local directory on the minion.

    # Set the file client. The client defaults to looking on the master server for
    # files, but can be directed to look at the local file directory setting
    # defined below by setting it to "local". Setting a local file_client runs the
    # minion in masterless mode.
    #file_client: remote

    # The file directory works on environments passed to the minion, each environment
    # can have multiple root directories, the subdirectories in the multiple file
    # roots cannot match, otherwise the downloaded files will not be able to be
    # reliably ensured. A base environment is required to house the top file.
    # Example:
    # file_roots:
    #   base:
    #     - /srv/salt/
    #   dev:
    #     - /srv/salt/dev/services
    #     - /srv/salt/dev/states
    #   prod:
    #     - /srv/salt/prod/services
    #     - /srv/salt/prod/states
    #
    #file_roots:
    #  base:
    #    - /srv/salt

    # Uncomment the line below if you do not want the file_server to follow
    # symlinks when walking the filesystem tree. This is set to True
    # by default. Currently this only applies to the default roots
    # fileserver_backend.
    #fileserver_followsymlinks: False
    #
    # Uncomment the line below if you do not want symlinks to be
    # treated as the files they are pointing to. By default this is set to
    # False. By uncommenting the line below, any detected symlink while listing
    # files on the Master will not be returned to the Minion.
    #fileserver_ignoresymlinks: True
    #
    # The hash_type is the hash to use when discovering the hash of a file on
    # the local fileserver. The default is sha256, but md5, sha1, sha224, sha384
    # and sha512 are also supported.
    #
    # WARNING: While md5 and sha1 are also supported, do not use them due to the
    # high chance of possible collisions and thus security breach.
    #
    # Warning: Prior to changing this value, the minion should be stopped and all
    # Salt caches should be cleared.
    #hash_type: sha256

    # The Salt pillar is searched for locally if file_client is set to local. If
    # this is the case, and pillar data is defined, then the pillar_roots need to
    # also be configured on the minion:
    #pillar_roots:
    #  base:
    #    - /srv/pillar

    # If this is `True` and the ciphertext could not be decrypted, then an error is
    # raised.
    #gpg_decrypt_must_succeed: False

    # Set a hard-limit on the size of the files that can be pushed to the master.
    # It will be interpreted as megabytes. Default: 100
    #file_recv_max_size: 100
    #
    #
    ######        Security settings       #####
    ###########################################
    # Enable "open mode", this mode still maintains encryption, but turns off
    # authentication, this is only intended for highly secure environments or for
    # the situation where your keys end up in a bad state. If you run in open mode
    # you do so at your own risk!
    #open_mode: False

    # The size of key that should be generated when creating new keys.
    #keysize: 2048

    # Enable permissive access to the salt keys.  This allows you to run the
    # master or minion as root, but have a non-root group be given access to
    # your pki_dir.  To make the access explicit, root must belong to the group
    # you've given access to. This is potentially quite insecure.
    #permissive_pki_access: False

    # The state_verbose and state_output settings can be used to change the way
    # state system data is printed to the display. By default all data is printed.
    # The state_verbose setting can be set to True or False, when set to False
    # all data that has a result of True and no changes will be suppressed.
    #state_verbose: True

    # The state_output setting controls which results will be output full multi line
    # full, terse - each state will be full/terse
    # mixed - only states with errors will be full
    # changes - states with changes and errors will be full
    # full_id, mixed_id, changes_id and terse_id are also allowed;
    # when set, the state ID will be used as name in the output
    #state_output: full

    # The state_output_diff setting changes whether or not the output from
    # successful states is returned. Useful when even the terse output of these
    # states is cluttering the logs. Set it to True to ignore them.
    #state_output_diff: False

    # The state_output_profile setting changes whether profile information
    # will be shown for each state run.
    #state_output_profile: True

    # The state_output_pct setting changes whether success and failure information
    # as a percent of total actions will be shown for each state run.
    #state_output_pct: False

    # The state_compress_ids setting aggregates information about states which have
    # multiple "names" under the same state ID in the highstate output.
    #state_compress_ids: False

    # Fingerprint of the master public key to validate the identity of your Salt master
    # before the initial key exchange. The master fingerprint can be found by running
    # "salt-key -f master.pub" on the Salt master.
    #master_finger: ''

    # Use TLS/SSL encrypted connection between master and minion.
    # Can be set to a dictionary containing keyword arguments corresponding to Python's
    # 'ssl.wrap_socket' method.
    # Default is None.
    #ssl:
    #    keyfile: <path_to_keyfile>
    #    certfile: <path_to_certfile>
    #    ssl_version: PROTOCOL_TLSv1_2

    # Grains to be sent to the master on authentication to check if the minion's key
    # will be accepted automatically. Needs to be configured on the master.
    #autosign_grains:
    #  - uuid
    #  - server_id

    ######        Reactor Settings        #####
    ###########################################
    # Define a salt reactor. See https://docs.saltproject.io/en/latest/topics/reactor/
    #reactor: []

    #Set the TTL for the cache of the reactor configuration.
    #reactor_refresh_interval: 60

    #Configure the number of workers for the runner/wheel in the reactor.
    #reactor_worker_threads: 10

    #Define the queue size for workers in the reactor.
    #reactor_worker_hwm: 10000

    ######         Thread settings        #####
    ###########################################
    # Disable multiprocessing support, by default when a minion receives a
    # publication a new process is spawned and the command is executed therein.
    #
    # WARNING: Disabling multiprocessing may result in substantial slowdowns
    # when processing large pillars. See https://github.com/saltstack/salt/issues/38758
    # for a full explanation.
    #multiprocessing: True

    # Limit the maximum amount of processes or threads created by salt-minion.
    # This is useful to avoid resource exhaustion in case the minion receives more
    # publications than it is able to handle, as it limits the number of spawned
    # processes or threads. -1 is the default and disables the limit.
    #process_count_max: -1

    #####         Logging settings       #####
    ##########################################
    # The location of the minion log file
    # The minion log can be sent to a regular file, local path name, or network
    # location. Remote logging works best when configured to use rsyslogd(8) (e.g.:
    # ``file:///dev/log``), with rsyslogd(8) configured for network logging. The URI
    # format is: <file|udp|tcp>://<host|socketpath>:<port-if-required>/<log-facility>
    #log_file: /var/log/salt/minion
    #log_file: file:///dev/log
    #log_file: udp://loghost:10514
    #
    #log_file: /var/log/salt/minion
    #key_logfile: /var/log/salt/key

    # The level of messages to send to the console.
    # One of 'garbage', 'trace', 'debug', 'info', 'warning', 'error', 'critical'.
    #
    # The following log levels are considered INSECURE and may log sensitive data:
    # ['profile', 'garbage', 'trace', 'debug', 'all']
    #
    # Default: 'warning'
    #log_level: warning

    # The level of messages to send to the log file.
    # One of 'garbage', 'trace', 'debug', info', 'warning', 'error', 'critical'.
    # If using 'log_granular_levels' this must be set to the highest desired level.
    # Default: 'warning'
    #log_level_logfile:

    # The date and time format used in log messages. Allowed date/time formatting
    # can be seen here: http://docs.python.org/library/time.html#time.strftime
    #log_datefmt: '%H:%M:%S'
    #log_datefmt_logfile: '%Y-%m-%d %H:%M:%S'

    # The format of the console logging messages. Allowed formatting options can
    # be seen here: http://docs.python.org/library/logging.html#logrecord-attributes
    #
    # Console log colors are specified by these additional formatters:
    #
    # %(colorlevel)s
    # %(colorname)s
    # %(colorprocess)s
    # %(colormsg)s
    #
    # Since it is desirable to include the surrounding brackets, '[' and ']', in
    # the coloring of the messages, these color formatters also include padding as
    # well.  Color LogRecord attributes are only available for console logging.
    #
    #log_fmt_console: '%(colorlevel)s %(colormsg)s'
    #log_fmt_console: '[%(levelname)-8s] %(message)s'
    #
    #log_fmt_logfile: '%(asctime)s,%(msecs)03d [%(name)-17s][%(levelname)-8s] %(message)s'

    # This can be used to control logging levels more specificically.  This
    # example sets the main salt library at the 'warning' level, but sets
    # 'salt.modules' to log at the 'debug' level:
    #   log_granular_levels:
    #     'salt': 'warning'
    #     'salt.modules': 'debug'
    #
    #log_granular_levels: {}

    # To diagnose issues with minions disconnecting or missing returns, ZeroMQ
    # supports the use of monitor sockets to log connection events. This
    # feature requires ZeroMQ 4.0 or higher.
    #
    # To enable ZeroMQ monitor sockets, set 'zmq_monitor' to 'True' and log at a
    # debug level or higher.
    #
    # A sample log event is as follows:
    #
    # [DEBUG   ] ZeroMQ event: {'endpoint': 'tcp://127.0.0.1:4505', 'event': 512,
    # 'value': 27, 'description': 'EVENT_DISCONNECTED'}
    #
    # All events logged will include the string 'ZeroMQ event'. A connection event
    # should be logged as the minion starts up and initially connects to the
    # master. If not, check for debug log level and that the necessary version of
    # ZeroMQ is installed.
    #
    #zmq_monitor: False

    # Number of times to try to authenticate with the salt master when reconnecting
    # to the master
    #tcp_authentication_retries: 5

    ######      Module configuration      #####
    ###########################################
    # Salt allows for modules to be passed arbitrary configuration data, any data
    # passed here in valid yaml format will be passed on to the salt minion modules
    # for use. It is STRONGLY recommended that a naming convention be used in which
    # the module name is followed by a . and then the value. Also, all top level
    # data must be applied via the yaml dict construct, some examples:
    #
    # You can specify that all modules should run in test mode:
    #test: True
    #
    # A simple value for the test module:
    #test.foo: foo
    #
    # A list for the test module:
    #test.bar: [baz,quo]
    #
    # A dict for the test module:
    #test.baz: {spam: sausage, cheese: bread}
    #
    #
    ######      Update settings          ######
    ###########################################
    # Using the features in Esky, a salt minion can both run as a frozen app and
    # be updated on the fly. These options control how the update process
    # (saltutil.update()) behaves.
    #
    # The url for finding and downloading updates. Disabled by default.
    #update_url: False
    #
    # The list of services to restart after a successful update. Empty by default.
    #update_restart_services: []

    ######      Keepalive settings        ######
    ############################################
    # ZeroMQ now includes support for configuring SO_KEEPALIVE if supported by
    # the OS. If connections between the minion and the master pass through
    # a state tracking device such as a firewall or VPN gateway, there is
    # the risk that it could tear down the connection the master and minion
    # without informing either party that their connection has been taken away.
    # Enabling TCP Keepalives prevents this from happening.

    # Overall state of TCP Keepalives, enable (1 or True), disable (0 or False)
    # or leave to the OS defaults (-1), on Linux, typically disabled. Default True, enabled.
    #tcp_keepalive: True

    # How long before the first keepalive should be sent in seconds. Default 300
    # to send the first keepalive after 5 minutes, OS default (-1) is typically 7200 seconds
    # on Linux see /proc/sys/net/ipv4/tcp_keepalive_time.
    #tcp_keepalive_idle: 300

    # How many lost probes are needed to consider the connection lost. Default -1
    # to use OS defaults, typically 9 on Linux, see /proc/sys/net/ipv4/tcp_keepalive_probes.
    #tcp_keepalive_cnt: -1

    # How often, in seconds, to send keepalives after the first one. Default -1 to
    # use OS defaults, typically 75 seconds on Linux, see
    # /proc/sys/net/ipv4/tcp_keepalive_intvl.
    #tcp_keepalive_intvl: -1

    ######   Windows Software settings    ######
    ############################################
    # Location of the repository cache file on the master:
    #win_repo_cachefile: 'salt://win/repo/winrepo.p'

    ######      Returner  settings        ######
    ############################################
    # Default Minion returners. Can be a comma delimited string or a list:
    #
    #return: mysql
    #
    #return: mysql,slack,redis
    #
    #return:
    #  - mysql
    #  - hipchat
    #  - slack

    ######    Miscellaneous  settings     ######
    ############################################
    # Default match type for filtering events tags: startswith, endswith, find, regex, fnmatch
    #event_match_type: startswith

## Example proxy minion configuration file

    ##### Primary configuration settings #####
    ##########################################
    # This configuration file is used to manage the behavior of all Salt Proxy
    # Minions on this host.
    # With the exception of the location of the Salt Master Server, values that are
    # commented out but have an empty line after the comment are defaults that need
    # not be set in the config. If there is no blank line after the comment, the
    # value is presented as an example and is not the default.

    # Per default the proxy minion will automatically include all config files
    # from proxy.d/*.conf (proxy.d is a directory in the same directory
    # as the main minion config file).
    #default_include: proxy.d/*.conf

    # Backwards compatibility option for proxymodules created before 2015.8.2
    # This setting will default to 'False' in the 2016.3.0 release
    # Setting this to True adds proxymodules to the __opts__ dictionary.
    # This breaks several Salt features (basically anything that serializes
    # __opts__ over the wire) but retains backwards compatibility.
    #add_proxymodule_to_opts: True

    # Set the location of the salt master server. If the master server cannot be
    # resolved, then the minion will fail to start.
    #master: salt

    # If a proxymodule has a function called 'grains', then call it during
    # regular grains loading and merge the results with the proxy's grains
    # dictionary.  Otherwise it is assumed that the module calls the grains
    # function in a custom way and returns the data elsewhere
    #
    # Default to False for 2016.3 and 2016.11. Switch to True for 2017.7.0.
    # proxy_merge_grains_in_module: True

    # If a proxymodule has a function called 'alive' returning a boolean
    # flag reflecting the state of the connection with the remove device,
    # when this option is set as True, a scheduled job on the proxy will
    # try restarting the connection. The polling frequency depends on the
    # next option, 'proxy_keep_alive_interval'. Added in 2017.7.0.
    # proxy_keep_alive: True

    # The polling interval (in minutes) to check if the underlying connection
    # with the remote device is still alive. This option requires
    # 'proxy_keep_alive' to be configured as True and the proxymodule to
    # implement the 'alive' function. Added in 2017.7.0.
    # proxy_keep_alive_interval: 1

    # By default, any proxy opens the connection with the remote device when
    # initialized. Some proxymodules allow through this option to open/close
    # the session per command. This requires the proxymodule to have this
    # capability. Please consult the documentation to see if the proxy type
    # used can be that flexible. Added in 2017.7.0.
    # proxy_always_alive: True

    # If multiple masters are specified in the 'master' setting, the default behavior
    # is to always try to connect to them in the order they are listed. If random_master is
    # set to True, the order will be randomized instead. This can be helpful in distributing
    # the load of many minions executing salt-call requests, for example, from a cron job.
    # If only one master is listed, this setting is ignored and a warning will be logged.
    #random_master: False

    # Minions can connect to multiple masters simultaneously (all masters
    # are "hot"), or can be configured to failover if a master becomes
    # unavailable.  Multiple hot masters are configured by setting this
    # value to "str".  Failover masters can be requested by setting
    # to "failover".  MAKE SURE TO SET master_alive_interval if you are
    # using failover.
    # master_type: str

    # Poll interval in seconds for checking if the master is still there.  Only
    # respected if master_type above is "failover".
    # master_alive_interval: 30

    # Set whether the minion should connect to the master via IPv6:
    #ipv6: False

    # Set the number of seconds to wait before attempting to resolve
    # the master hostname if name resolution fails. Defaults to 30 seconds.
    # Set to zero if the minion should shutdown and not retry.
    # retry_dns: 30

    # Set the port used by the master reply and authentication server.
    #master_port: 4506

    # The user to run salt.
    #user: root

    # Setting sudo_user will cause salt to run all execution modules under an sudo
    # to the user given in sudo_user.  The user under which the salt minion process
    # itself runs will still be that provided in the user config above, but all
    # execution modules run by the minion will be rerouted through sudo.
    #sudo_user: saltdev

    # Specify the location of the daemon process ID file.
    #pidfile: /var/run/salt-minion.pid

    # The root directory prepended to these options: pki_dir, cachedir, log_file,
    # sock_dir, pidfile.
    #root_dir: /

    # The directory to store the pki information in
    #pki_dir: /etc/salt/pki/minion

    # Where cache data goes.
    # This data may contain sensitive data and should be protected accordingly.
    #cachedir: /var/cache/salt/minion

    # Append minion_id to these directories.  Helps with
    # multiple proxies and minions running on the same machine.
    # Allowed elements in the list: pki_dir, cachedir, extension_modules
    # Normally not needed unless running several proxies and/or minions on the same machine
    # Defaults to ['cachedir'] for proxies, [] (empty list) for regular minions
    # append_minionid_config_dirs:
    #   - cachedir

    # Verify and set permissions on configuration directories at startup.
    #verify_env: True

    # The minion can locally cache the return data from jobs sent to it, this
    # can be a good way to keep track of jobs the minion has executed
    # (on the minion side). By default this feature is disabled, to enable, set
    # cache_jobs to True.
    #cache_jobs: False

    # Set the directory used to hold unix sockets.
    #sock_dir: /var/run/salt/minion

    # Set the default outputter used by the salt-call command. The default is
    # "nested".
    #output: nested
    #
    # By default output is colored. To disable colored output, set the color value
    # to False.
    #color: True

    # Do not strip off the colored output from nested results and state outputs
    # (true by default).
    # strip_colors: False

    # Backup files that are replaced by file.managed and file.recurse under
    # 'cachedir'/file_backup relative to their original location and appended
    # with a timestamp. The only valid setting is "minion". Disabled by default.
    #
    # Alternatively this can be specified for each file in state files:
    # /etc/ssh/sshd_config:
    #   file.managed:
    #     - source: salt://ssh/sshd_config
    #     - backup: minion
    #
    #backup_mode: minion

    # When waiting for a master to accept the minion's public key, salt will
    # continuously attempt to reconnect until successful. This is the time, in
    # seconds, between those reconnection attempts.
    #acceptance_wait_time: 10

    # If this is nonzero, the time between reconnection attempts will increase by
    # acceptance_wait_time seconds per iteration, up to this maximum. If this is
    # set to zero, the time between reconnection attempts will stay constant.
    #acceptance_wait_time_max: 0

    # If the master rejects the minion's public key, retry instead of exiting.
    # Rejected keys will be handled the same as waiting on acceptance.
    #rejected_retry: False

    # When the master key changes, the minion will try to re-auth itself to receive
    # the new master key. In larger environments this can cause a SYN flood on the
    # master because all minions try to re-auth immediately. To prevent this and
    # have a minion wait for a random amount of time, use this optional parameter.
    # The wait-time will be a random number of seconds between 0 and the defined value.
    #random_reauth_delay: 60

    # When waiting for a master to accept the minion's public key, salt will
    # continuously attempt to reconnect until successful. This is the timeout value,
    # in seconds, for each individual attempt. After this timeout expires, the minion
    # will wait for acceptance_wait_time seconds before trying again. Unless your master
    # is under unusually heavy load, this should be left at the default.
    #auth_timeout: 60

    # Number of consecutive SaltReqTimeoutError that are acceptable when trying to
    # authenticate.
    #auth_tries: 7

    # If authentication fails due to SaltReqTimeoutError during a ping_interval,
    # cause sub minion process to restart.
    #auth_safemode: False

    # Ping Master to ensure connection is alive (minutes).
    #ping_interval: 0

    # To auto recover minions if master changes IP address (DDNS)
    #    auth_tries: 10
    #    auth_safemode: False
    #    ping_interval: 90
    #
    # Minions won't know master is missing until a ping fails. After the ping fail,
    # the minion will attempt authentication and likely fails out and cause a restart.
    # When the minion restarts it will resolve the masters IP and attempt to reconnect.

    # If you don't have any problems with syn-floods, don't bother with the
    # three recon_* settings described below, just leave the defaults!
    #
    # The ZeroMQ pull-socket that binds to the masters publishing interface tries
    # to reconnect immediately, if the socket is disconnected (for example if
    # the master processes are restarted). In large setups this will have all
    # minions reconnect immediately which might flood the master (the ZeroMQ-default
    # is usually a 100ms delay). To prevent this, these three recon_* settings
    # can be used.
    # recon_default: the interval in milliseconds that the socket should wait before
    #                trying to reconnect to the master (1000ms = 1 second)
    #
    # recon_max: the maximum time a socket should wait. each interval the time to wait
    #            is calculated by doubling the previous time. if recon_max is reached,
    #            it starts again at recon_default. Short example:
    #
    #            reconnect 1: the socket will wait 'recon_default' milliseconds
    #            reconnect 2: 'recon_default' * 2
    #            reconnect 3: ('recon_default' * 2) * 2
    #            reconnect 4: value from previous interval * 2
    #            reconnect 5: value from previous interval * 2
    #            reconnect x: if value >= recon_max, it starts again with recon_default
    #
    # recon_randomize: generate a random wait time on minion start. The wait time will
    #                  be a random value between recon_default and recon_default +
    #                  recon_max. Having all minions reconnect with the same recon_default
    #                  and recon_max value kind of defeats the purpose of being able to
    #                  change these settings. If all minions have the same values and your
    #                  setup is quite large (several thousand minions), they will still
    #                  flood the master. The desired behavior is to have timeframe within
    #                  all minions try to reconnect.
    #
    # Example on how to use these settings. The goal: have all minions reconnect within a
    # 60 second timeframe on a disconnect.
    # recon_default: 1000
    # recon_max: 59000
    # recon_randomize: True
    #
    # Each minion will have a randomized reconnect value between 'recon_default'
    # and 'recon_default + recon_max', which in this example means between 1000ms
    # 60000ms (or between 1 and 60 seconds). The generated random-value will be
    # doubled after each attempt to reconnect. Lets say the generated random
    # value is 11 seconds (or 11000ms).
    # reconnect 1: wait 11 seconds
    # reconnect 2: wait 22 seconds
    # reconnect 3: wait 33 seconds
    # reconnect 4: wait 44 seconds
    # reconnect 5: wait 55 seconds
    # reconnect 6: wait time is bigger than 60 seconds (recon_default + recon_max)
    # reconnect 7: wait 11 seconds
    # reconnect 8: wait 22 seconds
    # reconnect 9: wait 33 seconds
    # reconnect x: etc.
    #
    # In a setup with ~6000 thousand hosts these settings would average the reconnects
    # to about 100 per second and all hosts would be reconnected within 60 seconds.
    # recon_default: 100
    # recon_max: 5000
    # recon_randomize: False
    #
    #
    # The loop_interval sets how long in seconds the minion will wait between
    # evaluating the scheduler and running cleanup tasks. This defaults to a
    # sane 60 seconds, but if the minion scheduler needs to be evaluated more
    # often lower this value
    #loop_interval: 60

    # The grains_refresh_every setting allows for a minion to periodically check
    # its grains to see if they have changed and, if so, to inform the master
    # of the new grains. This operation is moderately expensive, therefore
    # care should be taken not to set this value too low.
    #
    # Note: This value is expressed in __minutes__!
    #
    # A value of 10 minutes is a reasonable default.
    #
    # If the value is set to zero, this check is disabled.
    #grains_refresh_every: 1

    # Cache grains on the minion. Default is False.
    #grains_cache: False

    # Grains cache expiration, in seconds. If the cache file is older than this
    # number of seconds then the grains cache will be dumped and fully re-populated
    # with fresh data. Defaults to 5 minutes. Will have no effect if 'grains_cache'
    # is not enabled.
    # grains_cache_expiration: 300

    # Windows platforms lack posix IPC and must rely on slower TCP based inter-
    # process communications. Set ipc_mode to 'tcp' on such systems
    #ipc_mode: ipc

    # Overwrite the default tcp ports used by the minion when in tcp mode
    #tcp_pub_port: 4510
    #tcp_pull_port: 4511

    # Passing very large events can cause the minion to consume large amounts of
    # memory. This value tunes the maximum size of a message allowed onto the
    # minion event bus. The value is expressed in bytes.
    #max_event_size: 1048576

    # To detect failed master(s) and fire events on connect/disconnect, set
    # master_alive_interval to the number of seconds to poll the masters for
    # connection events.
    #
    #master_alive_interval: 30

    # The minion can include configuration from other files. To enable this,
    # pass a list of paths to this option. The paths can be either relative or
    # absolute; if relative, they are considered to be relative to the directory
    # the main minion configuration file lives in (this file). Paths can make use
    # of shell-style globbing. If no files are matched by a path passed to this
    # option then the minion will log a warning message.
    #
    # Include a config file from some other path:
    # include: /etc/salt/extra_config
    #
    # Include config from several files and directories:
    #include:
    #  - /etc/salt/extra_config
    #  - /etc/roles/webserver
    #
    #
    #
    #####   Minion module management     #####
    ##########################################
    # Disable specific modules. This allows the admin to limit the level of
    # access the master has to the minion.
    #disable_modules: [cmd,test]
    #disable_returners: []
    #
    # Modules can be loaded from arbitrary paths. This enables the easy deployment
    # of third party modules. Modules for returners and minions can be loaded.
    # Specify a list of extra directories to search for minion modules and
    # returners. These paths must be fully qualified!
    #module_dirs: []
    #returner_dirs: []
    #states_dirs: []
    #render_dirs: []
    #utils_dirs: []
    #
    # A module provider can be statically overwritten or extended for the minion
    # via the providers option, in this case the default module will be
    # overwritten by the specified module. In this example the pkg module will
    # be provided by the yumpkg5 module instead of the system default.
    #providers:
    #  pkg: yumpkg5
    #
    # Enable Cython modules searching and loading. (Default: False)
    #cython_enable: False
    #
    # Specify a max size (in bytes) for modules on import. This feature is currently
    # only supported on *nix operating systems and requires psutil.
    # modules_max_memory: -1

    #####    State Management Settings    #####
    ###########################################
    # The default renderer to use in SLS files. This is configured as a
    # pipe-delimited expression. For example, jinja|yaml will first run jinja
    # templating on the SLS file, and then load the result as YAML. This syntax is
    # documented in further depth at the following URL:
    #
    # https://docs.saltproject.io/en/latest/ref/renderers/#composing-renderers
    #
    # NOTE: The "shebang" prefix (e.g. "#!jinja|yaml") described in the
    # documentation linked above is for use in an SLS file to override the default
    # renderer, it should not be used when configuring the renderer here.
    #
    #renderer: jinja|yaml
    #
    # The failhard option tells the minions to stop immediately after the first
    # failure detected in the state execution. Defaults to False.
    #failhard: False
    #
    # Reload the modules prior to a highstate run.
    #autoload_dynamic_modules: True
    #
    # clean_dynamic_modules keeps the dynamic modules on the minion in sync with
    # the dynamic modules on the master, this means that if a dynamic module is
    # not on the master it will be deleted from the minion. By default, this is
    # enabled and can be disabled by changing this value to False.
    #clean_dynamic_modules: True
    #
    # Normally, the minion is not isolated to any single environment on the master
    # when running states, but the environment can be isolated on the minion side
    # by statically setting it. Remember that the recommended way to manage
    # environments is to isolate via the top file.
    #environment: None
    #
    # If using the local file directory, then the state top file name needs to be
    # defined, by default this is top.sls.
    #state_top: top.sls
    #
    # Run states when the minion daemon starts. To enable, set startup_states to:
    # 'highstate' -- Execute state.highstate
    # 'sls' -- Read in the sls_list option and execute the named sls files
    # 'top' -- Read top_file option and execute based on that file on the Master
    #startup_states: ''
    #
    # List of states to run when the minion starts up if startup_states is 'sls':
    #sls_list:
    #  - edit.vim
    #  - hyper
    #
    # Top file to execute if startup_states is 'top':
    #top_file: ''

    # Automatically aggregate all states that have support for mod_aggregate by
    # setting to True. Or pass a list of state module names to automatically
    # aggregate just those types.
    #
    # state_aggregate:
    #   - pkg
    #
    #state_aggregate: False

    #####     File Directory Settings    #####
    ##########################################
    # The Salt Minion can redirect all file server operations to a local directory,
    # this allows for the same state tree that is on the master to be used if
    # copied completely onto the minion. This is a literal copy of the settings on
    # the master but used to reference a local directory on the minion.

    # Set the file client. The client defaults to looking on the master server for
    # files, but can be directed to look at the local file directory setting
    # defined below by setting it to "local". Setting a local file_client runs the
    # minion in masterless mode.
    #file_client: remote

    # The file directory works on environments passed to the minion, each environment
    # can have multiple root directories, the subdirectories in the multiple file
    # roots cannot match, otherwise the downloaded files will not be able to be
    # reliably ensured. A base environment is required to house the top file.
    # Example:
    # file_roots:
    #   base:
    #     - /srv/salt/
    #   dev:
    #     - /srv/salt/dev/services
    #     - /srv/salt/dev/states
    #   prod:
    #     - /srv/salt/prod/services
    #     - /srv/salt/prod/states
    #
    #file_roots:
    #  base:
    #    - /srv/salt

    # The hash_type is the hash to use when discovering the hash of a file in
    # the local fileserver. The default is sha256 but sha224, sha384 and sha512
    # are also supported.
    #
    # WARNING: While md5 and sha1 are also supported, do not use it due to the high chance
    # of possible collisions and thus security breach.
    #
    # WARNING: While md5 is also supported, do not use it due to the high chance
    # of possible collisions and thus security breach.
    #
    # Warning: Prior to changing this value, the minion should be stopped and all
    # Salt caches should be cleared.
    #hash_type: sha256

    # The Salt pillar is searched for locally if file_client is set to local. If
    # this is the case, and pillar data is defined, then the pillar_roots need to
    # also be configured on the minion:
    #pillar_roots:
    #  base:
    #    - /srv/pillar
    #
    #
    ######        Security settings       #####
    ###########################################
    # Enable "open mode", this mode still maintains encryption, but turns off
    # authentication, this is only intended for highly secure environments or for
    # the situation where your keys end up in a bad state. If you run in open mode
    # you do so at your own risk!
    #open_mode: False

    # Enable permissive access to the salt keys.  This allows you to run the
    # master or minion as root, but have a non-root group be given access to
    # your pki_dir.  To make the access explicit, root must belong to the group
    # you've given access to. This is potentially quite insecure.
    #permissive_pki_access: False

    # The state_verbose and state_output settings can be used to change the way
    # state system data is printed to the display. By default all data is printed.
    # The state_verbose setting can be set to True or False, when set to False
    # all data that has a result of True and no changes will be suppressed.
    #state_verbose: True

    # The state_output setting controls which results will be output full multi line
    # full, terse - each state will be full/terse
    # mixed - only states with errors will be full
    # changes - states with changes and errors will be full
    # full_id, mixed_id, changes_id and terse_id are also allowed;
    # when set, the state ID will be used as name in the output
    #state_output: full

    # The state_output_diff setting changes whether or not the output from
    # successful states is returned. Useful when even the terse output of these
    # states is cluttering the logs. Set it to True to ignore them.
    #state_output_diff: False

    # The state_output_profile setting changes whether profile information
    # will be shown for each state run.
    #state_output_profile: True

    # The state_output_pct setting changes whether success and failure information
    # as a percent of total actions will be shown for each state run.
    #state_output_pct: False

    # The state_compress_ids setting aggregates information about states which have
    # multiple "names" under the same state ID in the highstate output.
    #state_compress_ids: False

    # Fingerprint of the master public key to validate the identity of your Salt master
    # before the initial key exchange. The master fingerprint can be found by running
    # "salt-key -F master" on the Salt master.
    #master_finger: ''

    ######         Thread settings        #####
    ###########################################
    # Disable multiprocessing support, by default when a minion receives a
    # publication a new process is spawned and the command is executed therein.
    #multiprocessing: True

    #####         Logging settings       #####
    ##########################################
    # The location of the minion log file
    # The minion log can be sent to a regular file, local path name, or network
    # location. Remote logging works best when configured to use rsyslogd(8) (e.g.:
    # ``file:///dev/log``), with rsyslogd(8) configured for network logging. The URI
    # format is: <file|udp|tcp>://<host|socketpath>:<port-if-required>/<log-facility>
    #log_file: /var/log/salt/minion
    #log_file: file:///dev/log
    #log_file: udp://loghost:10514
    #
    #log_file: /var/log/salt/minion
    #key_logfile: /var/log/salt/key

    # The level of messages to send to the console.
    # One of 'garbage', 'trace', 'debug', 'info', 'warning', 'error', 'critical'.
    #
    # The following log levels are considered INSECURE and may log sensitive data:
    # ['profile', 'garbage', 'trace', 'debug', 'all']
    #
    # Default: 'warning'
    #log_level: warning

    # The level of messages to send to the log file.
    # One of 'garbage', 'trace', 'debug', info', 'warning', 'error', 'critical'.
    # If using 'log_granular_levels' this must be set to the highest desired level.
    # Default: 'warning'
    #log_level_logfile:

    # The date and time format used in log messages. Allowed date/time formatting
    # can be seen here: http://docs.python.org/library/time.html#time.strftime
    #log_datefmt: '%H:%M:%S'
    #log_datefmt_logfile: '%Y-%m-%d %H:%M:%S'

    # The format of the console logging messages. Allowed formatting options can
    # be seen here: http://docs.python.org/library/logging.html#logrecord-attributes
    #
    # Console log colors are specified by these additional formatters:
    #
    # %(colorlevel)s
    # %(colorname)s
    # %(colorprocess)s
    # %(colormsg)s
    #
    # Since it is desirable to include the surrounding brackets, '[' and ']', in
    # the coloring of the messages, these color formatters also include padding as
    # well.  Color LogRecord attributes are only available for console logging.
    #
    #log_fmt_console: '%(colorlevel)s %(colormsg)s'
    #log_fmt_console: '[%(levelname)-8s] %(message)s'
    #
    #log_fmt_logfile: '%(asctime)s,%(msecs)03d [%(name)-17s][%(levelname)-8s] %(message)s'

    # This can be used to control logging levels more specificically.  This
    # example sets the main salt library at the 'warning' level, but sets
    # 'salt.modules' to log at the 'debug' level:
    #   log_granular_levels:
    #     'salt': 'warning'
    #     'salt.modules': 'debug'
    #
    #log_granular_levels: {}

    # To diagnose issues with minions disconnecting or missing returns, ZeroMQ
    # supports the use of monitor sockets # to log connection events. This
    # feature requires ZeroMQ 4.0 or higher.
    #
    # To enable ZeroMQ monitor sockets, set 'zmq_monitor' to 'True' and log at a
    # debug level or higher.
    #
    # A sample log event is as follows:
    #
    # [DEBUG   ] ZeroMQ event: {'endpoint': 'tcp://127.0.0.1:4505', 'event': 512,
    # 'value': 27, 'description': 'EVENT_DISCONNECTED'}
    #
    # All events logged will include the string 'ZeroMQ event'. A connection event
    # should be logged on the as the minion starts up and initially connects to the
    # master. If not, check for debug log level and that the necessary version of
    # ZeroMQ is installed.
    #
    #zmq_monitor: False

    ######      Module configuration      #####
    ###########################################
    # Salt allows for modules to be passed arbitrary configuration data, any data
    # passed here in valid yaml format will be passed on to the salt minion modules
    # for use. It is STRONGLY recommended that a naming convention be used in which
    # the module name is followed by a . and then the value. Also, all top level
    # data must be applied via the yaml dict construct, some examples:
    #
    # You can specify that all modules should run in test mode:
    #test: True
    #
    # A simple value for the test module:
    #test.foo: foo
    #
    # A list for the test module:
    #test.bar: [baz,quo]
    #
    # A dict for the test module:
    #test.baz: {spam: sausage, cheese: bread}
    #
    #
    ######      Update settings          ######
    ###########################################
    # Using the features in Esky, a salt minion can both run as a frozen app and
    # be updated on the fly. These options control how the update process
    # (saltutil.update()) behaves.
    #
    # The url for finding and downloading updates. Disabled by default.
    #update_url: False
    #
    # The list of services to restart after a successful update. Empty by default.
    #update_restart_services: []

    ######      Keepalive settings        ######
    ############################################
    # ZeroMQ now includes support for configuring SO_KEEPALIVE if supported by
    # the OS. If connections between the minion and the master pass through
    # a state tracking device such as a firewall or VPN gateway, there is
    # the risk that it could tear down the connection the master and minion
    # without informing either party that their connection has been taken away.
    # Enabling TCP Keepalives prevents this from happening.

    # Overall state of TCP Keepalives, enable (1 or True), disable (0 or False)
    # or leave to the OS defaults (-1), on Linux, typically disabled. Default True, enabled.
    #tcp_keepalive: True

    # How long before the first keepalive should be sent in seconds. Default 300
    # to send the first keepalive after 5 minutes, OS default (-1) is typically 7200 seconds
    # on Linux see /proc/sys/net/ipv4/tcp_keepalive_time.
    #tcp_keepalive_idle: 300

    # How many lost probes are needed to consider the connection lost. Default -1
    # to use OS defaults, typically 9 on Linux, see /proc/sys/net/ipv4/tcp_keepalive_probes.
    #tcp_keepalive_cnt: -1

    # How often, in seconds, to send keepalives after the first one. Default -1 to
    # use OS defaults, typically 75 seconds on Linux, see
    # /proc/sys/net/ipv4/tcp_keepalive_intvl.
    #tcp_keepalive_intvl: -1

    ######   Windows Software settings    ######
    ############################################
    # Location of the repository cache file on the master:
    #win_repo_cachefile: 'salt://win/repo/winrepo.p'

    ######      Returner  settings        ######
    ############################################
    # Which returner(s) will be used for minion's result:
    #return: mysql