Merge pull request #10 from cdalvaro/add_logrotate_support

Add logrotate support
This commit is contained in:
Carlos D. Álvaro Yunta
2018-12-20 17:22:16 +01:00
committed by GitHub
10 changed files with 140 additions and 30 deletions

View File

@@ -6,12 +6,15 @@ Please refer to the SaltStack [Release Notes](https://docs.saltstack.com/en/deve
**2018.3.3** **2018.3.3**
- Upgrade SaltStack Master to `2018.3.3` - Upgrade SaltStack Master to `2018.3.3`
- Change Docker base image to `ubuntu:xenial-20181005` - Change Docker base image to `ubuntu:xenial-20181113`
- Add `GitPython` support - Add `GitPython` support
- Add `PyGit2` support - Add `PyGit2` support
- Expose `/home/salt/data/logs` - Expose `/home/salt/data/logs`
- Run `salt-master` as `salt` user - Run `salt-master` as `salt` user
- Add support for setting timezone - Add support for setting timezone
- Add logrotate support
- Add supervisor support
- Addressed a bug that caused the container to crash when `/home/salt/data/keys/minions` was not present
**2018.3.2** **2018.3.2**

View File

@@ -1,4 +1,4 @@
FROM ubuntu:xenial-20181005 FROM ubuntu:xenial-20181113
LABEL maintainer="carlos.alvaro@citelan.es" LABEL maintainer="carlos.alvaro@citelan.es"
LABEL description="SaltStack master" LABEL description="SaltStack master"
@@ -11,11 +11,15 @@ ENV SALT_VERSION="2018.3.3" \
LIBGIT2_VERSION="0.27.7" \ LIBGIT2_VERSION="0.27.7" \
PYGIT2_VERSION="0.27.2" \ PYGIT2_VERSION="0.27.2" \
GITPYTHON_VERSION="2.1.11" \ GITPYTHON_VERSION="2.1.11" \
M2CRYPTO_VERSION="0.30.1" \ M2CRYPTO_VERSION="0.31.0" \
MAKO_VERSION="1.0.7" \ MAKO_VERSION="1.0.7" \
PYCRYPTODOME_VERSION="3.7.0" \ PYCRYPTODOME_VERSION="3.7.2" \
LIBNACL_VERSION="1.6.1" \ LIBNACL_VERSION="1.6.1" \
RAET_VERSION="0.6.8" RAET_VERSION="0.6.8" \
CHERRYPY_VERSION="18.0.1" \
TIMELIB_VERSION="0.2.4" \
DOCKERPY_VERSION="1.10.6" \
MSGPACKPURE_VERSION="0.1.3"
ENV SALT_DOCKER_DIR="/etc/docker-salt" \ ENV SALT_DOCKER_DIR="/etc/docker-salt" \
SALT_ROOT_DIR="/etc/salt" \ SALT_ROOT_DIR="/etc/salt" \
@@ -43,7 +47,8 @@ RUN apt-get update
RUN apt-get install --yes --quiet --no-install-recommends \ RUN apt-get install --yes --quiet --no-install-recommends \
sudo ca-certificates wget locales pkg-config openssh-client \ sudo ca-certificates wget locales pkg-config openssh-client \
python${PYTHON_VERSION} python${PYTHON_VERSION}-dev \ python${PYTHON_VERSION} python${PYTHON_VERSION}-dev \
python3-pip python3-setuptools python3-wheel gettext-base python3-pip python3-setuptools python3-wheel gettext-base \
supervisor logrotate
# Configure locales # Configure locales
RUN update-locale LANG=C.UTF-8 LC_MESSAGES=POSIX \ RUN update-locale LANG=C.UTF-8 LC_MESSAGES=POSIX \

View File

@@ -22,7 +22,9 @@ quickstart:
--publish=4505:4505/tcp --publish=4506:4506/tcp \ --publish=4505:4505/tcp --publish=4506:4506/tcp \
--env "USERMAP_UID=$(shell id -u)" --env "USERMAP_GID=$(shell id -g)" \ --env "USERMAP_UID=$(shell id -u)" --env "USERMAP_GID=$(shell id -g)" \
--env SALT_LOG_LEVEL=info \ --env SALT_LOG_LEVEL=info \
--read-only --volume $(shell pwd)/srv/:/home/salt/data/srv/ \ --volume $(shell pwd)/recipes/:/home/salt/data/srv/ \
--volume $(shell pwd)/keys/:/home/salt/data/keys/ \
--volume $(shell pwd)/logs/:/home/salt/data/logs/ \
cdalvaro/saltstack-master:latest cdalvaro/saltstack-master:latest
@echo "Type 'make logs' for the logs" @echo "Type 'make logs' for the logs"

View File

@@ -19,6 +19,7 @@ For other methods to install SaltStack please refer to the [Official SaltStack I
- [Git Fileserver](#git-fileserver) - [Git Fileserver](#git-fileserver)
- [GitPython](#gitpython) - [GitPython](#gitpython)
- [PyGit2](#pygit2) - [PyGit2](#pygit2)
- [Logs](#logs)
- [Available Configuration Parameters](#available-configuration-parameters) - [Available Configuration Parameters](#available-configuration-parameters)
- [Usage](#usage) - [Usage](#usage)
- [Shell Access](#shell-access) - [Shell Access](#shell-access)
@@ -64,7 +65,8 @@ Alternatively, you can manually launch the `saltstack-master` container:
docker run --name salt_master --detach \ docker run --name salt_master --detach \
--publish 4505:4505/tcp --publish 4506:4506/tcp \ --publish 4505:4505/tcp --publish 4506:4506/tcp \
--env 'SALT_LOG_LEVEL=info' \ --env 'SALT_LOG_LEVEL=info' \
--read-only --volume $(pwd)/srv/:/home/salt/data/srv/ \ --volume $(pwd)/recipes/:/home/salt/data/srv/ \
--volume $(pwd)/keys/:/home/salt/data/keys/ \
cdalvaro/saltstack-master:2018.3.3 cdalvaro/saltstack-master:2018.3.3
``` ```
@@ -72,13 +74,13 @@ docker run --name salt_master --detach \
### Custom Recipes ### Custom Recipes
This image does not require storing data out of the container. In order to provide salt with your custom recipes you must mount the volume `/home/salt/data/srv/` with your recipes directory.
But it is necessary to mount the `/srv/` volume ir order to provide your custom recipes.
### Minion Keys ### Minion Keys
Minion keys can be added automatically on startup to SaltStack master by mounting the volume `/home/salt/data/keys` and copying the minion keys inside `keys/minions/` directory: Minion keys can be added automatically on startup to SaltStack master by mounting the volume `/home/salt/data/keys` and copying the minion keys inside `keys/minions/` directory.
It is also important to know that, in order to keep your keys after removing the container, the keys directory must be mounted.
```sh ```sh
mkdir -p keys/minions mkdir -p keys/minions
@@ -87,7 +89,7 @@ rsync root@minion1:/etc/salt/pki/minion/minion.pub keys/minions/minion1
docker run --name salt_master -d \ docker run --name salt_master -d \
--publish 4505:4505/tcp --publish 4506:4506/tcp \ --publish 4505:4505/tcp --publish 4506:4506/tcp \
--env 'SALT_LOG_LEVEL=info' \ --env 'SALT_LOG_LEVEL=info' \
--volume $(pwd)/srv/:/home/salt/data/srv/ \ --volume $(pwd)/recipes/:/home/salt/data/srv/ \
--volume $(pwd)/keys/:/home/salt/data/keys/ \ --volume $(pwd)/keys/:/home/salt/data/keys/ \
cdalvaro/saltstack-master:2018.3.3 cdalvaro/saltstack-master:2018.3.3
``` ```
@@ -101,7 +103,7 @@ docker run --name salt_stack --detach \
--publish 4505:4505/tcp --publish 4506:4506/tcp \ --publish 4505:4505/tcp --publish 4506:4506/tcp \
--env 'SALT_LOG_LEVEL=info' \ --env 'SALT_LOG_LEVEL=info' \
--env 'SALT_MASTER_SIGN_PUBKEY=True' --env 'SALT_MASTER_SIGN_PUBKEY=True'
--volume $(pwd)/srv/:/home/salt/data/srv/ \ --volume $(pwd)/recipes/:/home/salt/data/srv/ \
--volume $(pwd)/keys/:/home/salt/data/keys/ \ --volume $(pwd)/keys/:/home/salt/data/keys/ \
cdalvaro/saltstack-master:2018.3.3 cdalvaro/saltstack-master:2018.3.3
``` ```
@@ -127,7 +129,8 @@ Also the container processes seem to be executed as the host's user/group `1000`
```sh ```sh
docker run --name salt_stack -it --rm \ docker run --name salt_stack -it --rm \
--env "USERMAP_UID=$(id -u)" --env "USERMAP_GID=$(id -g)" \ --env "USERMAP_UID=$(id -u)" --env "USERMAP_GID=$(id -g)" \
--volume $(pwd)/srv/:/home/salt/data/srv/ \ --volume $(pwd)/recipes/:/home/salt/data/srv/ \
--volume $(pwd)/keys/:/home/salt/data/keys/ \
cdalvaro/saltstack-master:2018.3.3 cdalvaro/saltstack-master:2018.3.3
``` ```
@@ -171,6 +174,22 @@ _pygit2.GitError: Failed to authenticate SSH session: Unable to send userauth-pu
look if your private key hash empty lines at the bottom of the file and suppress them for solving the error. look if your private key hash empty lines at the bottom of the file and suppress them for solving the error.
### Logs
Salt logs are accessible by mounting the volume `/home/salt/data/logs/`.
Inside that directory you could find `supervisor/` logs and `salt/` logs:
docker run --name salt_master --detach \
--publish 4505:4505/tcp --publish 4506:4506/tcp \
--env 'SALT_LOG_LEVEL=info' \
--volume $(pwd)/recipes/:/home/salt/data/srv/ \
--volume $(pwd)/keys/:/home/salt/data/keys/ \
--volume $(pwd)/logs/:/home/salt/data/logs/ \
cdalvaro/saltstack-master:2018.3.3
Check [Available Configuration Parameters](#available-configuration-parameters) section for configuring logrotate.
### Available Configuration Parameters ### Available Configuration Parameters
Please refer the docker run command options for the `--env-file` flag where you can specify all required environment variables in a single file. This will save you from writing a potentially long docker run command. Alternatively you can use docker-compose. Please refer the docker run command options for the `--env-file` flag where you can specify all required environment variables in a single file. This will save you from writing a potentially long docker run command. Alternatively you can use docker-compose.
@@ -182,6 +201,8 @@ Below is the list of available options that can be used to customize your SaltSt
| `DEBUG` | Set this to `true` to enable entrypoint debugging. | | `DEBUG` | Set this to `true` to enable entrypoint debugging. |
| `TIMEZONE` | Set the container timezone. Defaults to `UTC`. Values are expected to be in Canonical format. Example: `Europe/Madrid`. See the list of [acceptable values](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones). | | `TIMEZONE` | Set the container timezone. Defaults to `UTC`. Values are expected to be in Canonical format. Example: `Europe/Madrid`. See the list of [acceptable values](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones). |
| `SALT_LOG_LEVEL` | The level of messages to send to the console. One of 'garbage', 'trace', 'debug', info', 'warning', 'error', 'critical'. Default: `warning` | | `SALT_LOG_LEVEL` | The level of messages to send to the console. One of 'garbage', 'trace', 'debug', info', 'warning', 'error', 'critical'. Default: `warning` |
| `SALT_LOG_ROTATE_FREQUENCY` | Logrotate frequency for salt logs. Available options are 'daily', 'weekly', 'monthly', and 'yearly'. Default: `weekly` |
| `SALT_LOG_ROTATE_RETENTION` | Keep x files before deleting old log files. Defaults: `52` |
| `SALT_LEVEL_LOGFILE` | The level of messages to send to the log file. One of 'garbage', 'trace', 'debug', info', 'warning', 'error', 'critical'. Default: `warning` | | `SALT_LEVEL_LOGFILE` | The level of messages to send to the log file. One of 'garbage', 'trace', 'debug', info', 'warning', 'error', 'critical'. Default: `warning` |
| `SALT_MASTER_SIGN_PUBKEY` | Sign the master auth-replies with a cryptographic signature of the master's public key. Possible values: 'True' or 'False'. Default: `False` | | `SALT_MASTER_SIGN_PUBKEY` | Sign the master auth-replies with a cryptographic signature of the master's public key. Possible values: 'True' or 'False'. Default: `False` |
| `SALT_MASTER_USE_PUBKEY_SIGNATURE` | Instead of computing the signature for each auth-reply, use a pre-calculated signature. This option requires `SALT_MASTER_SIGN_PUBKEY` set to 'True'. Possible values: 'True' or 'False'. Default: `True` | | `SALT_MASTER_USE_PUBKEY_SIGNATURE` | Instead of computing the signature for each auth-reply, use a pre-calculated signature. This option requires `SALT_MASTER_SIGN_PUBKEY` set to 'True'. Possible values: 'True' or 'False'. Default: `True` |
@@ -207,7 +228,8 @@ EOF
docker run --name salt_master -d \ docker run --name salt_master -d \
--publish 3505:3505/tcp --publish 3506:3506/tcp \ --publish 3505:3505/tcp --publish 3506:3506/tcp \
--env 'SALT_LOG_LEVEL=info' \ --env 'SALT_LOG_LEVEL=info' \
--read-only --volume $(pwd)/srv/:/home/salt/data/srv/ \ --volume $(pwd)/recipes/:/home/salt/data/srv/ \
--volume $(pwd)/keys/:/home/salt/data/keys/ \
--volume $(pwd)/config/:/home/salt/data/config/ \ --volume $(pwd)/config/:/home/salt/data/config/ \
cdalvaro/saltstack-master:2018.3.3 cdalvaro/saltstack-master:2018.3.3
``` ```

View File

@@ -45,7 +45,11 @@ pip3 install "pygit2==v${PYGIT2_VERSION}" \
"Mako==v${MAKO_VERSION}" \ "Mako==v${MAKO_VERSION}" \
"pycryptodome==v${PYCRYPTODOME_VERSION}" \ "pycryptodome==v${PYCRYPTODOME_VERSION}" \
"libnacl==v${LIBNACL_VERSION}" \ "libnacl==v${LIBNACL_VERSION}" \
"raet==v${RAET_VERSION}" "raet==v${RAET_VERSION}" \
"CherryPy==v${CHERRYPY_VERSION}" \
"timelib==v${TIMELIB_VERSION}" \
"docker-py==v${DOCKERPY_VERSION}" \
"msgpack-pure==v${MSGPACKPURE_VERSION}"
# Bootstrap script options: # Bootstrap script options:
# https://docs.saltstack.com/en/latest/topics/tutorials/salt_bootstrap.html#command-line-options # https://docs.saltstack.com/en/latest/topics/tutorials/salt_bootstrap.html#command-line-options
@@ -67,3 +71,30 @@ sed -i -e "s|^[# ]*StrictHostKeyChecking.*$| StrictHostKeyChecking no|" /etc/
echo " UserKnownHostsFile /dev/null" >> /etc/ssh/ssh_config echo " UserKnownHostsFile /dev/null" >> /etc/ssh/ssh_config
echo " LogLevel ERROR" >> /etc/ssh/ssh_config echo " LogLevel ERROR" >> /etc/ssh/ssh_config
echo "# IdentityFile salt_ssh_key" >> /etc/ssh/ssh_config echo "# IdentityFile salt_ssh_key" >> /etc/ssh/ssh_config
# Configure logrotate
echo "Configuring logrotate ..."
# move supervisord.log file to ${SALT_LOGS_DIR}/supervisor/
sed -i "s|^[#]*logfile=.*|logfile=${SALT_LOGS_DIR}/supervisor/supervisord.log ;|" /etc/supervisor/supervisord.conf
# fix "unknown group 'syslog'" error preventing logrotate from functioning
sed -i "s|^su root syslog$|su root root|" /etc/logrotate.conf
# Configure supervisor
echo "Configuring supervisor ..."
# configure supervisord to start unicorn
cat > /etc/supervisor/conf.d/salt-master.conf <<EOF
[program:salt-master]
priority=5
directory=${SALT_HOME}
environment=HOME=${SALT_HOME}
command=salt-master
user=${SALT_USER}
autostart=true
autorestart=true
stopsignal=QUIT
stdout_logfile=${SALT_LOGS_DIR}/supervisor/%(program_name)s.log
stderr_logfile=${SALT_LOGS_DIR}/supervisor/%(program_name)s.log
EOF

View File

@@ -47,7 +47,7 @@ master_use_pubkey_signature: {{SALT_MASTER_USE_PUBKEY_SIGNATURE}}
##### Salt-SSH Configuration ##### ##### Salt-SSH Configuration #####
########################################## ##########################################
# The log file of the salt-ssh command: # The log file of the salt-ssh command:
ssh_log_file: {{SALT_LOGS_DIR}}/ssh ssh_log_file: {{SALT_LOGS_DIR}}/salt/ssh
##### File Server settings ##### ##### File Server settings #####
@@ -94,14 +94,14 @@ pillar_roots:
# to receive commands from. # to receive commands from.
# The log file of the salt-syndic daemon: # The log file of the salt-syndic daemon:
syndic_log_file: {{SALT_LOGS_DIR}}/syndic syndic_log_file: {{SALT_LOGS_DIR}}/salt/syndic
##### Logging settings ##### ##### Logging settings #####
########################################## ##########################################
# The location of the master log file # The location of the master log file
log_file: {{SALT_LOGS_DIR}}/master log_file: {{SALT_LOGS_DIR}}/salt/master
key_logfile: {{SALT_LOGS_DIR}}/key key_logfile: {{SALT_LOGS_DIR}}/salt/key
# The level of messages to send to the console. # The level of messages to send to the console.
# One of 'garbage', 'trace', 'debug', info', 'warning', 'error', 'critical'. # One of 'garbage', 'trace', 'debug', info', 'warning', 'error', 'critical'.

View File

@@ -3,6 +3,9 @@
DEBUG=${DEBUG:-false} DEBUG=${DEBUG:-false}
TIMEZONE=${TIMEZONE:-UTC} TIMEZONE=${TIMEZONE:-UTC}
SALT_LOG_ROTATE_FREQUENCY=${SALT_LOG_ROTATE_FREQUENCY:-weekly}
SALT_LOG_ROTATE_RETENTION=${SALT_LOG_ROTATE_RETENTION:-52}
# https://docs.saltstack.com/en/latest/ref/configuration/master.html # https://docs.saltstack.com/en/latest/ref/configuration/master.html
##### Logging settings ##### ##### Logging settings #####

View File

@@ -171,22 +171,62 @@ function initialize_datadir()
[[ -d /srv ]] && [[ ! -L /srv ]] && rm -rf /srv [[ -d /srv ]] && [[ ! -L /srv ]] && rm -rf /srv
ln -sfnv ${SALT_BASE_DIR} /srv ln -sfnv ${SALT_BASE_DIR} /srv
# Set Slat root permissions # Set Salt root permissions
chown -R ${SALT_USER} ${SALT_ROOT_DIR} chown -R ${SALT_USER}: ${SALT_ROOT_DIR}
# Set Salt run permissions # Set Salt run permissions
mkdir -p /var/run/salt mkdir -p /var/run/salt
chown -R ${SALT_USER} /var/run/salt chown -R ${SALT_USER}: /var/run/salt
# Set cache permissions # Set cache permissions
mkdir -p /var/cache/salt/master mkdir -p /var/cache/salt/master
chown -R salt /var/cache/salt chown -R ${SALT_USER}: /var/cache/salt
# Keys directories
mkdir -p ${SALT_KEYS_DIR}/minions
chown -R ${SALT_USER}: ${SALT_KEYS_DIR}
# Logs directory # Logs directory
mkdir -p ${SALT_LOGS_DIR}/salt ${SALT_LOGS_DIR}/supervisor
chmod -R 0755 ${SALT_LOGS_DIR}/supervisor
chown -R root: ${SALT_LOGS_DIR}/supervisor
[[ -d /var/log/salt ]] && [[ ! -L /var/log/salt ]] && rm -rf /var/log/salt [[ -d /var/log/salt ]] && [[ ! -L /var/log/salt ]] && rm -rf /var/log/salt
mkdir -p /var/log mkdir -p ${SALT_LOGS_DIR}/salt /var/log
ln -sfnv ${SALT_LOGS_DIR} /var/log/salt ln -sfnv ${SALT_LOGS_DIR}/salt /var/log/salt
chown -R ${SALT_USER} ${SALT_LOGS_DIR} chown -R ${SALT_USER}: ${SALT_LOGS_DIR}/salt
}
# Configures logrotate
function configure_logrotate()
{
echo "Configuring logrotate ..."
# configure supervisord log rotation
cat > /etc/logrotate.d/supervisord <<EOF
${SALT_LOGS_DIR}/supervisor/*.log {
${SALT_LOG_ROTATE_FREQUENCY}
missingok
rotate ${SALT_LOG_ROTATE_RETENTION}
compress
delaycompress
notifempty
copytruncate
}
EOF
# configure salt-master log rotation
cat > /etc/logrotate.d/salt <<EOF
${SALT_LOGS_DIR}/salt/* {
${SALT_LOG_ROTATE_FREQUENCY}
missingok
rotate ${SALT_LOG_ROTATE_RETENTION}
compress
delaycompress
notifempty
copytruncate
}
EOF
} }
# Initializes the system # Initializes the system
@@ -194,8 +234,10 @@ function initialize_system()
{ {
map_uidgid map_uidgid
initialize_datadir initialize_datadir
configure_logrotate
configure_timezone configure_timezone
configure_salt_master configure_salt_master
setup_salt_keys setup_salt_keys
setup_ssh_keys setup_ssh_keys
rm -rf /var/run/supervisor.sock
} }

View File

@@ -6,7 +6,9 @@ services:
image: cdalvaro/saltstack-master:2018.3.3 image: cdalvaro/saltstack-master:2018.3.3
restart: always restart: always
volumes: volumes:
- "./srv/:/home/salt/data/srv" - "recipes/:/home/salt/data/srv"
- "keys/:/home/salt/data/keys"
- "logs/:/home/salt/data/logs"
ports: ports:
- "4505:4505/tcp" - "4505:4505/tcp"
- "4506:4506/tcp" - "4506:4506/tcp"

View File

@@ -13,7 +13,7 @@ case ${1} in
case ${1} in case ${1} in
app:start) app:start)
echo "Starting salt-master..." echo "Starting salt-master..."
exec sudo -HEu ${SALT_USER} salt-master exec /usr/bin/supervisord -nc /etc/supervisor/supervisord.conf
;; ;;
app:gen-signed-keys) app:gen-signed-keys)
shift 1 shift 1