initial commit
This commit is contained in:
commit
eaa6b99c5e
6
.gitignore
vendored
Normal file
6
.gitignore
vendored
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
# Pillars
|
||||||
|
/pillar
|
||||||
|
|
||||||
|
# Python related
|
||||||
|
*.swp
|
||||||
|
*.pyc
|
117
README.md
Normal file
117
README.md
Normal file
@ -0,0 +1,117 @@
|
|||||||
|
# paulbsd-salt
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
paulbsd-salt are sets of SaltStack states for PaulBSD infrastructure
|
||||||
|
|
||||||
|
## Howto
|
||||||
|
|
||||||
|
### States
|
||||||
|
|
||||||
|
```text
|
||||||
|
states
|
||||||
|
├── acme
|
||||||
|
├── androidstudio
|
||||||
|
├── apparmor
|
||||||
|
├── appimagekit
|
||||||
|
├── apt
|
||||||
|
├── arduino
|
||||||
|
├── bareos
|
||||||
|
├── burp
|
||||||
|
├── cds
|
||||||
|
├── clamav
|
||||||
|
├── collectd
|
||||||
|
├── cron
|
||||||
|
├── dovecot
|
||||||
|
├── flash
|
||||||
|
├── gitea
|
||||||
|
├── grafana
|
||||||
|
├── gufw
|
||||||
|
├── influxdb
|
||||||
|
├── ipfs
|
||||||
|
├── iptables
|
||||||
|
├── java
|
||||||
|
├── maildb
|
||||||
|
├── mariadb
|
||||||
|
├── misc
|
||||||
|
├── _modules
|
||||||
|
├── molotov
|
||||||
|
├── motd
|
||||||
|
├── netbox
|
||||||
|
├── nextcloud_desktop
|
||||||
|
├── nftables
|
||||||
|
├── nginx
|
||||||
|
├── npf
|
||||||
|
├── opendkim
|
||||||
|
├── openvpn_client
|
||||||
|
├── openvpn_server
|
||||||
|
├── packer
|
||||||
|
├── pkg
|
||||||
|
├── postfix
|
||||||
|
├── postgresql
|
||||||
|
├── pycharm
|
||||||
|
├── rclone
|
||||||
|
├── reactor
|
||||||
|
├── repos
|
||||||
|
├── rsync
|
||||||
|
├── rsyslog
|
||||||
|
├── _runners
|
||||||
|
├── salt_minion
|
||||||
|
├── samba
|
||||||
|
├── sensu
|
||||||
|
├── services
|
||||||
|
├── snmp
|
||||||
|
├── ssh
|
||||||
|
├── _states
|
||||||
|
├── sublimetext
|
||||||
|
├── sudo
|
||||||
|
├── syncthing
|
||||||
|
├── telegraf
|
||||||
|
├── telegram
|
||||||
|
├── tests
|
||||||
|
├── time
|
||||||
|
├── tmux
|
||||||
|
├── tor
|
||||||
|
├── transmission
|
||||||
|
├── users
|
||||||
|
├── vim
|
||||||
|
├── vsftpd
|
||||||
|
├── winpkg
|
||||||
|
├── wintse
|
||||||
|
└── zsh
|
||||||
|
```
|
||||||
|
|
||||||
|
### Scripts
|
||||||
|
|
||||||
|
TBD
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
```text
|
||||||
|
Copyright (c) 2019, 2020 PaulBSD
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer.
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer in the documentation
|
||||||
|
and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||||
|
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
The views and conclusions contained in the software and documentation are those
|
||||||
|
of the authors and should not be interpreted as representing official policies,
|
||||||
|
either expressed or implied, of the paulbsd project.
|
||||||
|
```
|
3
cloud/cloud
Normal file
3
cloud/cloud
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# vim:set ft=yaml:
|
||||||
|
wait_for_ip_timeout: 600
|
||||||
|
sync_after_install: all
|
20
cloud/cloud.profiles
Normal file
20
cloud/cloud.profiles
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
# vim:set ft=yaml:
|
||||||
|
scaleway-xsmall-arm-ubuntu-16:
|
||||||
|
provider: scaleway-paris
|
||||||
|
image: eeb73cbf-78a9-4481-9e38-9aaadaf8e0c9
|
||||||
|
commercial_type: C1
|
||||||
|
|
||||||
|
scaleway-xsmall-x86-ubuntu-16:
|
||||||
|
provider: scaleway-paris
|
||||||
|
image: 047f1372-3923-471f-82ca-5ff69dbaf0f7
|
||||||
|
commercial_type: VC1S
|
||||||
|
|
||||||
|
scaleway-lamp:
|
||||||
|
provider: scaleway-paris
|
||||||
|
image: 89457135-d446-41ba-a8df-d53e5bb54710
|
||||||
|
commercial_type: VC1S
|
||||||
|
|
||||||
|
scaleway-external:
|
||||||
|
provider: scaleway-amsterdam
|
||||||
|
image: 89ee4018-f8c3-4dc4-a6b5-bca14f985ebe
|
||||||
|
commercial_type: VC1S
|
14
cloud/cloud.providers
Normal file
14
cloud/cloud.providers
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
# vim:set ft=yaml:
|
||||||
|
scaleway-paris:
|
||||||
|
access_key:
|
||||||
|
token:
|
||||||
|
driver: scaleway
|
||||||
|
region: par1
|
||||||
|
api_root: https://cp-par1.scaleway.com
|
||||||
|
|
||||||
|
scaleway-amsterdam:
|
||||||
|
access_key:
|
||||||
|
token:
|
||||||
|
driver: scaleway
|
||||||
|
region: ams1
|
||||||
|
api_root: https://cp-ams1.scaleway.com
|
6
cloud/scaleway/scw01-ams.paulbsd.com
Normal file
6
cloud/scaleway/scw01-ams.paulbsd.com
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
scaleway-external:
|
||||||
|
- scw01-ams.paulbsd.com:
|
||||||
|
minion:
|
||||||
|
master: salt.paulbsd.com
|
||||||
|
ssh_username: root
|
||||||
|
key_filename: /root/.ssh/id_rsa
|
7
cloud/scaleway/scw_lamp.map
Normal file
7
cloud/scaleway/scw_lamp.map
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
scaleway-lamp:
|
||||||
|
- lamp1:
|
||||||
|
minion:
|
||||||
|
master: salt.paulbsd.com
|
||||||
|
ssh_username: root
|
||||||
|
key_filename: /root/.ssh/id_rsa
|
||||||
|
script_args: -P
|
16
cloud/scaleway/scw_web.map
Normal file
16
cloud/scaleway/scw_web.map
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
scaleway-xsmall-x86-ubuntu-16:
|
||||||
|
- web1:
|
||||||
|
minion:
|
||||||
|
master: salt.paulbsd.com
|
||||||
|
ssh_username: root
|
||||||
|
key_filename: /root/.ssh/id_rsa
|
||||||
|
- web2:
|
||||||
|
minion:
|
||||||
|
master: salt.paulbsd.com
|
||||||
|
ssh_username: root
|
||||||
|
key_filename: /root/.ssh/id_rsa
|
||||||
|
- web3:
|
||||||
|
minion:
|
||||||
|
master: salt.paulbsd.com
|
||||||
|
ssh_username: root
|
||||||
|
key_filename: /root/.ssh/id_rsa
|
80
config/master
Normal file
80
config/master
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
# # vi:syntax=yaml
|
||||||
|
|
||||||
|
interface: '0.0.0.0'
|
||||||
|
|
||||||
|
log_level: debug
|
||||||
|
log_file: /var/log/salt/master
|
||||||
|
|
||||||
|
file_recv: True
|
||||||
|
|
||||||
|
#cache: mysql
|
||||||
|
#master_job_cache: redis
|
||||||
|
#ext_job_cache: redis
|
||||||
|
return: smtp
|
||||||
|
event_return: mysql
|
||||||
|
|
||||||
|
external_auth:
|
||||||
|
pam:
|
||||||
|
paul:
|
||||||
|
- .*
|
||||||
|
salt:
|
||||||
|
- .*
|
||||||
|
- '@runner'
|
||||||
|
- '@wheel'
|
||||||
|
|
||||||
|
rest_cherrypy:
|
||||||
|
port: 8033
|
||||||
|
disable_ssl: True
|
||||||
|
|
||||||
|
runner_dirs:
|
||||||
|
- /srv/salt/states/_runners
|
||||||
|
|
||||||
|
reactor:
|
||||||
|
- 'salt/minion/*/start':
|
||||||
|
- salt://reactor/auth.sls
|
||||||
|
- 'salt/job/*/ret/*':
|
||||||
|
- salt://reactor/email-on-failure.sls
|
||||||
|
|
||||||
|
state_output: changes
|
||||||
|
cython_enable: True
|
||||||
|
|
||||||
|
file_roots:
|
||||||
|
base:
|
||||||
|
- /srv/salt/states
|
||||||
|
|
||||||
|
pillar_roots:
|
||||||
|
base:
|
||||||
|
- /srv/salt/pillar
|
||||||
|
|
||||||
|
pillar_includes_override_sls: True
|
||||||
|
pillar_merge_lists: False
|
||||||
|
pillar_source_merging_strategy: recurse
|
||||||
|
|
||||||
|
ext_pillar:
|
||||||
|
- etcd: etcd_config root=/salt/common
|
||||||
|
- etcd: etcd_config root=/salt/hosts/%(minion_id)s
|
||||||
|
|
||||||
|
etcd_config:
|
||||||
|
etcd.host: 127.0.0.1
|
||||||
|
etcd.port: 2379
|
||||||
|
|
||||||
|
mysql.host: 'scw02-ams.paulbsd.com'
|
||||||
|
mysql.user: 'salt'
|
||||||
|
mysql.pass: ''
|
||||||
|
mysql.password: ''
|
||||||
|
mysql.db: 'salt'
|
||||||
|
mysql.port: 3306
|
||||||
|
#mysql.table_name: 'salt_cache'
|
||||||
|
|
||||||
|
#smtp.from: 'salt@paulbsd.com'
|
||||||
|
#smtp.to: 'postmaster@paulbsd.com'
|
||||||
|
#smtp.host: 'smtp.paulbsd.com'
|
||||||
|
#smtp.port: 465
|
||||||
|
#smtp.username: 'sys@paulbsd.com'
|
||||||
|
#smtp.password: ''
|
||||||
|
#smtp.tls: True
|
||||||
|
|
||||||
|
#mine_functions:
|
||||||
|
# provision:
|
||||||
|
# - mine_function: state.sls
|
||||||
|
# - provision
|
867
config/master.sample
Normal file
867
config/master.sample
Normal file
@ -0,0 +1,867 @@
|
|||||||
|
##### 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: True
|
||||||
|
|
||||||
|
# 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
|
||||||
|
|
||||||
|
# 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:
|
||||||
|
#root_dir: /
|
||||||
|
|
||||||
|
# Directory used to store public key data:
|
||||||
|
#pki_dir: /usr/pkg/etc/salt/pki/master
|
||||||
|
|
||||||
|
# Directory to store job and cache data:
|
||||||
|
# This directory may contain sensitive data and should be protected accordingly.
|
||||||
|
#
|
||||||
|
#cachedir: /var/cache/salt/master
|
||||||
|
|
||||||
|
# Directory for custom modules. This directory can contain subdirectories for
|
||||||
|
# each of Salt's module types such as "runners", "output", "wheel", "modules",
|
||||||
|
# "states", "returners", etc.
|
||||||
|
#extension_modules: <no default>
|
||||||
|
|
||||||
|
# Directory for custom modules. This directory can contain subdirectories for
|
||||||
|
# each of Salt's module types such as "runners", "output", "wheel", "modules",
|
||||||
|
# "states", "returners", etc.
|
||||||
|
# Like 'extension_modules' but can take an array of paths
|
||||||
|
#module_dirs: <no default>
|
||||||
|
# - /var/cache/salt/minion/extmods
|
||||||
|
|
||||||
|
# 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:
|
||||||
|
#keep_jobs: 24
|
||||||
|
|
||||||
|
# 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
|
||||||
|
|
||||||
|
# Return minions that timeout when running commands like test.ping
|
||||||
|
#show_timeout: True
|
||||||
|
|
||||||
|
# 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
|
||||||
|
|
||||||
|
# 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 and pillar data in the cachedir.
|
||||||
|
#minion_data_cache: True
|
||||||
|
|
||||||
|
# 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 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
|
||||||
|
|
||||||
|
# Only events returns matching tags in a whitelist
|
||||||
|
# event_return_whitelist:
|
||||||
|
# - salt/master/a_tag
|
||||||
|
# - salt/master/another_tag
|
||||||
|
|
||||||
|
# Store all event returns _except_ the tags in a blacklist
|
||||||
|
# event_return_blacklist:
|
||||||
|
# - salt/master/not_this_tag
|
||||||
|
# - salt/master/or_this_one
|
||||||
|
|
||||||
|
# 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
|
||||||
|
|
||||||
|
# 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
|
||||||
|
|
||||||
|
# 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: /usr/pkg/etc/salt/extra_config
|
||||||
|
#
|
||||||
|
# Include config from several files and directories:
|
||||||
|
# include:
|
||||||
|
# - /usr/pkg/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 publisher interface ZeroMQPubServerChannel
|
||||||
|
#pub_hwm: 1000
|
||||||
|
|
||||||
|
# These two ZMQ HWM settings, salt_event_pub_hwm and event_publisher_pub_hwm
|
||||||
|
# are significant for masters with thousands of minions. When these are
|
||||||
|
# insufficiently high it will manifest in random responses missing in the CLI
|
||||||
|
# and even missing from the job cache. Masters that have fast CPUs and many
|
||||||
|
# cores with appropriate worker_threads will not need these set as high.
|
||||||
|
|
||||||
|
# On deployment with 8,000 minions, 2.4GHz CPUs, 24 cores, 32GiB memory has
|
||||||
|
# these settings:
|
||||||
|
#
|
||||||
|
# salt_event_pub_hwm: 128000
|
||||||
|
# event_publisher_pub_hwm: 64000
|
||||||
|
|
||||||
|
# ZMQ high-water-mark for SaltEvent pub socket
|
||||||
|
#salt_event_pub_hwm: 20000
|
||||||
|
|
||||||
|
# ZMQ high-water-mark for EventPublisher pub socket
|
||||||
|
#event_publisher_pub_hwm: 10000
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
##### 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 auto_accept, this setting will automatically accept all incoming
|
||||||
|
# public keys from the minions. Note that this is insecure.
|
||||||
|
#auto_accept: False
|
||||||
|
|
||||||
|
# Time in minutes that a 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.
|
||||||
|
#autosign_file: /usr/pkg/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: /usr/pkg/etc/salt/autoreject.conf
|
||||||
|
|
||||||
|
# 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.
|
||||||
|
#client_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.
|
||||||
|
#
|
||||||
|
#client_acl_blacklist:
|
||||||
|
# users:
|
||||||
|
# - root
|
||||||
|
# - '^(?!sudo_).*$' # all non sudo users
|
||||||
|
# modules:
|
||||||
|
# - cmd
|
||||||
|
|
||||||
|
# Enforce client_acl & client_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:
|
||||||
|
paul:
|
||||||
|
- .*
|
||||||
|
salt:
|
||||||
|
- .*
|
||||||
|
- '@runner'
|
||||||
|
- '@wheel'
|
||||||
|
|
||||||
|
rest_cherrypy:
|
||||||
|
# host: 127.0.0.1
|
||||||
|
port: 8000
|
||||||
|
disable_ssl: True
|
||||||
|
|
||||||
|
#
|
||||||
|
# Time (in seconds) for a newly generated token to live. Default: 12 hours
|
||||||
|
#token_expire: 43200
|
||||||
|
|
||||||
|
# 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
|
||||||
|
|
||||||
|
##### Salt-SSH Configuration #####
|
||||||
|
##########################################
|
||||||
|
|
||||||
|
# Pass in an alternative location for the salt-ssh roster file
|
||||||
|
#roster_file: /usr/pkg/etc/salt/roster
|
||||||
|
|
||||||
|
# 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
|
||||||
|
|
||||||
|
##### Master Module Management #####
|
||||||
|
##########################################
|
||||||
|
# Manage how master side modules are loaded.
|
||||||
|
|
||||||
|
# Add any additional locations to look for master runners:
|
||||||
|
#runner_dirs: []
|
||||||
|
|
||||||
|
runner_dirs:
|
||||||
|
- /usr/pkg/etc/salt/_runners
|
||||||
|
|
||||||
|
reactor:
|
||||||
|
- 'salt/minion/*/start':
|
||||||
|
- salt://reactor/auth.sls
|
||||||
|
- 'salt/job/*/ret/*':
|
||||||
|
- salt://reactor/email-on-failure.sls
|
||||||
|
|
||||||
|
state_output: changes
|
||||||
|
|
||||||
|
# Enable Cython for master side modules:
|
||||||
|
cython_enable: True
|
||||||
|
|
||||||
|
|
||||||
|
##### 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 external_nodes option allows Salt to gather data that would normally be
|
||||||
|
# placed in a top file. The external_nodes option is the executable that will
|
||||||
|
# return the ENC data. Remember that Salt will look for external nodes AND top
|
||||||
|
# files and combine the results if both are enabled!
|
||||||
|
#external_nodes: None
|
||||||
|
|
||||||
|
# The renderer to use on the minions to render the state data
|
||||||
|
#renderer: yaml_jinja
|
||||||
|
|
||||||
|
# The Jinja renderer can strip extra carriage returns and whitespace
|
||||||
|
# See http://jinja.pocoo.org/docs/api/#high-level-api
|
||||||
|
#
|
||||||
|
# If this is set to True the first newline after a Jinja block is removed
|
||||||
|
# (block, not variable tag!). Defaults to False, corresponds to the Jinja
|
||||||
|
# environment init variable "trim_blocks".
|
||||||
|
#jinja_trim_blocks: True
|
||||||
|
#
|
||||||
|
# If this is set to True leading spaces and tabs are stripped from the start
|
||||||
|
# of a line to a block. Defaults to False, corresponds to the Jinja
|
||||||
|
# environment init variable "lstrip_blocks".
|
||||||
|
#jinja_lstrip_blocks: 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 changes if the output is the full multi line
|
||||||
|
# output for each changed state if set to 'full', but if set to 'terse'
|
||||||
|
# the output will be shortened to a single line. If set to 'mixed', the output
|
||||||
|
# will be terse unless a state failed, in which case that output will be full.
|
||||||
|
# If set to 'changes', the output will be full unless the state didn't change.
|
||||||
|
#state_output: full
|
||||||
|
|
||||||
|
# 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:
|
||||||
|
# - /usr/pkg/etc/salt/states/
|
||||||
|
# dev:
|
||||||
|
# - /usr/pkg/etc/salt/states/dev/services
|
||||||
|
# - /usr/pkg/etc/salt/states/dev/states
|
||||||
|
# prod:
|
||||||
|
# - /usr/pkg/etc/salt/states/prod/services
|
||||||
|
# - /usr/pkg/etc/salt/states/prod/states
|
||||||
|
#
|
||||||
|
file_roots:
|
||||||
|
base:
|
||||||
|
- /usr/pkg/etc/salt/states
|
||||||
|
- /home/shares/repo
|
||||||
|
#
|
||||||
|
|
||||||
|
# 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 md5, but sha1, sha224, sha256, sha384
|
||||||
|
# and sha512 are also supported.
|
||||||
|
#
|
||||||
|
# Prior to changing this value, the master should be stopped and all Salt
|
||||||
|
# caches should be cleared.
|
||||||
|
#hash_type: md5
|
||||||
|
|
||||||
|
# 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
|
||||||
|
#
|
||||||
|
# By default, the Salt fileserver recurses fully into all defined environments
|
||||||
|
# to attempt to find files. To limit this behavior so that the fileserver only
|
||||||
|
# traverses directories with SLS files and special Salt directories like _modules,
|
||||||
|
# enable the option below. This might be useful for installations where a file root
|
||||||
|
# has a very large number of files and performance is impacted. Default is False.
|
||||||
|
# fileserver_limit_traversal: False
|
||||||
|
#
|
||||||
|
# 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
|
||||||
|
#
|
||||||
|
# Gitfs can be provided by one of two python modules: GitPython or pygit2. If
|
||||||
|
# using pygit2, both libgit2 and git must also be installed.
|
||||||
|
#gitfs_provider: gitpython
|
||||||
|
#
|
||||||
|
# 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
|
||||||
|
#
|
||||||
|
#
|
||||||
|
##### 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:
|
||||||
|
- /usr/pkg/etc/salt/pillar
|
||||||
|
#
|
||||||
|
#ext_pillar:
|
||||||
|
# - hiera: /etc/hiera.yaml
|
||||||
|
# - cmd_yaml: cat /usr/pkg/etc/salt/yaml
|
||||||
|
|
||||||
|
#ext_pillar:
|
||||||
|
# - mysql:
|
||||||
|
# fromdb:
|
||||||
|
# query: 'SELECT
|
||||||
|
# FROM pillar
|
||||||
|
# WHERE minion_pattern LIKE %s'
|
||||||
|
# depth: 5
|
||||||
|
# as_list: True
|
||||||
|
# with_lists: [1,3]
|
||||||
|
|
||||||
|
#_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 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 four values: recurse, aggregate, overwrite,
|
||||||
|
# or smart. Recurse will merge recursively mapping of data. Aggregate instructs
|
||||||
|
# aggregation of elements between sources that use the #!yamlex renderer. Overwrite
|
||||||
|
# will verwrite 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
|
||||||
|
|
||||||
|
|
||||||
|
##### 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: masterofmaster
|
||||||
|
|
||||||
|
# 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
|
||||||
|
|
||||||
|
# LOG file of the syndic daemon:
|
||||||
|
#syndic_log_file: syndic.log
|
||||||
|
|
||||||
|
|
||||||
|
##### 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:
|
||||||
|
# ['garbage', 'trace', 'debug']
|
||||||
|
#
|
||||||
|
#log_level: warning
|
||||||
|
#log_level: debug
|
||||||
|
|
||||||
|
# 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 formating
|
||||||
|
# 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)03.0f [%(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.
|
||||||
|
#nodegroups:
|
||||||
|
# group1: 'L@foo.domain.com,bar.domain.com,baz.domain.com and bl*.domain.com'
|
||||||
|
# group2: 'G@os:Debian and foo.domain.com'
|
||||||
|
|
||||||
|
|
||||||
|
##### 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: '/usr/pkg/etc/salt/states/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: '/usr/pkg/etc/salt/states/win/repo'
|
||||||
|
#
|
||||||
|
# Location of the master's repo cache file:
|
||||||
|
#winrepo_mastercachefile: '/usr/pkg/etc/salt/states/win/repo/winrepo.p'
|
||||||
|
#
|
||||||
|
# List of git repositories to include with the local repo:
|
||||||
|
#winrepo_remotes:
|
||||||
|
# - 'https://github.com/saltstack/salt-winrepo.git'
|
||||||
|
|
||||||
|
|
||||||
|
##### Returner settings ######
|
||||||
|
############################################
|
||||||
|
# Which returner(s) will be used for minion's result:
|
||||||
|
#return: mysql
|
||||||
|
#return: smtp
|
||||||
|
return: mysql,smtp
|
||||||
|
|
||||||
|
mysql.host: '127.0.0.1'
|
||||||
|
mysql.user: 'salt'
|
||||||
|
mysql.pass: 'pass'
|
||||||
|
mysql.db: 'salt'
|
||||||
|
mysql.port: 3306
|
||||||
|
|
||||||
|
###### Miscellaneous settings ######
|
||||||
|
############################################
|
||||||
|
# Default match type for filtering events tags: startswith, endswith, find, regex, fnmatch
|
||||||
|
#event_match_type: startswith
|
||||||
|
|
||||||
|
smtp.from: salt@example.com
|
||||||
|
smtp.to: salt@example.com,bob@example.com
|
||||||
|
smtp.host: localhost
|
||||||
|
smtp.port: 25
|
10
config/minion
Executable file
10
config/minion
Executable file
@ -0,0 +1,10 @@
|
|||||||
|
## Managed by PaulBSD Salt
|
||||||
|
master: salt.paulbsd.com
|
||||||
|
hash_type: sha256
|
||||||
|
state_verbose: True
|
||||||
|
tcp_keepalive: True
|
||||||
|
tcp_keepalive_idle: 300
|
||||||
|
random_reauth_delay: 60
|
||||||
|
recon_default: 1000
|
||||||
|
recon_max: 10000
|
||||||
|
recon_randomize: True
|
781
config/minion.sample
Normal file
781
config/minion.sample
Normal file
@ -0,0 +1,781 @@
|
|||||||
|
##### 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:
|
||||||
|
|
||||||
|
# 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.
|
||||||
|
# NOTE: If master_type is set to failover, use master_shuffle instead.
|
||||||
|
#random_master: False
|
||||||
|
|
||||||
|
# Use if master_type is set to failover.
|
||||||
|
#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.
|
||||||
|
# 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 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: /usr/pkg/etc/salt/minion
|
||||||
|
|
||||||
|
# The directory to store the pki information in
|
||||||
|
#pki_dir: /usr/pkg/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
|
||||||
|
|
||||||
|
# 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
|
||||||
|
|
||||||
|
# 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_backups 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
|
||||||
|
|
||||||
|
# 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)
|
||||||
|
# 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 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
|
||||||
|
|
||||||
|
# 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'
|
||||||
|
|
||||||
|
# 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: /usr/pkg/etc/salt/extra_config
|
||||||
|
#
|
||||||
|
# Include config from several files and directories:
|
||||||
|
#include:
|
||||||
|
# - /usr/pkg/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.
|
||||||
|
#disable_modules: [cmd,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 state management system executes all of the state templates on the minion
|
||||||
|
# to enable more granular control of system state management. The type of
|
||||||
|
# template and serialization used for state management needs to be configured
|
||||||
|
# on the minion, the default renderer is yaml_jinja. This is a yaml file
|
||||||
|
# rendered from a jinja template, the available options are:
|
||||||
|
# yaml_jinja
|
||||||
|
# yaml_mako
|
||||||
|
# yaml_wempy
|
||||||
|
# json_jinja
|
||||||
|
# json_mako
|
||||||
|
# json_wempy
|
||||||
|
#
|
||||||
|
#renderer: yaml_jinja
|
||||||
|
#
|
||||||
|
# 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
|
||||||
|
#
|
||||||
|
# Isolates the pillar environment on the minion side. This functions the same
|
||||||
|
# as the environment setting, but for pillar instead of states.
|
||||||
|
#pillarenv: 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:
|
||||||
|
# - /usr/pkg/etc/salt/states/
|
||||||
|
# dev:
|
||||||
|
# - /usr/pkg/etc/salt/states/dev/services
|
||||||
|
# - /usr/pkg/etc/salt/states/dev/states
|
||||||
|
# prod:
|
||||||
|
# - /usr/pkg/etc/salt/states/prod/services
|
||||||
|
# - /usr/pkg/etc/salt/states/prod/states
|
||||||
|
#
|
||||||
|
#file_roots:
|
||||||
|
# base:
|
||||||
|
# - /usr/pkg/etc/salt/states
|
||||||
|
|
||||||
|
# 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
|
||||||
|
#
|
||||||
|
# By default, the Salt fileserver recurses fully into all defined environments
|
||||||
|
# to attempt to find files. To limit this behavior so that the fileserver only
|
||||||
|
# traverses directories with SLS files and special Salt directories like _modules,
|
||||||
|
# enable the option below. This might be useful for installations where a file root
|
||||||
|
# has a very large number of files and performance is negatively impacted. Default
|
||||||
|
# is False.
|
||||||
|
#fileserver_limit_traversal: False
|
||||||
|
|
||||||
|
# The hash_type is the hash to use when discovering the hash of a file in
|
||||||
|
# the local fileserver. The default is sha256, 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: 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:
|
||||||
|
# - /usr/pkg/etc/salt/pillar
|
||||||
|
|
||||||
|
# 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
|
||||||
|
|
||||||
|
# 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 changes if the output is the full multi line
|
||||||
|
# output for each changed state if set to 'full', but if set to 'terse'
|
||||||
|
# the output will be shortened to a single line.
|
||||||
|
#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
|
||||||
|
|
||||||
|
# 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:
|
||||||
|
# ['garbage', 'trace', 'debug']
|
||||||
|
#
|
||||||
|
# Default: 'warning'
|
||||||
|
log_level: debug
|
||||||
|
|
||||||
|
# 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)03.0f [%(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
|
||||||
|
|
||||||
|
###### 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
|
||||||
|
|
||||||
|
|
||||||
|
###### Miscellaneous settings ######
|
||||||
|
############################################
|
||||||
|
# Default match type for filtering events tags: startswith, endswith, find, regex, fnmatch
|
||||||
|
#event_match_type: startswith
|
17
config/roster
Normal file
17
config/roster
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
scw01-ams:
|
||||||
|
host: scw01-ams.paulbsd.com
|
||||||
|
user: paul
|
||||||
|
sudo: True
|
||||||
|
|
||||||
|
scw02-ams:
|
||||||
|
host: scw02-ams.paulbsd.com
|
||||||
|
user: paul
|
||||||
|
|
||||||
|
lxc01:
|
||||||
|
host: lxc01.paulbsd.com
|
||||||
|
user: paul
|
||||||
|
sudo: True
|
||||||
|
|
||||||
|
nuc:
|
||||||
|
host: nuc.paulbsd.com
|
||||||
|
user: paul
|
11
config/roster.sample
Normal file
11
config/roster.sample
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
scw01-ams.paulbsd.com:
|
||||||
|
host: scw01-ams.paulbsd.com
|
||||||
|
user: paul
|
||||||
|
sudo: True
|
||||||
|
priv: /home/paul/.ssh/id_rsa
|
||||||
|
|
||||||
|
aws01-par.paulbsd.com:
|
||||||
|
host: aws01-par.paulbsd.com
|
||||||
|
user: ubuntu
|
||||||
|
sudo: True
|
||||||
|
priv: /home/paul/.ssh/id_rsa
|
10
scripts/encrypt_password
Executable file
10
scripts/encrypt_password
Executable file
@ -0,0 +1,10 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
key_id=salt
|
||||||
|
|
||||||
|
if [[ $1 != "" ]]
|
||||||
|
then
|
||||||
|
echo -n $1 | gpg --armor --batch --homedir="/etc/salt/gpgkeys" --trust-model always --encrypt -r "${key_id}"
|
||||||
|
else
|
||||||
|
echo "Please specify a password"
|
||||||
|
fi
|
2
scripts/salt-test.sh
Executable file
2
scripts/salt-test.sh
Executable file
@ -0,0 +1,2 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
salt-call -l debug --local --file-root=./states state.sls $1
|
19
states/_modules/custom.py
Executable file
19
states/_modules/custom.py
Executable file
@ -0,0 +1,19 @@
|
|||||||
|
#!/usr/bin/python3
|
||||||
|
|
||||||
|
import salt.exceptions
|
||||||
|
|
||||||
|
def current_state(name):
|
||||||
|
ret = dict()
|
||||||
|
|
||||||
|
ret['name'] = name
|
||||||
|
ret['foo'] = 'foo'
|
||||||
|
|
||||||
|
return ret
|
||||||
|
|
||||||
|
def change_state(name, foo):
|
||||||
|
ret = dict()
|
||||||
|
|
||||||
|
ret['name'] = name
|
||||||
|
ret['foo'] = foo
|
||||||
|
|
||||||
|
return ret
|
28
states/_modules/dkron.py
Normal file
28
states/_modules/dkron.py
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
#!/usr/bin/python3
|
||||||
|
|
||||||
|
import requests
|
||||||
|
import json
|
||||||
|
|
||||||
|
def get_jobs(url="http://localhost:8080", verify=False):
|
||||||
|
fullurl = f"{url}/v1/jobs"
|
||||||
|
ret = dict()
|
||||||
|
try:
|
||||||
|
req = requests.request("get", fullurl, verify=verify)
|
||||||
|
except (requests.exceptions.RequestException) as exc:
|
||||||
|
raise f"Exception {exc} occured"
|
||||||
|
ret = req.json()
|
||||||
|
if req.status_code == 200:
|
||||||
|
return ret
|
||||||
|
return None
|
||||||
|
|
||||||
|
def set_jobs(url="http://localhost:8080", verify=False, job={}):
|
||||||
|
fullurl = f"{url}/v1/jobs"
|
||||||
|
ret = dict()
|
||||||
|
try:
|
||||||
|
req = requests.request("post", fullurl, verify=verify, json=job)
|
||||||
|
except (requests.exceptions.RequestException) as exc:
|
||||||
|
raise f"Exception {exc} occured"
|
||||||
|
ret = req.json()
|
||||||
|
if req.status_code == 201:
|
||||||
|
return ret
|
||||||
|
return None
|
153
states/_modules/ovhapi.py
Normal file
153
states/_modules/ovhapi.py
Normal file
@ -0,0 +1,153 @@
|
|||||||
|
#!/usr/bin/python3
|
||||||
|
|
||||||
|
from __future__ import absolute_import, unicode_literals, print_function
|
||||||
|
|
||||||
|
import re
|
||||||
|
import salt
|
||||||
|
import requests
|
||||||
|
import ovh
|
||||||
|
|
||||||
|
from salt.exceptions import CommandExecutionError, ArgumentValueError
|
||||||
|
from ovh.exceptions import ResourceNotFoundError, APIError
|
||||||
|
|
||||||
|
|
||||||
|
def __virtual__():
|
||||||
|
return True
|
||||||
|
|
||||||
|
def _config():
|
||||||
|
config = __salt__['config.get']('ovh')
|
||||||
|
if not config:
|
||||||
|
raise CommandExecutionError(
|
||||||
|
'OVH execution module configuration could not be found'
|
||||||
|
)
|
||||||
|
return config
|
||||||
|
|
||||||
|
|
||||||
|
def _auth():
|
||||||
|
cfg = _config()
|
||||||
|
client = ovh.Client(
|
||||||
|
endpoint=cfg['endpoint'],
|
||||||
|
application_key=cfg['application_key'],
|
||||||
|
application_secret=cfg['application_secret'],
|
||||||
|
consumer_key=cfg['consumer_key'],
|
||||||
|
)
|
||||||
|
return client
|
||||||
|
|
||||||
|
|
||||||
|
def domain_get_zone(zone=""):
|
||||||
|
'''
|
||||||
|
Get DNS zone extraction
|
||||||
|
|
||||||
|
zone
|
||||||
|
Zone name to fetch
|
||||||
|
'''
|
||||||
|
|
||||||
|
if zone == "":
|
||||||
|
raise ArgumentValueError("Zone is not defined")
|
||||||
|
client = _auth()
|
||||||
|
results = client.get(f'/domain/zone/{zone}/export')
|
||||||
|
return results
|
||||||
|
|
||||||
|
|
||||||
|
def domain_get_record(zone="", fieldType="", subDomain=""):
|
||||||
|
'''
|
||||||
|
Records of the zone
|
||||||
|
|
||||||
|
zone
|
||||||
|
Zone name to fetch
|
||||||
|
fieldType
|
||||||
|
Filter the value of fieldType property (like)
|
||||||
|
subDomain
|
||||||
|
Filter the value of subDomain property (like)
|
||||||
|
'''
|
||||||
|
|
||||||
|
if zone == "":
|
||||||
|
raise ArgumentValueError("Zone is not defined")
|
||||||
|
results = []
|
||||||
|
client = _auth()
|
||||||
|
try:
|
||||||
|
records = client.get(f'/domain/zone/{zone}/record',
|
||||||
|
fieldType=fieldType,
|
||||||
|
subDomain=subDomain)
|
||||||
|
except APIError:
|
||||||
|
return "Query failed in OVH API"
|
||||||
|
for record in records:
|
||||||
|
try:
|
||||||
|
req = client.get(f'/domain/zone/{zone}/record/{record}')
|
||||||
|
results.append(req)
|
||||||
|
except APIError:
|
||||||
|
return "Query failed in OVH API"
|
||||||
|
return results
|
||||||
|
|
||||||
|
|
||||||
|
def domain_post_record(zone="", fieldType="", subDomain="", target="", ttl=0):
|
||||||
|
'''
|
||||||
|
Create a new DNS record
|
||||||
|
|
||||||
|
zone
|
||||||
|
The internal name of your zone
|
||||||
|
fieldType
|
||||||
|
Filter the value of fieldType property (like)
|
||||||
|
subDomain
|
||||||
|
Filter the value of subDomain property (like)
|
||||||
|
target
|
||||||
|
Resource record target
|
||||||
|
ttl
|
||||||
|
Resource record ttl
|
||||||
|
'''
|
||||||
|
|
||||||
|
if zone == "":
|
||||||
|
raise ArgumentValueError("Zone is not defined")
|
||||||
|
client = _auth()
|
||||||
|
req = client.post(f'/domain/zone/{zone}/record',
|
||||||
|
fieldType=fieldType,
|
||||||
|
subDomain=subDomain,
|
||||||
|
target=target,
|
||||||
|
ttl=ttl)
|
||||||
|
return req
|
||||||
|
|
||||||
|
|
||||||
|
def domain_delete_record(zone="", fieldType="", subDomain=""):
|
||||||
|
'''
|
||||||
|
Delete a DNS record (Don't forget to refresh the zone)
|
||||||
|
|
||||||
|
zone
|
||||||
|
The internal name of your zone
|
||||||
|
fieldType
|
||||||
|
Filter the value of fieldType property (like)
|
||||||
|
subDomain
|
||||||
|
Filter the value of subDomain property (like)
|
||||||
|
'''
|
||||||
|
|
||||||
|
if zone == "":
|
||||||
|
raise ArgumentValueError("Zone is not defined")
|
||||||
|
results = []
|
||||||
|
client = _auth()
|
||||||
|
try:
|
||||||
|
records = client.get(f'/domain/zone/{zone}/record',
|
||||||
|
fieldType=fieldType,
|
||||||
|
subDomain=subDomain)
|
||||||
|
except APIError:
|
||||||
|
return "Query failed in OVH API"
|
||||||
|
for record in records:
|
||||||
|
try:
|
||||||
|
req = client.delete(f'/domain/zone/{zone}/record/{record}')
|
||||||
|
results.append(req)
|
||||||
|
except ResourceNotFoundError:
|
||||||
|
return "Resource not found in OVH API"
|
||||||
|
return results
|
||||||
|
|
||||||
|
|
||||||
|
def domain_refresh_zone(zone=""):
|
||||||
|
'''
|
||||||
|
Apply zone modification on DNS servers
|
||||||
|
|
||||||
|
zone
|
||||||
|
The internal name of your zone
|
||||||
|
'''
|
||||||
|
|
||||||
|
if zone == "":
|
||||||
|
raise ArgumentValueError("Zone is not defined")
|
||||||
|
client = _auth()
|
||||||
|
req = client.post(f'/domain/zone/{zone}/refresh')
|
||||||
|
return req
|
59
states/_modules/syncthing.py
Normal file
59
states/_modules/syncthing.py
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
#!/usr/bin/python3
|
||||||
|
|
||||||
|
import requests
|
||||||
|
import json
|
||||||
|
import salt.exceptions
|
||||||
|
import xml.etree.ElementTree as ET
|
||||||
|
|
||||||
|
def get_apikey(configfile="/root/.config/syncthing/config.xml"):
|
||||||
|
try:
|
||||||
|
tree = ET.parse(configfile)
|
||||||
|
root = tree.getroot()
|
||||||
|
apikey = root.find("./gui/apikey").text
|
||||||
|
return apikey
|
||||||
|
except (FileNotFoundError,ET.ParseError,AttributeError) as e:
|
||||||
|
raise "Exception {0} occured".format(e)
|
||||||
|
return ""
|
||||||
|
|
||||||
|
def get_config(url, verify, apikey):
|
||||||
|
fullurl = "{0}/rest/system/config".format(url)
|
||||||
|
ret = dict()
|
||||||
|
try:
|
||||||
|
req = requests.request("get", fullurl, verify=verify, headers={"X-API-Key": apikey})
|
||||||
|
except (requests.exceptions.RequestException) as exc:
|
||||||
|
raise "Exception {0} occured".format(exc)
|
||||||
|
ret = req.json()
|
||||||
|
if req.status_code == 200:
|
||||||
|
return ret
|
||||||
|
return None
|
||||||
|
|
||||||
|
def set_config(url, verify, apikey, config):
|
||||||
|
fullurl = "{0}/rest/system/config".format(url)
|
||||||
|
try:
|
||||||
|
req = requests.request("post", fullurl, verify=verify, headers={"X-API-Key": apikey}, json=config)
|
||||||
|
except (requests.exceptions.RequestException) as exc:
|
||||||
|
raise "Exception {0} occured".format(exc)
|
||||||
|
if req.status_code == 200:
|
||||||
|
return True
|
||||||
|
return None
|
||||||
|
|
||||||
|
def insync(url, verify, apikey):
|
||||||
|
fullurl = "{0}/rest/system/config/insync".format(url)
|
||||||
|
try:
|
||||||
|
req = requests.request("get", fullurl, verify=verify, headers={"X-API-Key": apikey})
|
||||||
|
except (requests.exceptions.RequestException) as exc:
|
||||||
|
raise "Exception {0} occured".format(exc)
|
||||||
|
ret = req.json()
|
||||||
|
if req.status_code == 200:
|
||||||
|
return ret
|
||||||
|
return None
|
||||||
|
|
||||||
|
def restart(url, verify, apikey):
|
||||||
|
fullurl = "{0}/rest/system/restart".format(url)
|
||||||
|
try:
|
||||||
|
req = requests.post(fullurl, verify=verify, headers={"X-API-Key": apikey})
|
||||||
|
except (requests.exceptions.RequestException) as exc:
|
||||||
|
raise "Exception {0} occured".format(exc)
|
||||||
|
if req.status_code == 200:
|
||||||
|
return {}
|
||||||
|
return None
|
51
states/_runners/process_minion_data.py
Executable file
51
states/_runners/process_minion_data.py
Executable file
@ -0,0 +1,51 @@
|
|||||||
|
#!/usr/pkg/bin/python2
|
||||||
|
#-*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
import os
|
||||||
|
import subprocess
|
||||||
|
import salt.modules.smtp
|
||||||
|
import json
|
||||||
|
|
||||||
|
'''
|
||||||
|
For use with salt reactor
|
||||||
|
'''
|
||||||
|
|
||||||
|
def email_errors(fromaddr, toaddrs, subject, data_str, smtp_server):
|
||||||
|
data = eval(data_str)
|
||||||
|
error = False
|
||||||
|
changes = False
|
||||||
|
|
||||||
|
try:
|
||||||
|
if type(data['return']) is dict:
|
||||||
|
for state, result in data['return'].iteritems():
|
||||||
|
if not result['result']:
|
||||||
|
error = True
|
||||||
|
break
|
||||||
|
if result['changes']:
|
||||||
|
changes = True
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
if not data['success']:
|
||||||
|
error = True
|
||||||
|
except KeyError as e:
|
||||||
|
exit()
|
||||||
|
|
||||||
|
#if error or changes:
|
||||||
|
if error:
|
||||||
|
js = subprocess.check_output(["salt-run", "--out=json", "jobs.lookup_jid", data['jid']])
|
||||||
|
body = "JobId is %s\n" % (data['jid'])
|
||||||
|
outdata = json.loads(js)
|
||||||
|
nodename = outdata.keys()[0]
|
||||||
|
for i in outdata[nodename]:
|
||||||
|
if not outdata[nodename][i]["result"]:
|
||||||
|
name = outdata[nodename][i]["name"]
|
||||||
|
comment = outdata[nodename][i]["comment"].rstrip('\n')
|
||||||
|
data = "%s- %s / %s\n" % (body, name, comment)
|
||||||
|
salt.modules.smtp.send_msg(recipient=toaddrs, message=data, subject=subject, sender=fromaddr, server=smtp_server, use_ssl=False)
|
||||||
|
return True
|
||||||
|
|
||||||
|
def email_auth(fromaddr, toaddrs, subject, data_str, smtp_server):
|
||||||
|
data = eval(data_str)
|
||||||
|
salt.modules.smtp.send_msg(recipient=toaddrs, message=data, subject=subject, sender=fromaddr, server=smtp_server, use_ssl=False)
|
||||||
|
|
||||||
|
return True
|
74
states/_states/custom.py
Executable file
74
states/_states/custom.py
Executable file
@ -0,0 +1,74 @@
|
|||||||
|
#!/usr/bin/python3
|
||||||
|
|
||||||
|
import salt.exceptions
|
||||||
|
|
||||||
|
def current_state(name):
|
||||||
|
ret = dict()
|
||||||
|
|
||||||
|
ret['name'] = 'blabla'
|
||||||
|
|
||||||
|
return ret
|
||||||
|
|
||||||
|
def enforce_custom_thing(name, foo, bar=True):
|
||||||
|
'''
|
||||||
|
Enforce the state of a custom thing
|
||||||
|
|
||||||
|
This state module does a custom thing. It calls out to the execution module
|
||||||
|
``y_custom_module`` in order to check the current system and perform any
|
||||||
|
needed changes.
|
||||||
|
|
||||||
|
name
|
||||||
|
The thing to do something to
|
||||||
|
foo
|
||||||
|
A required argument
|
||||||
|
bar : True
|
||||||
|
An argument with a default value
|
||||||
|
'''
|
||||||
|
ret = {
|
||||||
|
'name': name,
|
||||||
|
'changes': {},
|
||||||
|
'result': False,
|
||||||
|
'comment': '',
|
||||||
|
}
|
||||||
|
|
||||||
|
# Start with basic error-checking. Do all the passed parameters make sense
|
||||||
|
# and agree with each-other?
|
||||||
|
if bar == True and foo.startswith('Foo'):
|
||||||
|
raise salt.exceptions.SaltInvocationError(
|
||||||
|
'Argument "foo" cannot start with "Foo" if argument "bar" is True.')
|
||||||
|
|
||||||
|
# Check the current state of the system. Does anything need to change?
|
||||||
|
current_state = __salt__['custom.current_state'](name)
|
||||||
|
|
||||||
|
if current_state == foo:
|
||||||
|
ret['result'] = True
|
||||||
|
ret['comment'] = 'System already in the correct state %s' % name
|
||||||
|
return ret
|
||||||
|
|
||||||
|
# The state of the system does need to be changed. Check if we're running
|
||||||
|
# in ``test=true`` mode.
|
||||||
|
if __opts__['test'] == True:
|
||||||
|
ret['comment'] = 'The state of "{0}" will be changed.'.format(name)
|
||||||
|
ret['changes'] = {
|
||||||
|
'old': current_state,
|
||||||
|
'new': 'Description, diff, whatever of the new state',
|
||||||
|
}
|
||||||
|
|
||||||
|
# Return ``None`` when running with ``test=true``.
|
||||||
|
ret['result'] = None
|
||||||
|
|
||||||
|
return ret
|
||||||
|
|
||||||
|
# Finally, make the actual change and return the result.
|
||||||
|
new_state = __salt__['custom.change_state'](name, foo)
|
||||||
|
|
||||||
|
ret['comment'] = 'The state of "{0}" was changed!'.format(name)
|
||||||
|
|
||||||
|
ret['changes'] = {
|
||||||
|
'old': current_state,
|
||||||
|
'new': new_state,
|
||||||
|
}
|
||||||
|
|
||||||
|
ret['result'] = True
|
||||||
|
|
||||||
|
return ret
|
24
states/_states/dkron.py
Normal file
24
states/_states/dkron.py
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
#!/usr/bin/python3
|
||||||
|
|
||||||
|
from __future__ import absolute_import, print_function, unicode_literals
|
||||||
|
import salt.utils.dictupdate
|
||||||
|
import salt.utils.dictdiffer
|
||||||
|
|
||||||
|
def jobs(name, url="http://localhost:8080", verify=False, jobs=[]):
|
||||||
|
ret = {'name': name,
|
||||||
|
'changes': {},
|
||||||
|
'result': True,
|
||||||
|
'comment': 'Config is up to date'}
|
||||||
|
|
||||||
|
#dk_jobs = []
|
||||||
|
#dk_jobs = __salt__['dkron.get_jobs'](url, verify)
|
||||||
|
|
||||||
|
for job in jobs:
|
||||||
|
res = __salt__['dkron.set_jobs'](url, verify, job)
|
||||||
|
if res is not None:
|
||||||
|
ret['changes'][job['name']] = res
|
||||||
|
else:
|
||||||
|
ret['result'] = False
|
||||||
|
ret['comment'] = "Error occured"
|
||||||
|
|
||||||
|
return ret
|
65
states/_states/ovhapi.py
Normal file
65
states/_states/ovhapi.py
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
#!/usr/bin/python3
|
||||||
|
|
||||||
|
from __future__ import absolute_import, print_function, unicode_literals
|
||||||
|
|
||||||
|
import salt.utils.dictupdate
|
||||||
|
import salt.utils.dictdiffer
|
||||||
|
|
||||||
|
def _error(ret, err_msg):
|
||||||
|
ret['result'] = False
|
||||||
|
ret['comment'] = err_msg
|
||||||
|
return ret
|
||||||
|
|
||||||
|
def _str_split(string):
|
||||||
|
delim = "\n"
|
||||||
|
return [e + delim for e in string.split(delim) if e]
|
||||||
|
|
||||||
|
def domain_record_present(name,
|
||||||
|
zone=None,
|
||||||
|
recordname=None,
|
||||||
|
recordtype=None,
|
||||||
|
target=None,
|
||||||
|
ttl=0):
|
||||||
|
ret = {
|
||||||
|
'name': name,
|
||||||
|
'changes': {},
|
||||||
|
'result': True,
|
||||||
|
'comment': 'Config is up to date'
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if name is None:
|
||||||
|
return _error(ret, 'Must provide name to ovhapi.domain_record_present')
|
||||||
|
if zone is None:
|
||||||
|
return _error(ret, 'Must provide dns zone to ovhapi.domain_record_present')
|
||||||
|
if recordname is None:
|
||||||
|
return _error(ret, 'Must provide record name to ovhapi.domain_record_present')
|
||||||
|
if recordtype is None:
|
||||||
|
return _error(ret, 'Must provide record type to ovhapi.domain_record_present')
|
||||||
|
if target is None:
|
||||||
|
return _error(ret, 'Must provide target to ovhapi.domain_record_present')
|
||||||
|
|
||||||
|
# check if record exists
|
||||||
|
if len(__salt__['ovhapi.domain_get_record'](zone=zone,
|
||||||
|
fieldType=recordtype,
|
||||||
|
subDomain=recordname)):
|
||||||
|
ret['comment'] = f"Record on {zone} named {recordname} with type {recordtype} already exists"
|
||||||
|
return ret
|
||||||
|
|
||||||
|
cur_zone_state = __salt__['ovhapi.domain_get_zone'](zone=zone)
|
||||||
|
|
||||||
|
res = __salt__['ovhapi.domain_post_record'](
|
||||||
|
zone=zone,
|
||||||
|
subDomain=recordname,
|
||||||
|
fieldType=recordtype,
|
||||||
|
target=target,
|
||||||
|
ttl=ttl)
|
||||||
|
|
||||||
|
new_zone_state = __salt__['ovhapi.domain_get_zone'](zone=zone)
|
||||||
|
|
||||||
|
ret['changes'] = {
|
||||||
|
"diff": salt.utils.stringutils.get_diff(_str_split(cur_zone_state), _str_split(new_zone_state))
|
||||||
|
}
|
||||||
|
ret['comment'] = f'Result is {res}'
|
||||||
|
|
||||||
|
return ret
|
27
states/_states/syncthing.py
Normal file
27
states/_states/syncthing.py
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
#!/usr/bin/python3
|
||||||
|
|
||||||
|
from __future__ import absolute_import, print_function, unicode_literals
|
||||||
|
import salt.utils.dictupdate
|
||||||
|
import salt.utils.dictdiffer
|
||||||
|
|
||||||
|
def config(name, verify, url, cfg):
|
||||||
|
ret = {'name': name,
|
||||||
|
'changes': {},
|
||||||
|
'result': True,
|
||||||
|
'comment': 'config is up to date'}
|
||||||
|
|
||||||
|
cfg = dict(cfg)
|
||||||
|
|
||||||
|
apikey = __salt__['syncthing.get_apikey']()
|
||||||
|
st_cfg = __salt__['syncthing.get_config'](url, verify, apikey)
|
||||||
|
|
||||||
|
cfg['gui']['apiKey'] = apikey
|
||||||
|
|
||||||
|
res_cfg = salt.utils.dictupdate.update(st_cfg, cfg, recursive_update=True, merge_lists=False)
|
||||||
|
|
||||||
|
## Return to managed to set result
|
||||||
|
__salt__['syncthing.set_config'](url, verify, apikey, res_cfg)
|
||||||
|
|
||||||
|
ret['changes'] = salt.utils.dictdiffer.deep_diff(st_cfg, res_cfg)
|
||||||
|
|
||||||
|
return ret
|
20
states/acme/defaults.yaml
Normal file
20
states/acme/defaults.yaml
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
---
|
||||||
|
acme:
|
||||||
|
enabled: true
|
||||||
|
directories:
|
||||||
|
- "/etc/acme/dh/"
|
||||||
|
- "/etc/acme/keys/"
|
||||||
|
- "/etc/acme/certs/"
|
||||||
|
dh:
|
||||||
|
path: "/etc/acme/dh/dh.pem"
|
||||||
|
keysize: 1024
|
||||||
|
keysize: 4096
|
||||||
|
domain: "*.example.com"
|
||||||
|
dns: "dns_provider"
|
||||||
|
keyfile: "/etc/acme/keys/private.key"
|
||||||
|
fullchainfile: "/etc/acme/certs/certificate.crt"
|
||||||
|
provider:
|
||||||
|
api:
|
||||||
|
application_key: "test"
|
||||||
|
application_secret: "test"
|
||||||
|
consumer_key: "test"
|
50
states/acme/init.sls
Normal file
50
states/acme/init.sls
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
# vim:syntax=yaml
|
||||||
|
---
|
||||||
|
{%- from "acme/map.jinja" import acme with context %}
|
||||||
|
acme-install:
|
||||||
|
cmd.run:
|
||||||
|
- name: "curl https://get.acme.sh | sh"
|
||||||
|
- runas: root
|
||||||
|
- cwd: /root
|
||||||
|
- env:
|
||||||
|
- HOME: /root
|
||||||
|
- unless: /bin/bash -c "[[ -f /root/.acme.sh/acme.sh ]]"
|
||||||
|
|
||||||
|
acme-upgrade:
|
||||||
|
cmd.run:
|
||||||
|
- name: /root/.acme.sh/acme.sh --upgrade
|
||||||
|
- runas: root
|
||||||
|
- cwd: /root
|
||||||
|
- env:
|
||||||
|
- HOME: /root
|
||||||
|
- require:
|
||||||
|
- cmd: acme-install
|
||||||
|
|
||||||
|
{%- for dir in acme.directories %}
|
||||||
|
acme-directories-{{ dir }}:
|
||||||
|
file.directory:
|
||||||
|
- name: {{ dir }}
|
||||||
|
- makedirs: True
|
||||||
|
{%- endfor %}
|
||||||
|
|
||||||
|
acme-dh-params:
|
||||||
|
cmd.run:
|
||||||
|
- name: openssl dhparam -out {{ acme.dh.path }} {{ acme.dh.keysize }}
|
||||||
|
- creates: {{ acme.dh.path }}
|
||||||
|
|
||||||
|
acme-certs:
|
||||||
|
cmd.run:
|
||||||
|
- name: /root/.acme.sh/acme.sh --issue {%- for dom in acme.domains %} -d '{{ dom }}' {% endfor -%} --dns dns_ovh --cert-file '' --key-file '{{ acme.keyfile }}' --fullchain-file '{{ acme.fullchainfile }}' -k {{ acme.keysize }}
|
||||||
|
- env:
|
||||||
|
- OVH_AK: '{{ acme.provider.api.application_key }}'
|
||||||
|
- OVH_AS: '{{ acme.provider.api.application_secret }}'
|
||||||
|
- OVH_CK: '{{ acme.provider.api.consumer_key }}'
|
||||||
|
- HOME: '/root'
|
||||||
|
- success_retcodes:
|
||||||
|
- 0
|
||||||
|
- 1
|
||||||
|
- 2
|
||||||
|
- runas: root
|
||||||
|
- cwd: /root
|
||||||
|
- require:
|
||||||
|
- cmd: acme-install
|
5
states/acme/map.jinja
Normal file
5
states/acme/map.jinja
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
{%- import_yaml "acme/defaults.yaml" as default_settings -%}
|
||||||
|
|
||||||
|
{%- set defaults = salt['grains.filter_by'](default_settings, default='acme') -%}
|
||||||
|
|
||||||
|
{%- set acme = salt['pillar.get']('acme', default=defaults, merge=True) -%}
|
5
states/androidstudio/defaults.yaml
Normal file
5
states/androidstudio/defaults.yaml
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
androidstudio:
|
||||||
|
enabled: true
|
||||||
|
install_dir: /usr/local/apps
|
||||||
|
config:
|
24
states/androidstudio/init.sls
Normal file
24
states/androidstudio/init.sls
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
---
|
||||||
|
# https://developer.android.com/studio/archive.html
|
||||||
|
{%- from "androidstudio/map.jinja" import androidstudio with context %}
|
||||||
|
|
||||||
|
{%- if salt['file.grep'](androidstudio.install_dir + '/android-studio/build.txt', androidstudio.version_regex)['retcode'] == 1 or not salt['file.file_exists'](androidstudio.install_dir + '/android-studio/build.txt') %}
|
||||||
|
androidstudio-archive-extract:
|
||||||
|
archive.extracted:
|
||||||
|
- name: {{ androidstudio.install_dir }}
|
||||||
|
- source: {{ androidstudio.mirror }}/{{ androidstudio.version }}/android-studio-ide-{{ androidstudio.tag }}-linux.tar.gz
|
||||||
|
- skip_verify: True
|
||||||
|
- archive_format: tar
|
||||||
|
- overwrite: True
|
||||||
|
|
||||||
|
androidstudio-shortcut:
|
||||||
|
file.managed:
|
||||||
|
- name: /usr/share/applications/jetbrains-studio.desktop
|
||||||
|
- source: salt://androidstudio/jetbrains-studio.desktop.j2
|
||||||
|
- user: root
|
||||||
|
- group: root
|
||||||
|
- mode: 644
|
||||||
|
- template: jinja
|
||||||
|
- onchanges:
|
||||||
|
- androidstudio-archive-extract
|
||||||
|
{%- endif %}
|
12
states/androidstudio/jetbrains-studio.desktop.j2
Normal file
12
states/androidstudio/jetbrains-studio.desktop.j2
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
## {{ salt['pillar.get']('salt_managed', default='Salt Managed') }}
|
||||||
|
{%- from "androidstudio/map.jinja" import androidstudio with context %}
|
||||||
|
[Desktop Entry]
|
||||||
|
Version=1.0
|
||||||
|
Type=Application
|
||||||
|
Name=Android Studio
|
||||||
|
Icon={{ androidstudio.install_dir }}/android-studio/bin/studio.png
|
||||||
|
Exec="{{ androidstudio.install_dir }}/android-studio/bin/studio.sh" %f
|
||||||
|
Comment=Develop with pleasure on Android!
|
||||||
|
Categories=Development;IDE;
|
||||||
|
Terminal=false
|
||||||
|
StartupWMClass=jetbrains-studio
|
5
states/androidstudio/map.jinja
Normal file
5
states/androidstudio/map.jinja
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
{%- import_yaml "androidstudio/defaults.yaml" as default_settings -%}
|
||||||
|
|
||||||
|
{%- set defaults = salt['grains.filter_by'](default_settings, default='androidstudio') -%}
|
||||||
|
|
||||||
|
{%- set androidstudio = salt['pillar.get']('androidstudio', default=defaults, merge=True) -%}
|
4
states/apparmor/defaults.yaml
Normal file
4
states/apparmor/defaults.yaml
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
---
|
||||||
|
apparmor:
|
||||||
|
enabled: true
|
||||||
|
config:
|
21
states/apparmor/init.sls
Normal file
21
states/apparmor/init.sls
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
---
|
||||||
|
{%- from "apparmor/map.jinja" import apparmor with context %}
|
||||||
|
{%- if apparmor.enabled is defined and apparmor.enabled %}
|
||||||
|
{%- for apparmor_config in ['usr.bin.skype','opt.kingsoft','usr.bin.spotify','opt.sublime_text_3.sublime_text'] %}
|
||||||
|
apparmor-{{ apparmor_config }}:
|
||||||
|
file.managed:
|
||||||
|
- name: "/etc/apparmor.d/{{ apparmor_config }}"
|
||||||
|
- source: "salt://apparmor/{{ apparmor_config }}.j2"
|
||||||
|
- user: root
|
||||||
|
- group: root
|
||||||
|
- mode: 0644
|
||||||
|
- template: jinja
|
||||||
|
- watch_in:
|
||||||
|
- service: apparmor-reload
|
||||||
|
{%- endfor %}
|
||||||
|
|
||||||
|
apparmor-reload:
|
||||||
|
service.running:
|
||||||
|
- name: apparmor
|
||||||
|
- enable: true
|
||||||
|
{%- endif %}
|
5
states/apparmor/map.jinja
Normal file
5
states/apparmor/map.jinja
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
{%- import_yaml "apparmor/defaults.yaml" as default_settings %}
|
||||||
|
|
||||||
|
{%- set defaults = salt['grains.filter_by'](default_settings, default='apparmor') %}
|
||||||
|
|
||||||
|
{%- set apparmor = salt['pillar.get']('apparmor', default=defaults, merge=True) %}
|
27
states/apparmor/opt.kingsoft.j2
Normal file
27
states/apparmor/opt.kingsoft.j2
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
#include <tunables/global>
|
||||||
|
/opt/kingsoft/** {
|
||||||
|
#include <abstractions/audio>
|
||||||
|
#include <abstractions/base>
|
||||||
|
#include <abstractions/dbus>
|
||||||
|
#include <abstractions/dbus-session>
|
||||||
|
#include <abstractions/fonts>
|
||||||
|
#include <abstractions/freedesktop.org>
|
||||||
|
#include <abstractions/gnome>
|
||||||
|
#include <abstractions/ibus>
|
||||||
|
#include <abstractions/kde>
|
||||||
|
#include <abstractions/nameservice>
|
||||||
|
#include <abstractions/nvidia>
|
||||||
|
#include <abstractions/ssl_certs>
|
||||||
|
#include <abstractions/user-tmp>
|
||||||
|
#include <abstractions/X>
|
||||||
|
|
||||||
|
/opt/kingsoft/** rwmkl,
|
||||||
|
owner @{HOME}/.kingsoft/** rw,
|
||||||
|
owner @{HOME}/.config/Kingsoft/ rwmkl,
|
||||||
|
owner @{HOME}/.config/Kingsoft/** rwmkl,
|
||||||
|
owner @{HOME}/ r,
|
||||||
|
owner @{HOME}/Documents/ rw,
|
||||||
|
owner @{HOME}/Documents/** rw,
|
||||||
|
|
||||||
|
deny network inet,
|
||||||
|
}
|
37
states/apparmor/opt.sublime_text_3.sublime_text.j2
Normal file
37
states/apparmor/opt.sublime_text_3.sublime_text.j2
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
#include <tunables/global>
|
||||||
|
|
||||||
|
/opt/sublime_text_3/sublime_text {
|
||||||
|
#include <abstractions/base>
|
||||||
|
#include <abstractions/X>
|
||||||
|
#include <abstractions/ibus>
|
||||||
|
#include <abstractions/dbus>
|
||||||
|
#include <abstractions/dbus-session>
|
||||||
|
#include <abstractions/dbus-accessibility>
|
||||||
|
#include <abstractions/dbus-session-strict>
|
||||||
|
#include <abstractions/gnome>
|
||||||
|
|
||||||
|
/usr/share/mate/applications/** r,
|
||||||
|
/usr/bin/caja rwix,
|
||||||
|
/usr/share/glib-*/schemas/** r,
|
||||||
|
/dev/null r,
|
||||||
|
|
||||||
|
/{dev,run}/{,shm/}** rwmkl,
|
||||||
|
/opt/sublime_text_3/ rwixmkl,
|
||||||
|
/opt/sublime_text_3/** rwixmkl,
|
||||||
|
|
||||||
|
owner @{HOME}/.config/sublime-text-3/ rwmkl,
|
||||||
|
owner @{HOME}/.config/sublime-text-3/** rwmkl,
|
||||||
|
owner @{HOME}/ rwmkl,
|
||||||
|
owner @{HOME}/** rwmkl,
|
||||||
|
|
||||||
|
deny network inet,
|
||||||
|
deny network inet6,
|
||||||
|
deny network raw,
|
||||||
|
}
|
||||||
|
|
||||||
|
/opt/sublime_text_3/plugin_host {
|
||||||
|
#include <abstractions/base>
|
||||||
|
deny network inet,
|
||||||
|
deny network inet6,
|
||||||
|
deny network raw,
|
||||||
|
}
|
77
states/apparmor/usr.bin.skype.j2
Normal file
77
states/apparmor/usr.bin.skype.j2
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
#include <tunables/global>
|
||||||
|
/usr/bin/skype {
|
||||||
|
#include <abstractions/audio>
|
||||||
|
#include <abstractions/base>
|
||||||
|
#include <abstractions/dbus-session>
|
||||||
|
#include <abstractions/fonts>
|
||||||
|
#include <abstractions/freedesktop.org>
|
||||||
|
#include <abstractions/gnome>
|
||||||
|
#include <abstractions/ibus>
|
||||||
|
#include <abstractions/kde>
|
||||||
|
#include <abstractions/nameservice>
|
||||||
|
#include <abstractions/nvidia>
|
||||||
|
#include <abstractions/ssl_certs>
|
||||||
|
#include <abstractions/user-tmp>
|
||||||
|
#include <abstractions/X>
|
||||||
|
|
||||||
|
@{PROC}/sys/kernel/{ostype,osrelease} r,
|
||||||
|
@{PROC}/@{pid}/net/arp r,
|
||||||
|
owner @{PROC}/@{pid}/auxv r,
|
||||||
|
owner @{PROC}/@{pid}/cmdline r,
|
||||||
|
owner @{PROC}/@{pid}/fd/ r,
|
||||||
|
owner @{PROC}/@{pid}/task/ r,
|
||||||
|
owner @{PROC}/@{pid}/task/[0-9]*/stat r,
|
||||||
|
|
||||||
|
/sys/devices/**/power_supply/**/online r,
|
||||||
|
/sys/devices/system/cpu/ r,
|
||||||
|
/sys/devices/system/cpu/cpu[0-9]*/cpufreq/scaling_{cur_freq,max_freq} r,
|
||||||
|
|
||||||
|
/dev/ r,
|
||||||
|
owner /{dev,run}/shm/pulse-shm* m,
|
||||||
|
/dev/snd/* m,
|
||||||
|
/dev/video* mrw,
|
||||||
|
|
||||||
|
/var/cache/libx11/compose/* r,
|
||||||
|
|
||||||
|
# should this be in a separate KDE abstraction?
|
||||||
|
owner @{HOME}/.kde{,4}/share/config/kioslaverc r,
|
||||||
|
|
||||||
|
/usr/bin/skype mr,
|
||||||
|
/etc/xdg/sni-qt.conf rk,
|
||||||
|
/etc/xdg/Trolltech.conf rk,
|
||||||
|
/usr/share/skype/** kr,
|
||||||
|
/usr/share/skype/**/*.qm mr,
|
||||||
|
/usr/share/skype/sounds/*.wav kr,
|
||||||
|
/usr/lib{,32}/pango/** mr,
|
||||||
|
/usr/lib{,32}/libv4l/* mr,
|
||||||
|
|
||||||
|
# For opening links in the browser (still requires explicit access to execute
|
||||||
|
# the browser)
|
||||||
|
/usr/bin/xdg-open ixr,
|
||||||
|
|
||||||
|
owner @{HOME}/.Skype/ rw,
|
||||||
|
owner @{HOME}/.Skype/** krw,
|
||||||
|
owner @{HOME}/.config/ r,
|
||||||
|
owner @{HOME}/.config/*/ r,
|
||||||
|
owner @{HOME}/.config/Skype/Skype.conf rw,
|
||||||
|
owner @{HOME}/.config/Trolltech.conf kr,
|
||||||
|
|
||||||
|
# Skype traverses the .mozilla directory and needs access to prefs.js
|
||||||
|
deny owner @{HOME}/.mozilla/ r,
|
||||||
|
deny owner @{HOME}/.mozilla/**/ r,
|
||||||
|
deny owner @{HOME}/.mozilla/*/*/prefs.js r,
|
||||||
|
|
||||||
|
# Skype also looks around in these directories
|
||||||
|
/{,usr/,usr/local/}lib{,32}/ r,
|
||||||
|
|
||||||
|
# Recent skype builds have an executable stack, so it tries to mmap certain
|
||||||
|
# files. Let's deny them for now.
|
||||||
|
deny /etc/passwd m,
|
||||||
|
deny /etc/group m,
|
||||||
|
deny /usr/share/fonts/** m,
|
||||||
|
|
||||||
|
# Silence a few non-needed writes
|
||||||
|
deny /var/cache/fontconfig/ w,
|
||||||
|
deny owner @{HOME}/.fontconfig/ w,
|
||||||
|
deny owner @{HOME}/.fontconfig/*.cache-*.TMP* w,
|
||||||
|
}
|
24
states/apparmor/usr.bin.spotify.j2
Normal file
24
states/apparmor/usr.bin.spotify.j2
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
#include <tunables/global>
|
||||||
|
|
||||||
|
/usr/bin/spotify {
|
||||||
|
#include <abstractions/base>
|
||||||
|
#include <abstractions/fonts>
|
||||||
|
#include <abstractions/kde>
|
||||||
|
#include <abstractions/nameservice>
|
||||||
|
|
||||||
|
/etc/xdg/Trolltech.conf rk,
|
||||||
|
/etc/xdg/sni-qt.conf r,
|
||||||
|
|
||||||
|
/usr/share/icons/*.theme k,
|
||||||
|
/usr/share/spotify/theme/**.{png,ico} r,
|
||||||
|
/usr/share/spotify/theme/**.{splang,xml} r,
|
||||||
|
|
||||||
|
owner @{PROC}/[0-9]*/task/ r,
|
||||||
|
|
||||||
|
owner @{HOME}/.cache/spotify/ rw,
|
||||||
|
owner @{HOME}/.cache/spotify/** rw,
|
||||||
|
owner @{HOME}/.config/Trolltech.conf rw,
|
||||||
|
owner @{HOME}/.config/spotify/ w,
|
||||||
|
|
||||||
|
owner @{HOME}/Music/** r,
|
||||||
|
}
|
8
states/appimagekit/init.sls
Normal file
8
states/appimagekit/init.sls
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
appimage-config-dir:
|
||||||
|
file.directory:
|
||||||
|
- name: /usr/share/appimagekit/
|
||||||
|
|
||||||
|
appimage-config-file:
|
||||||
|
file.absent:
|
||||||
|
- name: /usr/share/appimagekit/no_desktopintegration
|
3
states/apt/10proxy.j2
Normal file
3
states/apt/10proxy.j2
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
{%- if salt['pillar.get']('apt-proxy:name') != "None" %}
|
||||||
|
Acquire::http { proxy "http://{{salt['pillar.get']('apt-proxy:name')}}:{{ salt['pillar.get']('apt-proxy:port')}}" }
|
||||||
|
{%- endif %}
|
28
states/apt/init.sls
Normal file
28
states/apt/init.sls
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
---
|
||||||
|
apt-unauth:
|
||||||
|
file.append:
|
||||||
|
- name: /etc/apt/apt.conf.d/99-unauth
|
||||||
|
- text: 'APT::Get::AllowUnauthenticated "true";'
|
||||||
|
|
||||||
|
apt-aptitude-install:
|
||||||
|
pkg.latest:
|
||||||
|
- pkgs:
|
||||||
|
- aptitude
|
||||||
|
- apt-transport-https
|
||||||
|
#
|
||||||
|
# apt-upgrade:
|
||||||
|
# pkg.uptodate:
|
||||||
|
# - refresh: True
|
||||||
|
#
|
||||||
|
#apt-cacher-ng-proxy:
|
||||||
|
# file.managed:
|
||||||
|
# - name: /etc/apt/apt.conf.d/10proxy
|
||||||
|
# - source: salt://apt/10proxy.j2
|
||||||
|
# - user: root
|
||||||
|
# - group: root
|
||||||
|
# - mode: 0644
|
||||||
|
# - template: jinja
|
||||||
|
#
|
||||||
|
# apt-cacher-ng-proxy-delete:
|
||||||
|
# file.absent:
|
||||||
|
# - name: /etc/apt/apt.conf.d/10proxy
|
14
states/arduino/arduino-arduinoide.desktop.j2
Normal file
14
states/arduino/arduino-arduinoide.desktop.j2
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
## {{ salt['pillar.get']('salt_managed', default='Salt Managed') }}
|
||||||
|
{%- from "arduino/map.jinja" import arduino with context %}
|
||||||
|
[Desktop Entry]
|
||||||
|
Type=Application
|
||||||
|
Name=Arduino IDE
|
||||||
|
GenericName=Arduino IDE
|
||||||
|
Comment=Open-source electronics prototyping platform
|
||||||
|
Exec={{ arduino.install_dir }}/arduino
|
||||||
|
Icon=arduino-arduinoide
|
||||||
|
Terminal=false
|
||||||
|
Categories=Development;IDE;Electronics;
|
||||||
|
MimeType=text/x-arduino
|
||||||
|
Keywords=embedded electronics;electronics;avr;microcontroller;
|
||||||
|
StartupWMClass=processing-app-Base
|
4
states/arduino/defaults.yaml
Normal file
4
states/arduino/defaults.yaml
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
---
|
||||||
|
arduino:
|
||||||
|
mirror: "https://downloads.arduino.cc"
|
||||||
|
install_dir: "/usr/local/apps"
|
40
states/arduino/init.sls
Normal file
40
states/arduino/init.sls
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
---
|
||||||
|
{%- from "arduino/map.jinja" import arduino with context %}
|
||||||
|
{%- if not salt['file.directory_exists']( arduino.install_dir + '/arduino-' + arduino.version ) %}
|
||||||
|
arduino-archive-extract:
|
||||||
|
archive.extracted:
|
||||||
|
- name: {{ arduino.install_dir }}
|
||||||
|
- source: {{ arduino.mirror }}/arduino-{{ arduino.version }}-{{ arduino.arch }}.tar.xz
|
||||||
|
- skip_verify: True
|
||||||
|
- archive_format: tar
|
||||||
|
- keep: True
|
||||||
|
- if_missing: {{ arduino.install_dir }}/arduino-{{ arduino.version }}
|
||||||
|
|
||||||
|
arduino-symlink:
|
||||||
|
file.symlink:
|
||||||
|
- name: {{ arduino.install_dir }}/arduino
|
||||||
|
- target: {{ arduino.install_dir }}/arduino-{{ arduino.version }}
|
||||||
|
- force: True
|
||||||
|
- onchanges:
|
||||||
|
- arduino-archive-extract
|
||||||
|
|
||||||
|
arduino-bin-symlink:
|
||||||
|
file.symlink:
|
||||||
|
- name: /usr/bin/arduino
|
||||||
|
- target: {{ arduino.install_dir }}/arduino-{{ arduino.version }}/arduino
|
||||||
|
- force: True
|
||||||
|
- onchanges:
|
||||||
|
- arduino-archive-extract
|
||||||
|
|
||||||
|
arduino-shortcut:
|
||||||
|
file.managed:
|
||||||
|
- name: /usr/share/applications/arduino-arduinoide.desktop
|
||||||
|
- source: salt://arduino/arduino-arduinoide.desktop.j2
|
||||||
|
- template: jinja
|
||||||
|
- user: root
|
||||||
|
- group: root
|
||||||
|
- mode: 644
|
||||||
|
- onchanges:
|
||||||
|
- arduino-archive-extract
|
||||||
|
- arduino-symlink
|
||||||
|
{%- endif %}
|
5
states/arduino/map.jinja
Normal file
5
states/arduino/map.jinja
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
{%- import_yaml "arduino/defaults.yaml" as default_settings -%}
|
||||||
|
|
||||||
|
{%- set defaults = salt['grains.filter_by'](default_settings, default='arduino') -%}
|
||||||
|
|
||||||
|
{%- set arduino = salt['pillar.get']('arduino', default=defaults, merge=True) -%}
|
20
states/bareos/bareos-fd.conf.j2
Normal file
20
states/bareos/bareos-fd.conf.j2
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
## {{ salt['pillar.get']('salt_managed', default='Salt Managed') }}
|
||||||
|
|
||||||
|
FileDaemon {
|
||||||
|
Name = {{ grains.get('host') }}
|
||||||
|
Maximum Concurrent Jobs = {{ salt['pillar.get']('bareos:director:max_concurrent_jobs', default=10) }}
|
||||||
|
Compatible = {{ salt['pillar.get']('bareos:director:compatible', default='No') }}
|
||||||
|
Working Directory = {{ salt['pillar.get']('bareos:director:working_dir', default='/var/run') }}
|
||||||
|
}
|
||||||
|
|
||||||
|
Director {
|
||||||
|
Name = {{ salt['pillar.get']('bareos:director:name', default='bareos-dir') }}
|
||||||
|
Address = {{ salt['pillar.get']('bareos:director:addr', default='localhost') }}
|
||||||
|
Password = "{{ salt['pillar.get']('bareos:director:password', default='password') }}"
|
||||||
|
Connection From Client To Director = {{ salt['pillar.get']('bareos:director:initiated', default='No') }}
|
||||||
|
}
|
||||||
|
|
||||||
|
Messages {
|
||||||
|
Name = standard
|
||||||
|
director = {{ salt['pillar.get']('bareos:director:name',default='bareos-dir') }} = all, !skipped, !restored
|
||||||
|
}
|
21
states/bareos/bareos-fd.service.j2
Normal file
21
states/bareos/bareos-fd.service.j2
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
## {{ salt['pillar.get']('salt_managed', default='Salt Managed') }}
|
||||||
|
[Unit]
|
||||||
|
Description=Bareos File Daemon
|
||||||
|
Before=multi-user.target
|
||||||
|
Before=graphical.target
|
||||||
|
Before=shutdown.target
|
||||||
|
After=network-online.target
|
||||||
|
After=remote-fs.target
|
||||||
|
After=time-sync.target
|
||||||
|
After=systemd-journald-dev-log.socket
|
||||||
|
Wants=network-online.target
|
||||||
|
Conflicts=shutdown.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=forking
|
||||||
|
KillMode=process
|
||||||
|
ExecStart=/usr/sbin/bareos-fd -c /etc/bareos/bareos-fd.conf
|
||||||
|
SuccessExitStatus=0 15
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
59
states/bareos/bareos-fd.sls
Normal file
59
states/bareos/bareos-fd.sls
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
---
|
||||||
|
{%- if salt['grains.get']('kernel') == 'Linux' %}
|
||||||
|
#bareos-pkg:
|
||||||
|
# pkg.purged:
|
||||||
|
# - pkgs:
|
||||||
|
# - bareos-common
|
||||||
|
# - bareos-filedaemon
|
||||||
|
# - bareos-bconsole
|
||||||
|
|
||||||
|
bareos-fd-bin:
|
||||||
|
file.managed:
|
||||||
|
- name: /usr/sbin/bareos-fd
|
||||||
|
- source: https://paulbsd-pub.s3.fr-par.scw.cloud/bareos/static-bareos-fd-{{ salt['grains.get']('osarch')|lower }}
|
||||||
|
- skip_verify: True
|
||||||
|
- user: root
|
||||||
|
- group: root
|
||||||
|
- mode: 0755
|
||||||
|
|
||||||
|
bareos-fd-service-file:
|
||||||
|
file.managed:
|
||||||
|
- name: /etc/systemd/system/bareos-fd.service
|
||||||
|
- source: salt://bareos/bareos-fd.service.j2
|
||||||
|
- user: root
|
||||||
|
- group: root
|
||||||
|
- mode: 0644
|
||||||
|
- template: jinja
|
||||||
|
- watch_in:
|
||||||
|
- service: bareos-fd-service
|
||||||
|
- require:
|
||||||
|
- file: bareos-fd-bin
|
||||||
|
|
||||||
|
bareos-fd-config-dir:
|
||||||
|
file.directory:
|
||||||
|
- name: /etc/bareos
|
||||||
|
- user: root
|
||||||
|
- group: root
|
||||||
|
- mode: 0755
|
||||||
|
|
||||||
|
bareos-fd-config:
|
||||||
|
file.managed:
|
||||||
|
- name: /etc/bareos/bareos-fd.conf
|
||||||
|
- source: salt://bareos/bareos-fd.conf.j2
|
||||||
|
- user: root
|
||||||
|
- group: root
|
||||||
|
- mode: 0644
|
||||||
|
- template: jinja
|
||||||
|
- watch_in:
|
||||||
|
- service: bareos-fd-service
|
||||||
|
- require:
|
||||||
|
- file: bareos-fd-bin
|
||||||
|
- file: bareos-fd-config-dir
|
||||||
|
|
||||||
|
bareos-fd-service:
|
||||||
|
service.running:
|
||||||
|
- name: bareos-fd
|
||||||
|
- enable: True
|
||||||
|
- require:
|
||||||
|
- file: bareos-fd-service-file
|
||||||
|
{%- endif %}
|
21
states/bareos/config.sls
Normal file
21
states/bareos/config.sls
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
---
|
||||||
|
bareos-fd-config-dir:
|
||||||
|
file.directory:
|
||||||
|
- name: {{ bareos.config_dir }}
|
||||||
|
- user: root
|
||||||
|
- group: root
|
||||||
|
- mode: 0755
|
||||||
|
|
||||||
|
bareos-fd-config:
|
||||||
|
file.managed:
|
||||||
|
- name: {{ bareos.config_dir }}/bareos-fd.conf
|
||||||
|
- source: salt://bareos/bareos-fd.conf.j2
|
||||||
|
- user: root
|
||||||
|
- group: root
|
||||||
|
- mode: 0644
|
||||||
|
- template: jinja
|
||||||
|
- watch_in:
|
||||||
|
- service: bareos-fd-service
|
||||||
|
- require:
|
||||||
|
- file: bareos-fd-bin
|
||||||
|
- file: bareos-fd-config-dir
|
8
states/bareos/defaults.yaml
Normal file
8
states/bareos/defaults.yaml
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
bareos:
|
||||||
|
enabled: true
|
||||||
|
config_dir: /etc/bareos
|
||||||
|
install_dir: /usr/local/bin
|
||||||
|
mirror: https://paulbsd-pub.s3.fr-par.scw.cloud/bareos
|
||||||
|
os: linux
|
||||||
|
arch: amd64
|
5
states/bareos/init.sls
Normal file
5
states/bareos/init.sls
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
{%- if salt['grains.get']('kernel') == 'Linux' %}
|
||||||
|
include:
|
||||||
|
- .install
|
||||||
|
{%- endif %}
|
17
states/bareos/install.sls
Normal file
17
states/bareos/install.sls
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
---
|
||||||
|
{%- from "bareos/map.jinja" import bareos with context %}
|
||||||
|
#bareos-pkg:
|
||||||
|
# pkg.purged:
|
||||||
|
# - pkgs:
|
||||||
|
# - bareos-common
|
||||||
|
# - bareos-filedaemon
|
||||||
|
# - bareos-bconsole
|
||||||
|
|
||||||
|
bareos-fd-bin:
|
||||||
|
file.managed:
|
||||||
|
- name: /usr/sbin/bareos-fd
|
||||||
|
- source: {{ bareos.mirror }}/static-bareos-fd-{{ bareos.arch }}
|
||||||
|
- skip_verify: True
|
||||||
|
- user: root
|
||||||
|
- group: root
|
||||||
|
- mode: 0755
|
3
states/bareos/kernelmap.yaml
Normal file
3
states/bareos/kernelmap.yaml
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
---
|
||||||
|
Linux:
|
||||||
|
os: "linux"
|
14
states/bareos/map.jinja
Normal file
14
states/bareos/map.jinja
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
{%- import_yaml "bareos/defaults.yaml" as default_settings -%}
|
||||||
|
|
||||||
|
{%- import_yaml "bareos/kernelmap.yaml" as kernelmap -%}
|
||||||
|
{%- import_yaml "bareos/osarchmap.yaml" as osarchmap -%}
|
||||||
|
|
||||||
|
{%- set defaults = salt['grains.filter_by'](default_settings,
|
||||||
|
default='bareos',
|
||||||
|
merge=salt['grains.filter_by'](osarchmap, grain='osarch',
|
||||||
|
merge=salt['grains.filter_by'](kernelmap, grain='kernel')
|
||||||
|
)
|
||||||
|
)
|
||||||
|
-%}
|
||||||
|
|
||||||
|
{%- set bareos = salt['pillar.get']('bareos', default=defaults, merge=True) -%}
|
21
states/bareos/osarchmap.yaml
Normal file
21
states/bareos/osarchmap.yaml
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
---
|
||||||
|
amd64:
|
||||||
|
arch: "amd64"
|
||||||
|
|
||||||
|
x86_64:
|
||||||
|
arch: "amd64"
|
||||||
|
|
||||||
|
386:
|
||||||
|
arch: "386"
|
||||||
|
|
||||||
|
arm64:
|
||||||
|
arch: "arm64"
|
||||||
|
|
||||||
|
armv6l:
|
||||||
|
arch: "arm"
|
||||||
|
|
||||||
|
armv7l:
|
||||||
|
arch: "arm"
|
||||||
|
|
||||||
|
armhf:
|
||||||
|
arch: "arm"
|
20
states/bareos/service.sls
Normal file
20
states/bareos/service.sls
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
---
|
||||||
|
bareos-fd-service-file:
|
||||||
|
file.managed:
|
||||||
|
- name: /etc/systemd/system/bareos-fd.service
|
||||||
|
- source: salt://bareos/bareos-fd.service.j2
|
||||||
|
- user: root
|
||||||
|
- group: root
|
||||||
|
- mode: 0644
|
||||||
|
- template: jinja
|
||||||
|
- watch_in:
|
||||||
|
- service: bareos-fd-service
|
||||||
|
- require:
|
||||||
|
- file: bareos-fd-bin
|
||||||
|
|
||||||
|
bareos-fd-service:
|
||||||
|
service.running:
|
||||||
|
- name: bareos-fd
|
||||||
|
- enable: True
|
||||||
|
- require:
|
||||||
|
- file: bareos-fd-service-file
|
4
states/burp/burp.conf.j2
Normal file
4
states/burp/burp.conf.j2
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
## {{ salt['pillar.get']('salt_managed', default='Salt Managed') }}
|
||||||
|
{%- for key, value in burp.config.items() %}
|
||||||
|
{{ key }} = {{ value }}
|
||||||
|
{%- endfor %}
|
131
states/burp/burp.conf.j2.sample
Normal file
131
states/burp/burp.conf.j2.sample
Normal file
@ -0,0 +1,131 @@
|
|||||||
|
# This is an example config file for the burp client.
|
||||||
|
|
||||||
|
mode = client
|
||||||
|
port = 4971
|
||||||
|
# A different port to use for restores - see the man page for more options.
|
||||||
|
#port_restore = 5971
|
||||||
|
status_port = 4972
|
||||||
|
server = {{ salt["pillar.get"]("burp:name") }}
|
||||||
|
password = {{ salt["pillar.get"]("burp:password") }}
|
||||||
|
cname = {{ grains.get('fqdn') }}
|
||||||
|
|
||||||
|
# Choose the protocol to use.
|
||||||
|
# 0 to decide automatically, 1 to force protocol1 mode (file level granularity
|
||||||
|
# with a pseudo mirrored storage on the server and optional rsync). 2 forces
|
||||||
|
# protocol2 mode (inline deduplication with variable length blocks).
|
||||||
|
# protocol = 0
|
||||||
|
pidfile = /var/run/burp.client.pid
|
||||||
|
syslog = 0
|
||||||
|
stdout = 1
|
||||||
|
progress_counter = 1
|
||||||
|
|
||||||
|
# Ratelimit throttles the send speed. Specified in Megabits per second (Mb/s).
|
||||||
|
# ratelimit = 1.5
|
||||||
|
# Network timeout defaults to 7200 seconds (2 hours).
|
||||||
|
# network_timeout = 7200
|
||||||
|
# The directory to which autoupgrade files will be downloaded.
|
||||||
|
# To never autoupgrade, leave it commented out.
|
||||||
|
# autoupgrade_dir=/etc/burp/autoupgrade/client
|
||||||
|
# OS path component for the autoupgrade directory on the server.
|
||||||
|
# autoupgrade_os=test_os
|
||||||
|
# Wait a random number of seconds between 0 and the given number before
|
||||||
|
# contacting the server on a timed backup.
|
||||||
|
# randomise = 1200
|
||||||
|
|
||||||
|
# Set server_can_restore to 0 if you do not want the server to be able to
|
||||||
|
# initiate a restore.
|
||||||
|
server_can_restore = 1
|
||||||
|
|
||||||
|
# Set server_can_override_includes to 0 if you do not want the server to be
|
||||||
|
# able to override the local include/exclude list. The default is 1.
|
||||||
|
# server_can_override_includes = 1
|
||||||
|
|
||||||
|
# Set an encryption password if you do not trust the server with your data.
|
||||||
|
# Note that this will mean that network deltas will not be possible. Each time
|
||||||
|
# a file changes, the whole file will be transferred on the next backup.
|
||||||
|
# encryption_password = My^$pAsswIrD%@
|
||||||
|
|
||||||
|
# More configuration files can be read, using syntax like the following
|
||||||
|
# (without the leading '# ').
|
||||||
|
# . path/to/more/conf
|
||||||
|
|
||||||
|
# Run as different user/group.
|
||||||
|
# user=graham
|
||||||
|
# group=nogroup
|
||||||
|
|
||||||
|
cross_filesystem=/home
|
||||||
|
cross_all_filesystems=0
|
||||||
|
|
||||||
|
# Uncomment the following lines to automatically generate a certificate signing
|
||||||
|
# request and send it to the server.
|
||||||
|
ca_burp_ca = /usr/sbin/burp_ca
|
||||||
|
ca_csr_dir = /etc/burp/CA-client
|
||||||
|
|
||||||
|
# SSL certificate authority - same file on both server and client
|
||||||
|
ssl_cert_ca = /etc/burp/ssl_cert_ca.pem
|
||||||
|
|
||||||
|
# Client SSL certificate
|
||||||
|
ssl_cert = /etc/burp/ssl_cert-client.pem
|
||||||
|
|
||||||
|
# Client SSL key
|
||||||
|
ssl_key = /etc/burp/ssl_cert-client.key
|
||||||
|
|
||||||
|
# Client SSL ciphers
|
||||||
|
#ssl_ciphers =
|
||||||
|
|
||||||
|
# Client SSL compression. Default is zlib5. Set to zlib0 to turn it off.
|
||||||
|
#ssl_compression = zlib5
|
||||||
|
|
||||||
|
# SSL key password, for loading a certificate with encryption.
|
||||||
|
#ssl_key_password = password
|
||||||
|
|
||||||
|
# Common name in the certificate that the server gives us
|
||||||
|
ssl_peer_cn = burpserver
|
||||||
|
|
||||||
|
# Example syntax for pre/post scripts
|
||||||
|
#backup_script_pre=/path/to/a/script
|
||||||
|
#backup_script_post=/path/to/a/script
|
||||||
|
#restore_script_pre=/path/to/a/script
|
||||||
|
#restore_script_post=/path/to/a/script
|
||||||
|
|
||||||
|
# The following options specify exactly what to backup.
|
||||||
|
# The server will override them if there is at least one 'include=' line on
|
||||||
|
# the server side and 'server_can_override_includes=1'.
|
||||||
|
#include = /home
|
||||||
|
#exclude = /home/graham/testdir/librsync-0.9.7/testsuite
|
||||||
|
#include = /home/graham/testdir/librsync-0.9.7/testsuite/deep
|
||||||
|
#include = /home/graham/xdir
|
||||||
|
#exclude = /home/graham/testdir/libr
|
||||||
|
# Exclude file names ending in '.vdi' or '.vmdk' (case insensitive)
|
||||||
|
#exclude_ext = vdi
|
||||||
|
#exclude_ext = vmd
|
||||||
|
# Exlude file path matching a regular expression
|
||||||
|
# (note that 'include_regex' is not yet implemented)
|
||||||
|
#exclude_regex = \.cache
|
||||||
|
# Exclude various temporary file systems. You may want to add devfs, devpts,
|
||||||
|
# proc, ramfs, etc.
|
||||||
|
exclude_fs = sysfs
|
||||||
|
exclude_fs = tmpfs
|
||||||
|
# Exclude files based on size. Defaults are 0, which means no limit.
|
||||||
|
#min_file_size = 0 Mb
|
||||||
|
#max_file_size = 0 Mb
|
||||||
|
# The content of directories containing a filesystem entry named like this
|
||||||
|
# will not be backed up.
|
||||||
|
nobackup = .nobackup
|
||||||
|
# By default, burp backups up the fifos themselves, rather than reading from
|
||||||
|
# them. These two options let you choose a particular fifo to read, or read
|
||||||
|
# from all fifos.
|
||||||
|
#read_fifo=/path/to/a/fifo
|
||||||
|
#read_all_fifos=0
|
||||||
|
# The same for block device nodes.
|
||||||
|
#read_blockdev=/path/to/a/blockdev
|
||||||
|
#read_all_blockdevs=0
|
||||||
|
# Exclude files from compression by extension.
|
||||||
|
exclude_comp=bz2
|
||||||
|
exclude_comp=gz
|
||||||
|
# When backing up, whether to enable O_NOATIME when opening files and
|
||||||
|
# directories. The default is atime=0, which enables O_NOATIME.
|
||||||
|
#atime=1
|
||||||
|
# When enabled, this causes problems in the phase1 scan (such as an 'include'
|
||||||
|
# being missing) to be treated as fatal errors. The default is 0.
|
||||||
|
#scan_problem_raises_error=1
|
12
states/burp/client/burp-backup.service.j2
Normal file
12
states/burp/client/burp-backup.service.j2
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
## {{ salt['pillar.get']('salt_managed', default='Salt Managed') }}
|
||||||
|
[Unit]
|
||||||
|
Description=Burp backup task
|
||||||
|
After=network-online.target
|
||||||
|
Wants=network-online.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
ExecStart=/usr/sbin/burp -ab
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
12
states/burp/client/burp-backup.timer.j2
Normal file
12
states/burp/client/burp-backup.timer.j2
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
## {{ salt['pillar.get']('salt_managed', default='Salt Managed') }}
|
||||||
|
[Unit]
|
||||||
|
Description=Burp backup timer
|
||||||
|
After=network-online.target
|
||||||
|
Wants=network-online.target
|
||||||
|
|
||||||
|
[Timer]
|
||||||
|
OnCalendar=Mon-Sun 23:30
|
||||||
|
Persistent=true
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=timers.target
|
11
states/burp/client/config.sls
Normal file
11
states/burp/client/config.sls
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
---
|
||||||
|
{%- from "burp/map.jinja" import burp with context %}
|
||||||
|
burp-client-config:
|
||||||
|
file.managed:
|
||||||
|
- name: /etc/burp/burp.conf
|
||||||
|
- source: salt://burp/burp.conf.j2
|
||||||
|
- user: root
|
||||||
|
- mode: 0644
|
||||||
|
- template: jinja
|
||||||
|
- require:
|
||||||
|
- pkg: burp-pkg
|
19
states/burp/client/service.sls
Normal file
19
states/burp/client/service.sls
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
---
|
||||||
|
{%- from "burp/map.jinja" import burp with context %}
|
||||||
|
{%- if salt['grains.get']('init') == 'systemd' %}
|
||||||
|
burp-task:
|
||||||
|
file.managed:
|
||||||
|
- name: /etc/systemd/system/burp-backup.service
|
||||||
|
- source: salt://burp/burp-backup.service.j2
|
||||||
|
- user: root
|
||||||
|
- mode: 0644
|
||||||
|
- template: jinja
|
||||||
|
|
||||||
|
burp-timer:
|
||||||
|
file.managed:
|
||||||
|
- name: /etc/systemd/system/burp-backup.timer
|
||||||
|
- source: salt://burp/burp-backup.timer.j2
|
||||||
|
- user: root
|
||||||
|
- mode: 0644
|
||||||
|
- template: jinja
|
||||||
|
{%- endif %}
|
66
states/burp/defaults.yaml
Normal file
66
states/burp/defaults.yaml
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
---
|
||||||
|
burp:
|
||||||
|
enabled: true
|
||||||
|
server:
|
||||||
|
name: nuc.paulbsd.com
|
||||||
|
config:
|
||||||
|
mode: server
|
||||||
|
port: 4971
|
||||||
|
port_restore: 5971
|
||||||
|
status_port: 4972
|
||||||
|
password: password
|
||||||
|
cname: hostname
|
||||||
|
pidfile: /var/run/burp.client.pid
|
||||||
|
syslog: 0
|
||||||
|
stdout: 1
|
||||||
|
progress_counter: 1
|
||||||
|
server_can_restore: 1
|
||||||
|
cross_filesystem: /home
|
||||||
|
cross_all_filesystems: 0
|
||||||
|
ca_burp_ca: /usr/sbin/burp_ca
|
||||||
|
ca_csr_dir: /etc/burp/CA-client
|
||||||
|
ssl_cert_ca: /etc/burp/ssl_cert_ca.pem
|
||||||
|
ssl_cert: /etc/burp/ssl_cert-client.pem
|
||||||
|
ssl_key: /etc/burp/ssl_cert-client.key
|
||||||
|
ssl_peer_cn: burpserver
|
||||||
|
exclude_fs: sysfs
|
||||||
|
exclude_fs: tmpfs
|
||||||
|
exclude_comp: bz2
|
||||||
|
exclude_comp: gz
|
||||||
|
nobackup: .nobackup
|
||||||
|
clients:
|
||||||
|
- name: thinkpad.paulbsd.com
|
||||||
|
schedule:
|
||||||
|
type: "after"
|
||||||
|
value: "600"
|
||||||
|
- name: scw01-ams.paulbsd.com
|
||||||
|
schedule:
|
||||||
|
type: "at"
|
||||||
|
value: "22h"
|
||||||
|
client:
|
||||||
|
config:
|
||||||
|
mode: client
|
||||||
|
port: 4971
|
||||||
|
port_restore: 5971
|
||||||
|
status_port: 4972
|
||||||
|
server: nuc.paulbsd.com
|
||||||
|
password: password
|
||||||
|
cname: hostname
|
||||||
|
pidfile: /var/run/burp.client.pid
|
||||||
|
syslog: 0
|
||||||
|
stdout: 1
|
||||||
|
progress_counter: 1
|
||||||
|
server_can_restore: 1
|
||||||
|
cross_filesystem: /home
|
||||||
|
cross_all_filesystems: 0
|
||||||
|
ca_burp_ca: /usr/sbin/burp_ca
|
||||||
|
ca_csr_dir: /etc/burp/CA-client
|
||||||
|
ssl_cert_ca: /etc/burp/ssl_cert_ca.pem
|
||||||
|
ssl_cert: /etc/burp/ssl_cert-client.pem
|
||||||
|
ssl_key: /etc/burp/ssl_cert-client.key
|
||||||
|
ssl_peer_cn: burpserver
|
||||||
|
exclude_fs: sysfs
|
||||||
|
exclude_fs: tmpfs
|
||||||
|
exclude_comp: bz2
|
||||||
|
exclude_comp: gz
|
||||||
|
nobackup: .nobackup
|
12
states/burp/init.sls
Normal file
12
states/burp/init.sls
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
---
|
||||||
|
{%- from "burp/map.jinja" import burp with context %}
|
||||||
|
include:
|
||||||
|
- .install
|
||||||
|
- .pkg
|
||||||
|
{%- if salt['grains.get']('fqdn') == burp.server.name %}
|
||||||
|
- .server.config
|
||||||
|
- .server.service
|
||||||
|
{%- elif salt['grains.get']('fqdn') in burp.hosts.name %}
|
||||||
|
- .client.config
|
||||||
|
- .client.service
|
||||||
|
{%- endif %}
|
7
states/burp/install.sls
Normal file
7
states/burp/install.sls
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
{%- from "burp/map.jinja" import burp with context %}
|
||||||
|
burp-config-dir:
|
||||||
|
file.directory:
|
||||||
|
- name: /etc/burp
|
||||||
|
- user: root
|
||||||
|
- mode: 0755
|
8
states/burp/map.jinja
Normal file
8
states/burp/map.jinja
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
{%- import_yaml "burp/defaults.yaml" as defaults -%}
|
||||||
|
|
||||||
|
{%- set burp = salt['pillar.get'](
|
||||||
|
'burp',
|
||||||
|
default=defaults.burp,
|
||||||
|
merge=True
|
||||||
|
)
|
||||||
|
-%}
|
4
states/burp/pkg.sls
Normal file
4
states/burp/pkg.sls
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
---
|
||||||
|
burp-pkg:
|
||||||
|
pkg.installed:
|
||||||
|
- name: burp
|
10
states/burp/server/burp.service.j2
Normal file
10
states/burp/server/burp.service.j2
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
## {{ salt['pillar.get']('salt_managed', default='Salt Managed') }}
|
||||||
|
[Unit]
|
||||||
|
Description=Burp backup timer
|
||||||
|
|
||||||
|
[Timer]
|
||||||
|
OnStartupSec=600
|
||||||
|
#OnCalendar=Mon-Sun 22:00
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=timers.target
|
11
states/burp/server/config.sls
Normal file
11
states/burp/server/config.sls
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
---
|
||||||
|
{% from "burp/map.jinja" import burp with context %}
|
||||||
|
burp-config:
|
||||||
|
file.managed:
|
||||||
|
- name: /etc/burp/burp-server.conf
|
||||||
|
- source: salt://burp/burp.conf.j2
|
||||||
|
- user: root
|
||||||
|
- mode: 0644
|
||||||
|
- template: jinja
|
||||||
|
- require:
|
||||||
|
- pkg: burp-pkg
|
11
states/burp/server/service.sls
Normal file
11
states/burp/server/service.sls
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
---
|
||||||
|
{% from "burp/map.jinja" import burp with context %}
|
||||||
|
{% if salt['grains.get']('init') == 'systemd' %}
|
||||||
|
burp-task:
|
||||||
|
file.managed:
|
||||||
|
- name: /etc/systemd/system/burp.service
|
||||||
|
- source: salt://burp/burp.service.j2
|
||||||
|
- user: root
|
||||||
|
- mode: 0644
|
||||||
|
- template: jinja
|
||||||
|
{% endif %}
|
17
states/cds/config.sls
Normal file
17
states/cds/config.sls
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
---
|
||||||
|
{%- from "cds/map.jinja" import cds with context %}
|
||||||
|
cds-config-dir:
|
||||||
|
file.directory:
|
||||||
|
- name: /etc/cds
|
||||||
|
- watch_in:
|
||||||
|
- service: cds-service
|
||||||
|
|
||||||
|
cds-config-file:
|
||||||
|
file.managed:
|
||||||
|
- name: /etc/cds/cds.conf
|
||||||
|
- source: salt://cds/cds.conf.j2
|
||||||
|
- user: root
|
||||||
|
- group: root
|
||||||
|
- template: jinja
|
||||||
|
- watch_in:
|
||||||
|
- service: cds-service
|
7
states/cds/defaults.yaml
Normal file
7
states/cds/defaults.yaml
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
cds:
|
||||||
|
engine:
|
||||||
|
enabled: true
|
||||||
|
config:
|
||||||
|
mirror: https://github.com/ovh/cds/releases/download/
|
||||||
|
version: 0.43.1
|
6
states/cds/init.sls
Normal file
6
states/cds/init.sls
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
{%- from "cds/map.jinja" import cds with context %}
|
||||||
|
include:
|
||||||
|
- .install
|
||||||
|
- .config
|
||||||
|
- .service
|
12
states/cds/install.sls
Normal file
12
states/cds/install.sls
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
---
|
||||||
|
{%- from "cds/map.jinja" import cds with context %}
|
||||||
|
cds-engine-install:
|
||||||
|
file.managed:
|
||||||
|
- name: /usr/bin/cds-engine-{{ salt['pillar.get']('cds:engine:version') }}
|
||||||
|
- source: {{ cds.mirror }}/{{ cds.version }}/cds-engine-{{ salt['grains.get']('kernel')|lower }}-{{ salt['grains.get']('osarch') }}
|
||||||
|
- skip_verify: True
|
||||||
|
|
||||||
|
cds-bin-symlink:
|
||||||
|
file.symlink:
|
||||||
|
- name: /usr/bin/cds-engine
|
||||||
|
- target: /usr/bin/cds-engine-{{ salt['pillar.get']('cds:version') }}
|
5
states/cds/map.jinja
Normal file
5
states/cds/map.jinja
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
{%- import_yaml "cds/defaults.yaml" as default_settings -%}
|
||||||
|
|
||||||
|
{%- set defaults = salt['grains.filter_by'](default_settings, default='cds') -%}
|
||||||
|
|
||||||
|
{%- set cds = salt['pillar.get']('cds', default=defaults, merge=True) -%}
|
15
states/cds/service.sls
Normal file
15
states/cds/service.sls
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
---
|
||||||
|
{%- from "cds/map.jinja" import cds with context %}
|
||||||
|
cds-service-file:
|
||||||
|
file.managed:
|
||||||
|
- name: /etc/systemd/system/cds.service
|
||||||
|
- source: salt://cds/cds.service.j2
|
||||||
|
- user: root
|
||||||
|
- group: root
|
||||||
|
- watch_in:
|
||||||
|
- service: cds-service
|
||||||
|
|
||||||
|
cds-service:
|
||||||
|
service.running:
|
||||||
|
- name: cds
|
||||||
|
- enable: True
|
16
states/cds/telegraf.service.j2
Normal file
16
states/cds/telegraf.service.j2
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=The plugin-driven server agent for reporting metrics into InfluxDB
|
||||||
|
Documentation=https://github.com/influxdata/telegraf
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
EnvironmentFile=-/etc/default/telegraf
|
||||||
|
#User=telegraf
|
||||||
|
ExecStart=/usr/bin/telegraf --config $INFLUX_CONFIG
|
||||||
|
ExecReload=/bin/kill -HUP $MAINPID
|
||||||
|
Restart=on-failure
|
||||||
|
RestartForceExitStatus=SIGPIPE
|
||||||
|
KillMode=control-group
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
6
states/config/defaults.yaml
Normal file
6
states/config/defaults.yaml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
config:
|
||||||
|
enabled: true
|
||||||
|
install_dir: "/usr/local/apps/config"
|
||||||
|
filename: "common.ini"
|
||||||
|
config: {}
|
19
states/config/init.sls
Normal file
19
states/config/init.sls
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
---
|
||||||
|
{%- from "config/map.jinja" import config with context %}
|
||||||
|
config-dir:
|
||||||
|
file.directory:
|
||||||
|
- name: {{ config.install_dir }}
|
||||||
|
- user: root
|
||||||
|
- mode: "0755"
|
||||||
|
|
||||||
|
config-file:
|
||||||
|
file.managed:
|
||||||
|
- name: {{ config.install_dir }}/{{ config.filename }}
|
||||||
|
- user: root
|
||||||
|
- mode: "0755"
|
||||||
|
|
||||||
|
config-file-config:
|
||||||
|
ini.options_present:
|
||||||
|
- name: {{ config.install_dir }}/{{ config.filename }}
|
||||||
|
- separator: '='
|
||||||
|
- sections: {{ config.config }}
|
3
states/config/map.jinja
Normal file
3
states/config/map.jinja
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
{%- import_yaml "config/defaults.yaml" as defaults %}
|
||||||
|
|
||||||
|
{%- set config = salt['pillar.get']('config', default=defaults.config, merge=True) -%}
|
9
states/coronafana/defaults.yaml
Normal file
9
states/coronafana/defaults.yaml
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
---
|
||||||
|
coronafana:
|
||||||
|
enabled: true
|
||||||
|
install_dir: /usr/local/apps
|
||||||
|
release_dir: /usr/local/apps/releases
|
||||||
|
mirror: https://git.paulbsd.com/paulbsd/coronafana/releases/download
|
||||||
|
version: 1.0.3
|
||||||
|
os: linux
|
||||||
|
arch: amd64
|
3
states/coronafana/init.sls
Normal file
3
states/coronafana/init.sls
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
---
|
||||||
|
include:
|
||||||
|
- .install
|
16
states/coronafana/install.sls
Normal file
16
states/coronafana/install.sls
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
---
|
||||||
|
{% from "coronafana/map.jinja" import coronafana with context %}
|
||||||
|
coronafana-archive-extract:
|
||||||
|
archive.extracted:
|
||||||
|
- name: {{ coronafana.release_dir }}/coronafana-{{ coronafana.version }}
|
||||||
|
- source: {{ coronafana.mirror }}/{{ coronafana.version }}/coronafana-{{ coronafana.version }}-{{ coronafana.os }}-{{ coronafana.arch }}.tar.gz
|
||||||
|
- skip_verify: True
|
||||||
|
- enforce_toplevel: False
|
||||||
|
- if_missing: {{ coronafana.release_dir }}/coronafana-{{ coronafana.version }}
|
||||||
|
|
||||||
|
coronafana-binary-symlink:
|
||||||
|
file.symlink:
|
||||||
|
- name: {{ coronafana.install_dir }}/coronafana
|
||||||
|
- target: {{ coronafana.release_dir }}/coronafana-{{ coronafana.version }}
|
||||||
|
- require:
|
||||||
|
- archive: coronafana-archive-extract
|
3
states/coronafana/kernelmap.yaml
Normal file
3
states/coronafana/kernelmap.yaml
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
---
|
||||||
|
Linux:
|
||||||
|
os: "linux"
|
14
states/coronafana/map.jinja
Normal file
14
states/coronafana/map.jinja
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
{%- import_yaml "coronafana/defaults.yaml" as default_settings -%}
|
||||||
|
|
||||||
|
{%- import_yaml "coronafana/kernelmap.yaml" as kernelmap -%}
|
||||||
|
{%- import_yaml "coronafana/osarchmap.yaml" as osarchmap -%}
|
||||||
|
|
||||||
|
{%- set defaults = salt['grains.filter_by'](default_settings,
|
||||||
|
default='coronafana',
|
||||||
|
merge=salt['grains.filter_by'](osarchmap, grain='osarch',
|
||||||
|
merge=salt['grains.filter_by'](kernelmap, grain='kernel')
|
||||||
|
)
|
||||||
|
)
|
||||||
|
-%}
|
||||||
|
|
||||||
|
{%- set coronafana = salt['pillar.get']('coronafana', default=defaults, merge=True) -%}
|
21
states/coronafana/osarchmap.yaml
Normal file
21
states/coronafana/osarchmap.yaml
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
---
|
||||||
|
amd64:
|
||||||
|
arch: "amd64"
|
||||||
|
|
||||||
|
x86_64:
|
||||||
|
arch: "amd64"
|
||||||
|
|
||||||
|
386:
|
||||||
|
arch: "386"
|
||||||
|
|
||||||
|
arm64:
|
||||||
|
arch: "arm64"
|
||||||
|
|
||||||
|
armv6l:
|
||||||
|
arch: "arm"
|
||||||
|
|
||||||
|
armv7l:
|
||||||
|
arch: "arm"
|
||||||
|
|
||||||
|
armhf:
|
||||||
|
arch: "arm"
|
10
states/cron/defaults.yaml
Normal file
10
states/cron/defaults.yaml
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
---
|
||||||
|
cron:
|
||||||
|
env:
|
||||||
|
SHELL:
|
||||||
|
name: SHELL
|
||||||
|
command: /bin/bash
|
||||||
|
MAILTO:
|
||||||
|
name: MAILTO
|
||||||
|
command: {{ salt['pillar.get']('syscontact') }}
|
||||||
|
tasks:
|
8
states/cron/init.sls
Normal file
8
states/cron/init.sls
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
{%- from "cron/map.jinja" import cron with context %}
|
||||||
|
{%- for key, value in cron.env.items() %}
|
||||||
|
cron-env-{{ key.lower }}:
|
||||||
|
cron.env_present:
|
||||||
|
- name: {{ value.name }}
|
||||||
|
- value: {{ value.command }}
|
||||||
|
{%- endfor %}
|
8
states/cron/map.jinja
Normal file
8
states/cron/map.jinja
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
{%- import_yaml "cron/defaults.yaml" as defaults %}
|
||||||
|
|
||||||
|
{%- set cron = salt['pillar.get'](
|
||||||
|
'cron',
|
||||||
|
default=defaults.cron,
|
||||||
|
merge=True
|
||||||
|
)
|
||||||
|
-%}
|
6
states/custom.sls
Normal file
6
states/custom.sls
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
human_friendly_state_id:
|
||||||
|
custom.enforce_custom_thing:
|
||||||
|
- name: Nom
|
||||||
|
- foo: Valeur
|
||||||
|
- bar: False
|
15
states/dkron/config.sls
Normal file
15
states/dkron/config.sls
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
---
|
||||||
|
{%- from "dkron/map.jinja" import dkron with context -%}
|
||||||
|
dkron-config-dir:
|
||||||
|
file.directory:
|
||||||
|
- name: /etc/dkron
|
||||||
|
- user: {{ dkron.runuser }}
|
||||||
|
|
||||||
|
dkron-config:
|
||||||
|
file.managed:
|
||||||
|
- name: /etc/dkron/dkron.yml
|
||||||
|
- source: salt://dkron/dkron.yml.j2
|
||||||
|
- user: {{ dkron.runuser }}
|
||||||
|
- template: jinja
|
||||||
|
- watch_in:
|
||||||
|
- service: dkron-service
|
20
states/dkron/defaults.yaml
Normal file
20
states/dkron/defaults.yaml
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
---
|
||||||
|
dkron:
|
||||||
|
enabled: true
|
||||||
|
install_dir: "/usr/local/apps"
|
||||||
|
release_dir: "/usr/local/apps/releases"
|
||||||
|
mirror: "https://github.com/distribworks/dkron/releases/download"
|
||||||
|
version: "2.1.1"
|
||||||
|
os: "linux"
|
||||||
|
arch: "amd64"
|
||||||
|
runuser: "dkron"
|
||||||
|
user: "user"
|
||||||
|
password: "password"
|
||||||
|
url: "http://localhost:8898"
|
||||||
|
verify: false
|
||||||
|
config:
|
||||||
|
bootstrap-expect: 1
|
||||||
|
server: true
|
||||||
|
http-addr: "127.0.0.1:8898"
|
||||||
|
data-dir: "/var/lib/dkron"
|
||||||
|
jobs: []
|
15
states/dkron/dkron.service.j2
Normal file
15
states/dkron/dkron.service.j2
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
{%- from "dkron/map.jinja" import dkron with context -%}
|
||||||
|
[Unit]
|
||||||
|
Description=dkron - Open Source task scheduler
|
||||||
|
Documentation=https://dkron.io/
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
User=%i
|
||||||
|
ExecStart={{ dkron.install_dir }}/dkron/dkron agent
|
||||||
|
Restart=on-failure
|
||||||
|
SuccessExitStatus=3 4
|
||||||
|
RestartForceExitStatus=3 4
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
4
states/dkron/dkron.yml.j2
Normal file
4
states/dkron/dkron.yml.j2
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
## {{ salt['pillar.get']('salt_managed', default='Salt Managed') }}
|
||||||
|
---
|
||||||
|
{%- from "dkron/map.jinja" import dkron with context %}
|
||||||
|
{{ dkron.config|yaml(False) }}
|
6
states/dkron/init.sls
Normal file
6
states/dkron/init.sls
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
include:
|
||||||
|
- .install
|
||||||
|
- .config
|
||||||
|
- .service
|
||||||
|
- .jobs
|
30
states/dkron/install.sls
Normal file
30
states/dkron/install.sls
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
---
|
||||||
|
{%- from "dkron/map.jinja" import dkron with context %}
|
||||||
|
dkron-user:
|
||||||
|
user.present:
|
||||||
|
- name: {{ dkron.runuser }}
|
||||||
|
|
||||||
|
dkron-archive-extract:
|
||||||
|
archive.extracted:
|
||||||
|
- name: {{ dkron.release_dir }}/dkron_{{ dkron.version }}
|
||||||
|
- source: {{ dkron.mirror }}/v{{ dkron.version }}/dkron_{{ dkron.version }}_{{ dkron.os }}_{{ dkron.arch }}.tar.gz
|
||||||
|
- user: {{ dkron.runuser }}
|
||||||
|
- enforce_toplevel: False
|
||||||
|
- skip_verify: True
|
||||||
|
- archive_format: tar
|
||||||
|
- if_missing: {{ dkron.release_dir }}/dkron_{{ dkron.version }}
|
||||||
|
|
||||||
|
dkron-bin-symlink:
|
||||||
|
file.symlink:
|
||||||
|
- name: {{ dkron.install_dir }}/dkron
|
||||||
|
- target: {{ dkron.release_dir }}/dkron_{{ dkron.version }}
|
||||||
|
- user: {{ dkron.runuser }}
|
||||||
|
- watch_in:
|
||||||
|
- service: dkron-service
|
||||||
|
|
||||||
|
dkron-data-dir:
|
||||||
|
file.directory:
|
||||||
|
- name: {{ dkron.config.get('data-dir') }}
|
||||||
|
- user: {{ dkron.runuser }}
|
||||||
|
- watch_in:
|
||||||
|
- service: dkron-service
|
8
states/dkron/jobs.sls
Normal file
8
states/dkron/jobs.sls
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
{%- from "dkron/map.jinja" import dkron with context %}
|
||||||
|
dkron-jobs:
|
||||||
|
dkron.jobs:
|
||||||
|
- name: dkron-jobs
|
||||||
|
- url: {{ dkron.url }}
|
||||||
|
- verify: {{ dkron.verify }}
|
||||||
|
- jobs: {{ dkron.jobs }}
|
3
states/dkron/kernelmap.yaml
Normal file
3
states/dkron/kernelmap.yaml
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
---
|
||||||
|
Linux:
|
||||||
|
os: "linux"
|
14
states/dkron/map.jinja
Normal file
14
states/dkron/map.jinja
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
{%- import_yaml "dkron/defaults.yaml" as default_settings -%}
|
||||||
|
|
||||||
|
{%- import_yaml "dkron/kernelmap.yaml" as kernelmap %}
|
||||||
|
{%- import_yaml "dkron/osarchmap.yaml" as osarchmap %}
|
||||||
|
|
||||||
|
{%- set defaults = salt['grains.filter_by'](default_settings,
|
||||||
|
default='dkron',
|
||||||
|
merge=salt['grains.filter_by'](osarchmap, grain='osarch',
|
||||||
|
merge=salt['grains.filter_by'](kernelmap, grain='kernel')
|
||||||
|
)
|
||||||
|
)
|
||||||
|
-%}
|
||||||
|
|
||||||
|
{%- set dkron = salt['pillar.get']('dkron', default=defaults, merge=True) -%}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user