diff --git a/.github/workflows/commitlint.yml b/.github/workflows/commitlint.yml
new file mode 100644
index 0000000..42a5375
--- /dev/null
+++ b/.github/workflows/commitlint.yml
@@ -0,0 +1,16 @@
+# -*- coding: utf-8 -*-
+# vim: ft=yaml
+---
+name: Commitlint
+'on': [pull_request]
+
+jobs:
+ lint:
+ runs-on: ubuntu-latest
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ steps:
+ - uses: actions/checkout@v2
+ with:
+ fetch-depth: 0
+ - uses: wagoid/commitlint-github-action@v1
diff --git a/.gitignore b/.gitignore
index 7715275..6995110 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,122 @@
-*.pyc
-*~
-Gemfile.lock
-.kitchen/
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+env/
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+
+# PyInstaller
+# Usually these files are written by a python script from a packager
+# before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+.hypothesis/
+.kitchen
+.kitchen.local.yml
+kitchen.local.yml
+junit-*.xml
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# pyenv
+.python-version
+
+# celery beat schedule file
+celerybeat-schedule
+
+# SageMath parsed files
+*.sage.py
+
+# dotenv
+.env
+
+# virtualenv
+.venv
+venv/
+ENV/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+
+# Bundler
+.bundle/
+
+# copied `.md` files used for conversion to `.rst` using `m2r`
+docs/*.md
+
+# Vim
+*.sw?
+
+## Collected when centralising formulas (check and sort)
+# `collectd-formula`
+.pytest_cache/
+/.idea/
+Dockerfile.*_*
+ignore/
+tmp/
diff --git a/.kitchen.docker.yml b/.kitchen.docker.yml
deleted file mode 100644
index f6c458a..0000000
--- a/.kitchen.docker.yml
+++ /dev/null
@@ -1,6 +0,0 @@
----
-driver:
- name: docker
- hostname: salt-formula.ci.local
- use_sudo: true
- require_chef_omnibus: false
diff --git a/.kitchen.yml b/.kitchen.yml
deleted file mode 100644
index 89ecf32..0000000
--- a/.kitchen.yml
+++ /dev/null
@@ -1,32 +0,0 @@
-<%
-require 'yaml'
-
-formula = YAML.load_file('FORMULA')
-formula_name = formula['name']
-%>
----
-verifier:
- name: inspec
-
-platforms:
- - name: ubuntu-12.04
- - name: ubuntu-14.04
- - name: ubuntu-16.04
- - name: debian-7
- - name: debian-8
-
-provisioner:
- name: salt_solo
- salt_install: bootstrap
- salt_bootstrap_url: https://bootstrap.saltstack.com
- salt_version: latest
- salt_pillar_root: pillar.example
- log_level: <%= ENV['SALT_DEBUG_LEVEL'] || 'info' %>
- formula: <%= formula_name %>
- state_top:
- base:
- '*':
- - <%= formula_name %>
-
-suites:
- - name: default
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
new file mode 100644
index 0000000..0efdb51
--- /dev/null
+++ b/.pre-commit-config.yaml
@@ -0,0 +1,56 @@
+# -*- coding: utf-8 -*-
+# vim: ft=yaml
+---
+# See https://pre-commit.com for more information
+# See https://pre-commit.com/hooks.html for more hooks
+default_stages: [commit]
+repos:
+ - repo: https://github.com/dafyddj/commitlint-pre-commit-hook
+ rev: v2.3.0
+ hooks:
+ - id: commitlint
+ name: Check commit message using commitlint
+ description: Lint commit message against @commitlint/config-conventional rules
+ stages: [commit-msg]
+ additional_dependencies: ['@commitlint/config-conventional@8.3.4']
+ - id: commitlint-travis
+ stages: [manual]
+ additional_dependencies: ['@commitlint/config-conventional@8.3.4']
+ always_run: true
+ - repo: https://github.com/adithyabsk/mirrors-rubocop
+ rev: v0.91.0
+ hooks:
+ - id: rubocop
+ name: Check Ruby files with rubocop
+ args: [--debug]
+ always_run: true
+ pass_filenames: false
+ - repo: https://github.com/jumanjihouse/pre-commit-hooks
+ rev: 2.1.3
+ hooks:
+ - id: shellcheck
+ name: Check shell scripts with shellcheck
+ files: ^.*\.(sh|bash|ksh)$
+ types: []
+ args: []
+ - repo: https://github.com/adrienverge/yamllint.git
+ rev: v1.23.0
+ hooks:
+ - id: yamllint
+ name: Check YAML syntax with yamllint
+ args: [--strict, '.']
+ always_run: true
+ pass_filenames: false
+ - repo: https://github.com/warpnet/salt-lint
+ rev: v0.3.0
+ hooks:
+ - id: salt-lint
+ name: Check Salt files using salt-lint
+ files: ^.*\.(sls|jinja|j2|tmpl|tst)$
+ - repo: https://github.com/myint/rstcheck
+ rev: 3f929574
+ hooks:
+ - id: rstcheck
+ name: Check reST files using rstcheck
+ exclude: 'docs/CHANGELOG.rst'
+ args: [--report=warning]
diff --git a/.rstcheck.cfg b/.rstcheck.cfg
new file mode 100644
index 0000000..05856dc
--- /dev/null
+++ b/.rstcheck.cfg
@@ -0,0 +1,3 @@
+[rstcheck]
+report=error
+ignore_language=rst
diff --git a/.rubocop.yml b/.rubocop.yml
new file mode 100644
index 0000000..7fd75ac
--- /dev/null
+++ b/.rubocop.yml
@@ -0,0 +1,16 @@
+# -*- coding: utf-8 -*-
+# vim: ft=yaml
+---
+# General overrides used across formulas in the org
+Layout/LineLength:
+ # Increase from default of `80`
+ # Based on https://github.com/PyCQA/flake8-bugbear#opinionated-warnings (`B950`)
+ Max: 88
+Metrics/BlockLength:
+ ExcludedMethods:
+ - control
+ - describe
+ # Increase from default of `25`
+ Max: 30
+
+# Any offenses that should be fixed, e.g. collected via. `rubocop --auto-gen-config`
diff --git a/.salt-lint b/.salt-lint
new file mode 100644
index 0000000..5fc3906
--- /dev/null
+++ b/.salt-lint
@@ -0,0 +1,17 @@
+# -*- coding: utf-8 -*-
+# vim: ft=yaml
+---
+exclude_paths: []
+rules: {}
+skip_list:
+ # TODO: Formula-specific override to remove eventually
+ # A lot of attention is going to be needed to resolve the existing long lines
+ - 204 # Lines should be no longer that 160 chars
+ # Using `salt-lint` for linting other files as well, such as Jinja macros/templates
+ - 205 # Use ".sls" as a Salt State file extension
+ # Skipping `207` and `208` because `210` is sufficient, at least for the time-being
+ # I.e. Allows 3-digit unquoted codes to still be used, such as `644` and `755`
+ - 207 # File modes should always be encapsulated in quotation marks
+ - 208 # File modes should always contain a leading zero
+tags: []
+verbosity: 1
diff --git a/.travis.yml b/.travis.yml
index 188dbfc..64cb372 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,27 +1,143 @@
-language: ruby
+# -*- coding: utf-8 -*-
+# vim: ft=yaml
+---
+## Machine config
+os: 'linux'
+arch: 'amd64'
+dist: 'bionic'
+version: '~> 1.0'
-rvm:
- - 2.2.5
+## Language and cache config
+language: 'ruby'
+cache: 'bundler'
-sudo: required
-services: docker
-
-env:
- matrix:
- - INSTANCE=default-ubuntu-1204
- - INSTANCE=default-ubuntu-1404
- - INSTANCE=default-ubuntu-1604
- - INSTANCE=default-debian-7
- - INSTANCE=default-debian-8
-
-# https://github.com/zuazo/kitchen-in-travis-native/issues/1#issuecomment-142455888
-before_script: sudo iptables -L DOCKER || sudo iptables -N DOCKER
-
-install:
- # setup ci for test formula
- - export BUNDLE_GEMFILE=$PWD/Gemfile
- - bundle install
+## Services config
+services:
+ - docker
+## Script to run for the test stage
script:
- # Run unit tests
- - KITCHEN_LOCAL_YAML=.kitchen.docker.yml bundle exec kitchen verify ${INSTANCE}
+ - bin/kitchen verify "${INSTANCE}"
+
+## Stages and jobs matrix
+stages:
+ - test
+ - name: 'release'
+ if: 'branch = master AND type != pull_request'
+jobs:
+ include:
+ ## Define the test stage that runs the linters (and testing matrix, if applicable)
+
+ # Run all of the linters in a single job
+ - language: 'node_js'
+ node_js: 'lts/*'
+ env: 'Lint'
+ name: 'Lint: salt-lint, yamllint, rubocop, shellcheck & commitlint'
+ before_install: 'skip'
+ script:
+ # Install and run `salt-lint`
+ - pip install --user salt-lint
+ - git ls-files -- '*.sls' '*.jinja' '*.j2' '*.tmpl' '*.tst'
+ | xargs salt-lint
+ # Install and run `yamllint`
+ # Need at least `v1.17.0` for the `yaml-files` setting
+ - pip install --user yamllint>=1.17.0
+ - yamllint -s .
+ # Install and run `rubocop`
+ - gem install rubocop
+ - rubocop -d
+ # Run `shellcheck` (already pre-installed in Travis)
+ - shellcheck --version
+ - git ls-files -- '*.sh' '*.bash' '*.ksh'
+ | xargs shellcheck
+ # Install and run `commitlint`
+ - npm i -D @commitlint/config-conventional
+ @commitlint/travis-cli
+ - commitlint-travis
+
+ # Run `pre-commit` linters in a single job
+ - language: 'python'
+ env: 'Lint_pre-commit'
+ name: 'Lint: pre-commit'
+ before_install: 'skip'
+ cache:
+ directories:
+ - $HOME/.cache/pre-commit
+ script:
+ # Install and run `pre-commit`
+ - pip install pre-commit==2.7.1
+ - pre-commit run --all-files --color always --verbose
+ - pre-commit run --color always --hook-stage manual --verbose commitlint-travis
+
+ ## Define the rest of the matrix based on Kitchen testing
+ # Make sure the instances listed below match up with
+ # the `platforms` defined in `kitchen.yml`
+ - env: INSTANCE=default-debian-10-master-py3
+ - env: INSTANCE=default-ubuntu-2004-master-py3
+ # - env: INSTANCE=default-ubuntu-1804-master-py3
+ # - env: INSTANCE=default-centos-8-master-py3
+ # - env: INSTANCE=default-fedora-32-master-py3
+ # - env: INSTANCE=default-fedora-31-master-py3
+ # - env: INSTANCE=default-opensuse-leap-152-master-py3
+ # - env: INSTANCE=default-amazonlinux-2-master-py3
+ # - env: INSTANCE=default-debian-10-3000-3-py3
+ - env: INSTANCE=default-debian-9-3000-3-py3
+ - env: INSTANCE=default-ubuntu-1804-3000-3-py3
+ # - env: INSTANCE=default-centos-8-3000-3-py3
+ # - env: INSTANCE=default-centos-7-3000-3-py3
+ # - env: INSTANCE=default-fedora-31-3000-3-py3
+ # - env: INSTANCE=default-opensuse-leap-152-3000-3-py3
+ # - env: INSTANCE=default-amazonlinux-2-3000-3-py3
+ # - env: INSTANCE=default-ubuntu-1804-3000-3-py2
+ # - env: INSTANCE=default-ubuntu-1604-3000-3-py2
+ # - env: INSTANCE=default-arch-base-latest-3000-3-py2
+ # - env: INSTANCE=default-debian-10-2019-2-py3
+ # - env: INSTANCE=default-debian-9-2019-2-py3
+ # - env: INSTANCE=default-ubuntu-1804-2019-2-py3
+ - env: INSTANCE=default-ubuntu-1604-2019-2-py3
+ # - env: INSTANCE=default-centos-8-2019-2-py3
+ # - env: INSTANCE=default-centos-7-2019-2-py3
+ # - env: INSTANCE=default-fedora-31-2019-2-py3
+ # - env: INSTANCE=default-opensuse-leap-152-2019-2-py3
+ # - env: INSTANCE=default-amazonlinux-2-2019-2-py3
+ # - env: INSTANCE=default-centos-6-2019-2-py2
+ # - env: INSTANCE=default-amazonlinux-1-2019-2-py2
+ # - env: INSTANCE=default-arch-base-latest-2019-2-py2
+
+ ## Define the release stage that runs `semantic-release`
+ - stage: 'release'
+ language: 'node_js'
+ node_js: 'lts/*'
+ env: 'Release'
+ name: 'Run semantic-release inc. file updates to AUTHORS, CHANGELOG & FORMULA'
+ before_install: 'skip'
+ script:
+ # Update `AUTHORS.md`
+ - export MAINTAINER_TOKEN=${GH_TOKEN}
+ - go get github.com/myii/maintainer
+ - maintainer contributor
+
+ # Install all dependencies required for `semantic-release`
+ - npm i -D @semantic-release/changelog@3
+ @semantic-release/exec@3
+ @semantic-release/git@7
+ deploy:
+ provider: 'script'
+ # Opt-in to `dpl v2` to complete the Travis build config validation (beta)
+ # * https://docs.travis-ci.com/user/build-config-validation
+ # Deprecated `skip_cleanup` can now be avoided, `cleanup: false` is by default
+ edge: true
+ # Run `semantic-release`
+ script: 'npx semantic-release@15.14'
+
+# Notification options: `always`, `never` or `change`
+notifications:
+ webhooks:
+ if: 'repo = saltstack-formulas/mysql-formula'
+ urls:
+ - https://saltstack-formulas.zulipchat.com/api/v1/external/travis?api_key=HsIq3o5QmLxdnVCKF9is0FUIpkpAY79P&stream=CI&topic=saltstack-formulas%2Fmysql-formula&ignore_pull_requests=true
+ on_success: always # default: always
+ on_failure: always # default: always
+ on_start: always # default: never
+ on_cancel: always # default: always
+ on_error: always # default: always
diff --git a/.yamllint b/.yamllint
new file mode 100644
index 0000000..1d467f2
--- /dev/null
+++ b/.yamllint
@@ -0,0 +1,38 @@
+# -*- coding: utf-8 -*-
+# vim: ft=yaml
+---
+# Extend the `default` configuration provided by `yamllint`
+extends: default
+
+# Files to ignore completely
+# 1. All YAML files under directory `node_modules/`, introduced during the Travis run
+# 2. Any SLS files under directory `test/`, which are actually state files
+# 3. Any YAML files under directory `.kitchen/`, introduced during local testing
+# 4. Any YAML files using Jinja (result in `yamllint` syntax errors)
+ignore: |
+ node_modules/
+ test/**/states/**/*.sls
+ .kitchen/
+ mysql/supported_sections.yaml
+
+yaml-files:
+ # Default settings
+ - '*.yaml'
+ - '*.yml'
+ - .salt-lint
+ - .yamllint
+ # SaltStack Formulas additional settings
+ - '*.example'
+ - test/**/*.sls
+
+rules:
+ empty-values:
+ forbid-in-block-mappings: true
+ forbid-in-flow-mappings: true
+ line-length:
+ # Increase from default of `80`
+ # Based on https://github.com/PyCQA/flake8-bugbear#opinionated-warnings (`B950`)
+ max: 88
+ octal-values:
+ forbid-implicit-octal: true
+ forbid-explicit-octal: true
diff --git a/AUTHORS.md b/AUTHORS.md
new file mode 100644
index 0000000..4f86729
--- /dev/null
+++ b/AUTHORS.md
@@ -0,0 +1,88 @@
+# Authors
+
+This list is sorted by the number of commits per contributor in _descending_ order.
+
+Avatar|Contributor|Contributions
+:-:|---|:-:
+
|[@myii](https://github.com/myii)|65
+
|[@gravyboat](https://github.com/gravyboat)|38
+
|[@aboe76](https://github.com/aboe76)|37
+
|[@nmadhok](https://github.com/nmadhok)|28
+
|[@whiteinge](https://github.com/whiteinge)|27
+
|[@noelmcloughlin](https://github.com/noelmcloughlin)|18
+
|[@alxwr](https://github.com/alxwr)|14
+
|[@cheuschober](https://github.com/cheuschober)|11
+
|[@babilen5](https://github.com/babilen5)|11
+
|[@pprkut](https://github.com/pprkut)|9
+
|[@techhat](https://github.com/techhat)|7
+
|[@roock](https://github.com/roock)|6
+
|[@Routhinator](https://github.com/Routhinator)|5
+
|[@puneetk](https://github.com/puneetk)|5
+
|[@davidjb](https://github.com/davidjb)|5
+
|[@xenophonf](https://github.com/xenophonf)|4
+
|[@thatch45](https://github.com/thatch45)|4
+
|[@toanju](https://github.com/toanju)|4
+
|[@tiger-seo](https://github.com/tiger-seo)|4
+
|[@gtmanfred](https://github.com/gtmanfred)|4
+
|[@alexhayes](https://github.com/alexhayes)|3
+
|[@alfonsfoubert](https://github.com/alfonsfoubert)|3
+
|[@cboltz](https://github.com/cboltz)|3
+
|[@pcdummy](https://github.com/pcdummy)|3
+
|[@sticky-note](https://github.com/sticky-note)|3
+
|[@amontalban](https://github.com/amontalban)|2
+
|[@iggy](https://github.com/iggy)|2
+
|[@ogabrielsantos](https://github.com/ogabrielsantos)|2
+
|[@kaharlichenko](https://github.com/kaharlichenko)|2
+
|[@javierbertoli](https://github.com/javierbertoli)|2
+
|[@neuhalje](https://github.com/neuhalje)|2
+
|[@stp-ip](https://github.com/stp-ip)|2
+
|[@RonWilliams](https://github.com/RonWilliams)|2
+
|[@ross-p](https://github.com/ross-p)|2
+
|[@sray](https://github.com/sray)|2
+
|[@tomasfejfar](https://github.com/tomasfejfar)|2
+
|[@vschum](https://github.com/vschum)|2
+
|[@madflojo](https://github.com/madflojo)|2
+
|[@UtahDave](https://github.com/UtahDave)|2
+
|[@daks](https://github.com/daks)|2
+
|[@nesteves](https://github.com/nesteves)|2
+
|[@1exx](https://github.com/1exx)|1
+
|[@aaronm-cloudtek](https://github.com/aaronm-cloudtek)|1
+
|[@Achimh3011](https://github.com/Achimh3011)|1
+
|[@asenci](https://github.com/asenci)|1
+
|[@word](https://github.com/word)|1
+
|[@arthurlogilab](https://github.com/arthurlogilab)|1
+
|[@johnklehm](https://github.com/johnklehm)|1
+
|[@tardypad](https://github.com/tardypad)|1
+
|[@dosercz](https://github.com/dosercz)|1
+
|[@sivir](https://github.com/sivir)|1
+
|[@terminalmage](https://github.com/terminalmage)|1
+
|[@replicant0wnz](https://github.com/replicant0wnz)|1
+
|[@GeJ](https://github.com/GeJ)|1
+
|[@imran1008](https://github.com/imran1008)|1
+
|[@JubbaSmail](https://github.com/JubbaSmail)|1
+
|[@h4ck3rm1k3](https://github.com/h4ck3rm1k3)|1
+
|[@dijit](https://github.com/dijit)|1
+
|[@joejulian](https://github.com/joejulian)|1
+
|[@stromnet](https://github.com/stromnet)|1
+
|[@thejcannon](https://github.com/thejcannon)|1
+
|[@TaiSHiNet](https://github.com/TaiSHiNet)|1
+
|[@mkotsbak](https://github.com/mkotsbak)|1
+
|[@miska](https://github.com/miska)|1
+
|[@natehouk](https://github.com/natehouk)|1
+
|[@phil-lavin](https://github.com/phil-lavin)|1
+
|[@S-Wilhelm](https://github.com/S-Wilhelm)|1
+
|[@Cottser](https://github.com/Cottser)|1
+
|[@soniah](https://github.com/soniah)|1
+
|[@tony](https://github.com/tony)|1
+
|[@wido](https://github.com/wido)|1
+
|[@Yoda-BZH](https://github.com/Yoda-BZH)|1
+
|[@abednarik](https://github.com/abednarik)|1
+
|[@jam13](https://github.com/jam13)|1
+
|[@getSurreal](https://github.com/getSurreal)|1
+
|[@slawekp](https://github.com/slawekp)|1
+
|[@tsia](https://github.com/tsia)|1
+
|[@zhujinhe](https://github.com/zhujinhe)|1
+
+---
+
+Auto-generated by a [forked version](https://github.com/myii/maintainer) of [gaocegege/maintainer](https://github.com/gaocegege/maintainer) on 2020-08-27.
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..e91df14
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,172 @@
+# Changelog
+
+## [0.54.2](https://github.com/saltstack-formulas/mysql-formula/compare/v0.54.1...v0.54.2) (2020-08-27)
+
+
+### Bug Fixes
+
+* **indent:** properly indent file.directory block ([7791268](https://github.com/saltstack-formulas/mysql-formula/commit/7791268d133d557d21414365db59dc14c8f97f74)), closes [#250](https://github.com/saltstack-formulas/mysql-formula/issues/250)
+
+## [0.54.1](https://github.com/saltstack-formulas/mysql-formula/compare/v0.54.0...v0.54.1) (2020-08-24)
+
+
+### Bug Fixes
+
+* **freebsd:** upgrade to mysql57-server ([ec68199](https://github.com/saltstack-formulas/mysql-formula/commit/ec681995b4f7e23a8dbec63809d3704f19ec9299))
+
+# [0.54.0](https://github.com/saltstack-formulas/mysql-formula/compare/v0.53.0...v0.54.0) (2020-07-10)
+
+
+### Continuous Integration
+
+* **kitchen:** use `saltimages` Docker Hub where available [skip ci] ([b37a8a7](https://github.com/saltstack-formulas/mysql-formula/commit/b37a8a7c970cb30ed18f04c4103c5f553557699d))
+
+
+### Features
+
+* **socket_authentication:** allow unix_socket authentication ([8eccd5a](https://github.com/saltstack-formulas/mysql-formula/commit/8eccd5a68cadde02f54467a7fb9e370d2ee7d574))
+
+# [0.53.0](https://github.com/saltstack-formulas/mysql-formula/compare/v0.52.7...v0.53.0) (2020-06-01)
+
+
+### Continuous Integration
+
+* **kitchen+travis:** use latest pre-salted images ([7ea518a](https://github.com/saltstack-formulas/mysql-formula/commit/7ea518a3919f1a59bc6ae821bc0df7577629059a))
+* **travis:** add notifications => zulip [skip ci] ([8adfc4b](https://github.com/saltstack-formulas/mysql-formula/commit/8adfc4bb4fbb49548cf46d277a0403b89c180b1a))
+
+
+### Features
+
+* **focal:** add settings for `ubuntu-20.04` ([0d77164](https://github.com/saltstack-formulas/mysql-formula/commit/0d77164f394909ec371f39cb41a4920c82e75052))
+
+## [0.52.7](https://github.com/saltstack-formulas/mysql-formula/compare/v0.52.6...v0.52.7) (2020-05-19)
+
+
+### Bug Fixes
+
+* **osfamilymap.yaml:** update SUSE defaults ([8ee79a7](https://github.com/saltstack-formulas/mysql-formula/commit/8ee79a7bb03488e4c3632a1dcfe143696a11aad5))
+
+
+### Continuous Integration
+
+* **gemfile.lock:** add to repo with updated `Gemfile` [skip ci] ([9e9fa3e](https://github.com/saltstack-formulas/mysql-formula/commit/9e9fa3e3d15e25ad22f75eae61af4883c79b7c0f))
+* **kitchen+travis:** remove `master-py2-arch-base-latest` [skip ci] ([c1dddc3](https://github.com/saltstack-formulas/mysql-formula/commit/c1dddc3a8d561847094bbe23fe2c764c8fdf79de))
+* **workflows/commitlint:** add to repo [skip ci] ([b4c6570](https://github.com/saltstack-formulas/mysql-formula/commit/b4c65702b91e8813741bf72008e41d1d8dfc735d))
+
+## [0.52.6](https://github.com/saltstack-formulas/mysql-formula/compare/v0.52.5...v0.52.6) (2020-04-17)
+
+
+### Bug Fixes
+
+* **reload-modules:** do `reload_modules` on py module installation ([2b6e704](https://github.com/saltstack-formulas/mysql-formula/commit/2b6e704c96d0373aadb56f90d758c960f538abdb))
+
+
+### Continuous Integration
+
+* **gemfile:** restrict `train` gem version until upstream fix [skip ci] ([04f75a7](https://github.com/saltstack-formulas/mysql-formula/commit/04f75a7a3b43de9425a8f36dc202b7ecf0c4f856))
+* **kitchen:** avoid using bootstrap for `master` instances [skip ci] ([ef7a2ce](https://github.com/saltstack-formulas/mysql-formula/commit/ef7a2ce2d857dd271ec0704ab951c8337cb6b64e))
+* **travis:** use `major.minor` for `semantic-release` version [skip ci] ([b4f5f79](https://github.com/saltstack-formulas/mysql-formula/commit/b4f5f79781631d7d31061b880df3066ac5bc5860))
+
+## [0.52.5](https://github.com/saltstack-formulas/mysql-formula/compare/v0.52.4...v0.52.5) (2019-12-10)
+
+
+### Bug Fixes
+
+* **db_load:** preserve space between -h and -p on the db load `cmd.wait` ([a05f263](https://github.com/saltstack-formulas/mysql-formula/commit/a05f263f4b9eac52a5854fd57a6a24f997ccb291))
+
+## [0.52.4](https://github.com/saltstack-formulas/mysql-formula/compare/v0.52.3...v0.52.4) (2019-12-03)
+
+
+### Styles
+
+* remove previous line from jinja directives ([ec0e2a7](https://github.com/saltstack-formulas/mysql-formula/commit/ec0e2a765a587d0df94b0afb9f7a4ef78a5319ab))
+
+## [0.52.3](https://github.com/saltstack-formulas/mysql-formula/compare/v0.52.2...v0.52.3) (2019-12-03)
+
+
+### Bug Fixes
+
+* **mac_shortcut.sh:** fix `shellcheck` errors ([7b309f8](https://github.com/saltstack-formulas/mysql-formula/commit/7b309f8da272ebdcb36dbfa7619a0fc9872a79a7))
+* **release.config.js:** use full commit hash in commit link [skip ci] ([3f51b8b](https://github.com/saltstack-formulas/mysql-formula/commit/3f51b8bbc231a7455e6763b415221abff636d8a2))
+
+
+### Continuous Integration
+
+* **kitchen:** use `debian-10-master-py3` instead of `develop` [skip ci] ([5efe938](https://github.com/saltstack-formulas/mysql-formula/commit/5efe9387fde63e0c09d99d5771f3b623fb934242))
+* **kitchen:** use `develop` image until `master` is ready (`amazonlinux`) [skip ci] ([63bfb4a](https://github.com/saltstack-formulas/mysql-formula/commit/63bfb4a0f25b62bdc45c1738d438ce5ec64f2183))
+* **kitchen+travis:** upgrade matrix after `2019.2.2` release [skip ci] ([27ac5a3](https://github.com/saltstack-formulas/mysql-formula/commit/27ac5a3f684325a8e15736bb85d4774807061534))
+* **travis:** apply changes from build config validation [skip ci] ([d520848](https://github.com/saltstack-formulas/mysql-formula/commit/d520848c815a9c2815ee3f1943e3e3962a26c7cf))
+* **travis:** opt-in to `dpl v2` to complete build config validation [skip ci] ([1a8d914](https://github.com/saltstack-formulas/mysql-formula/commit/1a8d914fbd5e43f78ee2334b9c5ccd51ee65ad57))
+* **travis:** quote pathspecs used with `git ls-files` [skip ci] ([3fb5a82](https://github.com/saltstack-formulas/mysql-formula/commit/3fb5a82de66dda9a05decc5ee7263729ef913533))
+* **travis:** run `shellcheck` during lint job [skip ci] ([0931835](https://github.com/saltstack-formulas/mysql-formula/commit/0931835f1cfc77022a43242bd3ab04cbed2a3a02))
+* **travis:** update `salt-lint` config for `v0.0.10` [skip ci] ([1512279](https://github.com/saltstack-formulas/mysql-formula/commit/1512279c2eac26638720461cc7e847d93d2c77d6))
+* **travis:** use build config validation (beta) [skip ci] ([40d4b97](https://github.com/saltstack-formulas/mysql-formula/commit/40d4b9763f252f5811d31b2b2df156260bde2b6d))
+
+
+### Documentation
+
+* **contributing:** remove to use org-level file instead [skip ci] ([6afcc80](https://github.com/saltstack-formulas/mysql-formula/commit/6afcc80396dc4ec2044d8611f18a6ed9075c6a52))
+* **readme:** update link to `CONTRIBUTING` [skip ci] ([01f25a3](https://github.com/saltstack-formulas/mysql-formula/commit/01f25a3ebfbf59d1db2bec73bc5fef9d8bcafd7e))
+
+
+### Performance Improvements
+
+* **travis:** improve `salt-lint` invocation [skip ci] ([1980c63](https://github.com/saltstack-formulas/mysql-formula/commit/1980c634b9021c7d29be914bd2a63ddf3c31c8ad))
+
+## [0.52.2](https://github.com/saltstack-formulas/mysql-formula/compare/v0.52.1...v0.52.2) (2019-10-11)
+
+
+### Bug Fixes
+
+* **rubocop:** add fixes using `rubocop --safe-auto-correct` ([](https://github.com/saltstack-formulas/mysql-formula/commit/fca3b04))
+
+
+### Continuous Integration
+
+* merge travis matrix, add `salt-lint` & `rubocop` to `lint` job ([](https://github.com/saltstack-formulas/mysql-formula/commit/b2b8863))
+* **travis:** merge `rubocop` linter into main `lint` job ([](https://github.com/saltstack-formulas/mysql-formula/commit/26dc562))
+
+## [0.52.1](https://github.com/saltstack-formulas/mysql-formula/compare/v0.52.0...v0.52.1) (2019-10-10)
+
+
+### Bug Fixes
+
+* **server.sls:** fix `salt-lint` errors ([](https://github.com/saltstack-formulas/mysql-formula/commit/764dd0c))
+* **user.sls:** fix `salt-lint` errors ([](https://github.com/saltstack-formulas/mysql-formula/commit/a014e55))
+
+
+### Continuous Integration
+
+* **kitchen:** change `log_level` to `debug` instead of `info` ([](https://github.com/saltstack-formulas/mysql-formula/commit/75fd8dc))
+* **kitchen:** install required packages to bootstrapped `opensuse` [skip ci] ([](https://github.com/saltstack-formulas/mysql-formula/commit/8b89ebc))
+* **kitchen:** use bootstrapped `opensuse` images until `2019.2.2` [skip ci] ([](https://github.com/saltstack-formulas/mysql-formula/commit/4bdaab7))
+* **platform:** add `arch-base-latest` (commented out for now) [skip ci] ([](https://github.com/saltstack-formulas/mysql-formula/commit/5c20c9b))
+* **yamllint:** add rule `empty-values` & use new `yaml-files` setting ([](https://github.com/saltstack-formulas/mysql-formula/commit/2322ff6))
+* merge travis matrix, add `salt-lint` & `rubocop` to `lint` job ([](https://github.com/saltstack-formulas/mysql-formula/commit/00494d5))
+* use `dist: bionic` & apply `opensuse-leap-15` SCP error workaround ([](https://github.com/saltstack-formulas/mysql-formula/commit/05b1cef))
+
+# [0.52.0](https://github.com/saltstack-formulas/mysql-formula/compare/v0.51.0...v0.52.0) (2019-08-17)
+
+
+### Features
+
+* **yamllint:** include for this repo and apply rules throughout ([9f739fa](https://github.com/saltstack-formulas/mysql-formula/commit/9f739fa))
+
+# [0.51.0](https://github.com/saltstack-formulas/mysql-formula/compare/v0.50.0...v0.51.0) (2019-08-08)
+
+
+### Bug Fixes
+
+* **connector:** fix typos (connnector) and missing `enabled` ([bdee94a](https://github.com/saltstack-formulas/mysql-formula/commit/bdee94a))
+
+
+### Features
+
+* **linux:** archlinux support (no osmajorrelase grain) ([4b4ad88](https://github.com/saltstack-formulas/mysql-formula/commit/4b4ad88))
+
+# [0.50.0](https://github.com/saltstack-formulas/mysql-formula/compare/v0.49.0...v0.50.0) (2019-07-12)
+
+
+### Features
+
+* **semantic-release:** implement for this formula ([1d2e2f5](https://github.com/saltstack-formulas/mysql-formula/commit/1d2e2f5))
diff --git a/CODEOWNERS b/CODEOWNERS
new file mode 100644
index 0000000..f993894
--- /dev/null
+++ b/CODEOWNERS
@@ -0,0 +1,47 @@
+# https://help.github.com/en/github/creating-cloning-and-archiving-repositories/about-code-owners
+
+# SECTION: Owner(s) for everything in the repo, unless a later match takes precedence
+# **************************************************************************
+# *** NO GLOBAL OWNER(S) SPECIFIED ***
+# *** Ideally this will be defined for a healthy, well-maintained repo ***
+# **************************************************************************
+# FILE PATTERN OWNER(S)
+* @NONE
+
+# SECTION: Owner(s) for specific directories
+# FILE PATTERN OWNER(S)
+
+# SECTION: Owner(s) for files/directories related to `semantic-release`
+# FILE PATTERN OWNER(S)
+/.github/workflows/ @saltstack-formulas/ssf
+/bin/install-hooks @saltstack-formulas/ssf
+/bin/kitchen @saltstack-formulas/ssf
+/docs/AUTHORS.rst @saltstack-formulas/ssf
+/docs/CHANGELOG.rst @saltstack-formulas/ssf
+/docs/TOFS_pattern.rst @saltstack-formulas/ssf
+/mysql/libsaltcli.jinja @saltstack-formulas/ssf
+/mysql/libtofs.jinja @saltstack-formulas/ssf
+/test/integration/**/inspec.yml @saltstack-formulas/ssf
+/test/integration/**/README.md @saltstack-formulas/ssf
+/.gitignore @saltstack-formulas/ssf
+/.cirrus.yml @saltstack-formulas/ssf
+/.pre-commit-config.yaml @saltstack-formulas/ssf
+/.rstcheck.cfg @saltstack-formulas/ssf
+/.rubocop.yml @saltstack-formulas/ssf
+/.salt-lint @saltstack-formulas/ssf
+/.travis.yml @saltstack-formulas/ssf
+/.yamllint @saltstack-formulas/ssf
+/AUTHORS.md @saltstack-formulas/ssf
+/CHANGELOG.md @saltstack-formulas/ssf
+/CODEOWNERS @saltstack-formulas/ssf
+/commitlint.config.js @saltstack-formulas/ssf
+/FORMULA @saltstack-formulas/ssf
+/Gemfile @saltstack-formulas/ssf
+/Gemfile.lock @saltstack-formulas/ssf
+/kitchen.yml @saltstack-formulas/ssf
+/pre-commit_semantic-release.sh @saltstack-formulas/ssf
+/release-rules.js @saltstack-formulas/ssf
+/release.config.js @saltstack-formulas/ssf
+
+# SECTION: Owner(s) for specific files
+# FILE PATTERN OWNER(S)
diff --git a/FORMULA b/FORMULA
index ebf0129..bfb2e55 100644
--- a/FORMULA
+++ b/FORMULA
@@ -1,8 +1,9 @@
name: mysql
os: RedHat, CentOS, Debian, Ubuntu, Suse, Gentoo, FreeBSD
os_family: RedHat, Debian, Suse, Gentoo, FreeBSD
-version: 201507
+version: 0.54.2
release: 1
minimum_version: 2015.8
summary: Formula for installing MySQL
description: Formula for installing MySQL database client and/or server
+top_level_dir: mysql
diff --git a/Gemfile b/Gemfile
index f74e267..82c4a31 100644
--- a/Gemfile
+++ b/Gemfile
@@ -1,18 +1,12 @@
+# frozen_string_literal: true
+
source 'https://rubygems.org'
-gem 'codeclimate-test-reporter', group: :test, require: nil
-gem 'rake'
-gem 'berkshelf', '~> 4.0'
-
-group :integration do
- gem 'test-kitchen'
- gem 'kitchen-salt'
- gem 'kitchen-inspec'
-end
-
-group :docker do
- gem 'kitchen-docker'
-end
-
-# vi: set ft=ruby :
-gem "kitchen-vagrant"
+# Use the latest version of `inspec` prior to `4.23.4`, which introduces a
+# regression where the diff isn't displayed when comparing using `eq`.
+gem 'inspec', '~> 4.22.22'
+# Install the `kitchen-docker` gem from GitHub because the latest version
+# currently available (`2.10.0`) doesn't include a recent fix for Gentoo.
+gem 'kitchen-docker', github: 'test-kitchen/kitchen-docker', ref: '41e80fe'
+gem 'kitchen-inspec', '>= 2.2.1'
+gem 'kitchen-salt', '>= 0.6.3'
diff --git a/Gemfile.lock b/Gemfile.lock
new file mode 100644
index 0000000..19bf26d
--- /dev/null
+++ b/Gemfile.lock
@@ -0,0 +1,530 @@
+GIT
+ remote: https://github.com/test-kitchen/kitchen-docker.git
+ revision: 41e80fed3a7cc86323e19c16a5a340cebf7e5848
+ ref: 41e80fe
+ specs:
+ kitchen-docker (2.10.0)
+ test-kitchen (>= 1.0.0)
+
+GEM
+ remote: https://rubygems.org/
+ specs:
+ activesupport (5.2.4.4)
+ concurrent-ruby (~> 1.0, >= 1.0.2)
+ i18n (>= 0.7, < 2)
+ minitest (~> 5.1)
+ tzinfo (~> 1.1)
+ addressable (2.7.0)
+ public_suffix (>= 2.0.2, < 5.0)
+ aws-eventstream (1.1.0)
+ aws-partitions (1.386.0)
+ aws-sdk-apigateway (1.55.0)
+ aws-sdk-core (~> 3, >= 3.109.0)
+ aws-sigv4 (~> 1.1)
+ aws-sdk-apigatewayv2 (1.29.0)
+ aws-sdk-core (~> 3, >= 3.109.0)
+ aws-sigv4 (~> 1.1)
+ aws-sdk-athena (1.33.0)
+ aws-sdk-core (~> 3, >= 3.109.0)
+ aws-sigv4 (~> 1.1)
+ aws-sdk-autoscaling (1.22.0)
+ aws-sdk-core (~> 3, >= 3.52.1)
+ aws-sigv4 (~> 1.1)
+ aws-sdk-budgets (1.36.0)
+ aws-sdk-core (~> 3, >= 3.109.0)
+ aws-sigv4 (~> 1.1)
+ aws-sdk-cloudformation (1.44.0)
+ aws-sdk-core (~> 3, >= 3.109.0)
+ aws-sigv4 (~> 1.1)
+ aws-sdk-cloudfront (1.46.0)
+ aws-sdk-core (~> 3, >= 3.109.0)
+ aws-sigv4 (~> 1.1)
+ aws-sdk-cloudhsm (1.27.0)
+ aws-sdk-core (~> 3, >= 3.109.0)
+ aws-sigv4 (~> 1.1)
+ aws-sdk-cloudhsmv2 (1.30.0)
+ aws-sdk-core (~> 3, >= 3.109.0)
+ aws-sigv4 (~> 1.1)
+ aws-sdk-cloudtrail (1.29.0)
+ aws-sdk-core (~> 3, >= 3.109.0)
+ aws-sigv4 (~> 1.1)
+ aws-sdk-cloudwatch (1.45.0)
+ aws-sdk-core (~> 3, >= 3.109.0)
+ aws-sigv4 (~> 1.1)
+ aws-sdk-cloudwatchlogs (1.38.0)
+ aws-sdk-core (~> 3, >= 3.109.0)
+ aws-sigv4 (~> 1.1)
+ aws-sdk-codecommit (1.40.0)
+ aws-sdk-core (~> 3, >= 3.109.0)
+ aws-sigv4 (~> 1.1)
+ aws-sdk-codedeploy (1.37.0)
+ aws-sdk-core (~> 3, >= 3.109.0)
+ aws-sigv4 (~> 1.1)
+ aws-sdk-codepipeline (1.37.0)
+ aws-sdk-core (~> 3, >= 3.109.0)
+ aws-sigv4 (~> 1.1)
+ aws-sdk-configservice (1.53.0)
+ aws-sdk-core (~> 3, >= 3.109.0)
+ aws-sigv4 (~> 1.1)
+ aws-sdk-core (3.109.1)
+ aws-eventstream (~> 1, >= 1.0.2)
+ aws-partitions (~> 1, >= 1.239.0)
+ aws-sigv4 (~> 1.1)
+ jmespath (~> 1.0)
+ aws-sdk-costandusagereportservice (1.28.0)
+ aws-sdk-core (~> 3, >= 3.109.0)
+ aws-sigv4 (~> 1.1)
+ aws-sdk-dynamodb (1.55.0)
+ aws-sdk-core (~> 3, >= 3.109.0)
+ aws-sigv4 (~> 1.1)
+ aws-sdk-ec2 (1.202.0)
+ aws-sdk-core (~> 3, >= 3.109.0)
+ aws-sigv4 (~> 1.1)
+ aws-sdk-ecr (1.39.0)
+ aws-sdk-core (~> 3, >= 3.109.0)
+ aws-sigv4 (~> 1.1)
+ aws-sdk-ecs (1.70.0)
+ aws-sdk-core (~> 3, >= 3.109.0)
+ aws-sigv4 (~> 1.1)
+ aws-sdk-efs (1.36.0)
+ aws-sdk-core (~> 3, >= 3.109.0)
+ aws-sigv4 (~> 1.1)
+ aws-sdk-eks (1.45.0)
+ aws-sdk-core (~> 3, >= 3.109.0)
+ aws-sigv4 (~> 1.1)
+ aws-sdk-elasticache (1.44.0)
+ aws-sdk-core (~> 3, >= 3.109.0)
+ aws-sigv4 (~> 1.1)
+ aws-sdk-elasticbeanstalk (1.39.0)
+ aws-sdk-core (~> 3, >= 3.109.0)
+ aws-sigv4 (~> 1.1)
+ aws-sdk-elasticloadbalancing (1.29.0)
+ aws-sdk-core (~> 3, >= 3.109.0)
+ aws-sigv4 (~> 1.1)
+ aws-sdk-elasticloadbalancingv2 (1.53.0)
+ aws-sdk-core (~> 3, >= 3.109.0)
+ aws-sigv4 (~> 1.1)
+ aws-sdk-elasticsearchservice (1.43.0)
+ aws-sdk-core (~> 3, >= 3.109.0)
+ aws-sigv4 (~> 1.1)
+ aws-sdk-firehose (1.35.0)
+ aws-sdk-core (~> 3, >= 3.109.0)
+ aws-sigv4 (~> 1.1)
+ aws-sdk-guardduty (1.42.0)
+ aws-sdk-core (~> 3, >= 3.109.0)
+ aws-sigv4 (~> 1.1)
+ aws-sdk-iam (1.46.0)
+ aws-sdk-core (~> 3, >= 3.109.0)
+ aws-sigv4 (~> 1.1)
+ aws-sdk-kafka (1.29.0)
+ aws-sdk-core (~> 3, >= 3.109.0)
+ aws-sigv4 (~> 1.1)
+ aws-sdk-kinesis (1.30.0)
+ aws-sdk-core (~> 3, >= 3.109.0)
+ aws-sigv4 (~> 1.1)
+ aws-sdk-kms (1.39.0)
+ aws-sdk-core (~> 3, >= 3.109.0)
+ aws-sigv4 (~> 1.1)
+ aws-sdk-lambda (1.51.0)
+ aws-sdk-core (~> 3, >= 3.109.0)
+ aws-sigv4 (~> 1.1)
+ aws-sdk-organizations (1.17.0)
+ aws-sdk-core (~> 3, >= 3.39.0)
+ aws-sigv4 (~> 1.0)
+ aws-sdk-rds (1.104.0)
+ aws-sdk-core (~> 3, >= 3.109.0)
+ aws-sigv4 (~> 1.1)
+ aws-sdk-redshift (1.50.0)
+ aws-sdk-core (~> 3, >= 3.109.0)
+ aws-sigv4 (~> 1.1)
+ aws-sdk-route53 (1.44.0)
+ aws-sdk-core (~> 3, >= 3.109.0)
+ aws-sigv4 (~> 1.1)
+ aws-sdk-route53domains (1.28.0)
+ aws-sdk-core (~> 3, >= 3.109.0)
+ aws-sigv4 (~> 1.1)
+ aws-sdk-route53resolver (1.21.0)
+ aws-sdk-core (~> 3, >= 3.109.0)
+ aws-sigv4 (~> 1.1)
+ aws-sdk-s3 (1.83.1)
+ aws-sdk-core (~> 3, >= 3.109.0)
+ aws-sdk-kms (~> 1)
+ aws-sigv4 (~> 1.1)
+ aws-sdk-securityhub (1.35.0)
+ aws-sdk-core (~> 3, >= 3.109.0)
+ aws-sigv4 (~> 1.1)
+ aws-sdk-ses (1.36.0)
+ aws-sdk-core (~> 3, >= 3.109.0)
+ aws-sigv4 (~> 1.1)
+ aws-sdk-sms (1.27.0)
+ aws-sdk-core (~> 3, >= 3.109.0)
+ aws-sigv4 (~> 1.1)
+ aws-sdk-sns (1.34.0)
+ aws-sdk-core (~> 3, >= 3.109.0)
+ aws-sigv4 (~> 1.1)
+ aws-sdk-sqs (1.34.0)
+ aws-sdk-core (~> 3, >= 3.109.0)
+ aws-sigv4 (~> 1.1)
+ aws-sdk-ssm (1.95.0)
+ aws-sdk-core (~> 3, >= 3.109.0)
+ aws-sigv4 (~> 1.1)
+ aws-sigv4 (1.2.2)
+ aws-eventstream (~> 1, >= 1.0.2)
+ azure_graph_rbac (0.17.2)
+ ms_rest_azure (~> 0.12.0)
+ azure_mgmt_key_vault (0.17.6)
+ ms_rest_azure (~> 0.12.0)
+ azure_mgmt_resources (0.18.0)
+ ms_rest_azure (~> 0.12.0)
+ azure_mgmt_security (0.18.2)
+ ms_rest_azure (~> 0.12.0)
+ azure_mgmt_storage (0.22.0)
+ ms_rest_azure (~> 0.12.0)
+ bcrypt_pbkdf (1.0.1)
+ builder (3.2.4)
+ chef-config (16.6.14)
+ addressable
+ chef-utils (= 16.6.14)
+ fuzzyurl
+ mixlib-config (>= 2.2.12, < 4.0)
+ mixlib-shellout (>= 2.0, < 4.0)
+ tomlrb (~> 1.2)
+ chef-telemetry (1.0.14)
+ chef-config
+ concurrent-ruby (~> 1.0)
+ ffi-yajl (~> 2.2)
+ chef-utils (16.6.14)
+ coderay (1.1.3)
+ concurrent-ruby (1.1.7)
+ declarative (0.0.20)
+ declarative-option (0.1.0)
+ diff-lcs (1.4.4)
+ docker-api (2.0.0)
+ excon (>= 0.47.0)
+ multi_json
+ domain_name (0.5.20190701)
+ unf (>= 0.0.5, < 1.0.0)
+ ecma-re-validator (0.2.1)
+ regexp_parser (~> 1.2)
+ ed25519 (1.2.4)
+ erubi (1.9.0)
+ excon (0.78.0)
+ faraday (0.17.3)
+ multipart-post (>= 1.2, < 3)
+ faraday-cookie_jar (0.0.7)
+ faraday (>= 0.8.0)
+ http-cookie (~> 1.0.0)
+ faraday_middleware (0.12.2)
+ faraday (>= 0.7.4, < 1.0)
+ ffi (1.13.1)
+ ffi-yajl (2.3.4)
+ libyajl2 (~> 1.2)
+ fuzzyurl (0.9.0)
+ google-api-client (0.44.0)
+ addressable (~> 2.5, >= 2.5.1)
+ googleauth (~> 0.9)
+ httpclient (>= 2.8.1, < 3.0)
+ mini_mime (~> 1.0)
+ representable (~> 3.0)
+ retriable (>= 2.0, < 4.0)
+ signet (~> 0.12)
+ googleauth (0.13.0)
+ faraday (>= 0.17.3, < 2.0)
+ jwt (>= 1.4, < 3.0)
+ memoist (~> 0.16)
+ multi_json (~> 1.11)
+ os (>= 0.9, < 2.0)
+ signet (~> 0.14)
+ gssapi (1.3.0)
+ ffi (>= 1.0.1)
+ gyoku (1.3.1)
+ builder (>= 2.1.2)
+ hana (1.3.6)
+ hashie (3.6.0)
+ http-cookie (1.0.3)
+ domain_name (~> 0.5)
+ httpclient (2.8.3)
+ i18n (1.8.5)
+ concurrent-ruby (~> 1.0)
+ inifile (3.0.0)
+ inspec (4.22.22)
+ faraday_middleware (~> 0.12.2)
+ inspec-core (= 4.22.22)
+ train (~> 3.0)
+ train-aws (~> 0.1)
+ train-habitat (~> 0.1)
+ train-winrm (~> 0.2)
+ inspec-core (4.22.22)
+ addressable (~> 2.4)
+ chef-telemetry (~> 1.0)
+ faraday (>= 0.9.0)
+ hashie (~> 3.4)
+ json_schemer (>= 0.2.1, < 0.2.12)
+ license-acceptance (>= 0.2.13, < 2.0)
+ method_source (>= 0.8, < 2.0)
+ mixlib-log (~> 3.0)
+ multipart-post (~> 2.0)
+ parallel (~> 1.9)
+ parslet (~> 1.5)
+ pry (~> 0.13)
+ rspec (~> 3.9)
+ rspec-its (~> 1.2)
+ rubyzip (~> 1.2, >= 1.2.2)
+ semverse (~> 3.0)
+ sslshake (~> 1.2)
+ thor (>= 0.20, < 2.0)
+ tomlrb (~> 1.2.0)
+ train-core (~> 3.0)
+ tty-prompt (~> 0.17)
+ tty-table (~> 0.10)
+ jmespath (1.4.0)
+ json (2.3.1)
+ json_schemer (0.2.11)
+ ecma-re-validator (~> 0.2)
+ hana (~> 1.3)
+ regexp_parser (~> 1.5)
+ uri_template (~> 0.7)
+ jwt (2.2.2)
+ kitchen-inspec (2.2.1)
+ hashie (~> 3.4)
+ inspec (>= 2.2.64, < 5.0)
+ test-kitchen (>= 2.7, < 3)
+ kitchen-salt (0.6.3)
+ hashie (>= 3.5)
+ test-kitchen (>= 1.4)
+ libyajl2 (1.2.0)
+ license-acceptance (1.0.19)
+ pastel (~> 0.7)
+ tomlrb (~> 1.2)
+ tty-box (~> 0.3)
+ tty-prompt (~> 0.18)
+ little-plugger (1.1.4)
+ logging (2.3.0)
+ little-plugger (~> 1.1)
+ multi_json (~> 1.14)
+ memoist (0.16.2)
+ method_source (1.0.0)
+ mini_mime (1.0.2)
+ minitest (5.14.2)
+ mixlib-config (3.0.9)
+ tomlrb
+ mixlib-install (3.12.3)
+ mixlib-shellout
+ mixlib-versioning
+ thor
+ mixlib-log (3.0.9)
+ mixlib-shellout (3.1.6)
+ chef-utils
+ mixlib-versioning (1.2.12)
+ ms_rest (0.7.6)
+ concurrent-ruby (~> 1.0)
+ faraday (>= 0.9, < 2.0.0)
+ timeliness (~> 0.3.10)
+ ms_rest_azure (0.12.0)
+ concurrent-ruby (~> 1.0)
+ faraday (>= 0.9, < 2.0.0)
+ faraday-cookie_jar (~> 0.0.6)
+ ms_rest (~> 0.7.6)
+ multi_json (1.15.0)
+ multipart-post (2.1.1)
+ net-scp (3.0.0)
+ net-ssh (>= 2.6.5, < 7.0.0)
+ net-ssh (6.1.0)
+ net-ssh-gateway (2.0.0)
+ net-ssh (>= 4.0.0)
+ nori (2.6.0)
+ os (1.1.1)
+ parallel (1.19.2)
+ parslet (1.8.2)
+ pastel (0.8.0)
+ tty-color (~> 0.5)
+ pry (0.13.1)
+ coderay (~> 1.1)
+ method_source (~> 1.0)
+ public_suffix (4.0.6)
+ regexp_parser (1.8.2)
+ representable (3.0.4)
+ declarative (< 0.1.0)
+ declarative-option (< 0.2.0)
+ uber (< 0.2.0)
+ retriable (3.1.2)
+ rspec (3.9.0)
+ rspec-core (~> 3.9.0)
+ rspec-expectations (~> 3.9.0)
+ rspec-mocks (~> 3.9.0)
+ rspec-core (3.9.3)
+ rspec-support (~> 3.9.3)
+ rspec-expectations (3.9.3)
+ diff-lcs (>= 1.2.0, < 2.0)
+ rspec-support (~> 3.9.0)
+ rspec-its (1.3.0)
+ rspec-core (>= 3.0.0)
+ rspec-expectations (>= 3.0.0)
+ rspec-mocks (3.9.1)
+ diff-lcs (>= 1.2.0, < 2.0)
+ rspec-support (~> 3.9.0)
+ rspec-support (3.9.4)
+ rubyntlm (0.6.2)
+ rubyzip (1.3.0)
+ semverse (3.0.0)
+ signet (0.14.0)
+ addressable (~> 2.3)
+ faraday (>= 0.17.3, < 2.0)
+ jwt (>= 1.5, < 3.0)
+ multi_json (~> 1.10)
+ sslshake (1.3.1)
+ strings (0.2.0)
+ strings-ansi (~> 0.2)
+ unicode-display_width (~> 1.5)
+ unicode_utils (~> 1.4)
+ strings-ansi (0.2.0)
+ test-kitchen (2.7.2)
+ bcrypt_pbkdf (~> 1.0)
+ ed25519 (~> 1.2)
+ license-acceptance (>= 1.0.11, < 3.0)
+ mixlib-install (~> 3.6)
+ mixlib-shellout (>= 1.2, < 4.0)
+ net-scp (>= 1.1, < 4.0)
+ net-ssh (>= 2.9, < 7.0)
+ net-ssh-gateway (>= 1.2, < 3.0)
+ thor (>= 0.19, < 2.0)
+ winrm (~> 2.0)
+ winrm-elevated (~> 1.0)
+ winrm-fs (~> 1.1)
+ thor (1.0.1)
+ thread_safe (0.3.6)
+ timeliness (0.3.10)
+ tomlrb (1.2.9)
+ train (3.3.27)
+ activesupport (>= 5.2.4.3, < 6.0.0)
+ azure_graph_rbac (~> 0.16)
+ azure_mgmt_key_vault (~> 0.17)
+ azure_mgmt_resources (~> 0.15)
+ azure_mgmt_security (~> 0.18)
+ azure_mgmt_storage (~> 0.18)
+ docker-api (>= 1.26, < 3.0)
+ google-api-client (>= 0.23.9, < 0.44.1)
+ googleauth (>= 0.6.6, < 0.13.1)
+ inifile (~> 3.0)
+ train-core (= 3.3.27)
+ train-winrm (~> 0.2)
+ train-aws (0.1.18)
+ aws-sdk-apigateway (~> 1.0)
+ aws-sdk-apigatewayv2 (~> 1.0)
+ aws-sdk-athena (~> 1.0)
+ aws-sdk-autoscaling (~> 1.22.0)
+ aws-sdk-budgets (~> 1.0)
+ aws-sdk-cloudformation (~> 1.0)
+ aws-sdk-cloudfront (~> 1.0)
+ aws-sdk-cloudhsm (~> 1.0)
+ aws-sdk-cloudhsmv2 (~> 1.0)
+ aws-sdk-cloudtrail (~> 1.8)
+ aws-sdk-cloudwatch (~> 1.13)
+ aws-sdk-cloudwatchlogs (~> 1.13)
+ aws-sdk-codecommit (~> 1.0)
+ aws-sdk-codedeploy (~> 1.0)
+ aws-sdk-codepipeline (~> 1.0)
+ aws-sdk-configservice (~> 1.21)
+ aws-sdk-core (~> 3.0)
+ aws-sdk-costandusagereportservice (~> 1.6)
+ aws-sdk-dynamodb (~> 1.31)
+ aws-sdk-ec2 (~> 1.70)
+ aws-sdk-ecr (~> 1.18)
+ aws-sdk-ecs (~> 1.30)
+ aws-sdk-efs (~> 1.0)
+ aws-sdk-eks (~> 1.9)
+ aws-sdk-elasticache (~> 1.0)
+ aws-sdk-elasticbeanstalk (~> 1.0)
+ aws-sdk-elasticloadbalancing (~> 1.8)
+ aws-sdk-elasticloadbalancingv2 (~> 1.0)
+ aws-sdk-elasticsearchservice (~> 1.0)
+ aws-sdk-firehose (~> 1.0)
+ aws-sdk-guardduty (~> 1.31)
+ aws-sdk-iam (~> 1.13)
+ aws-sdk-kafka (~> 1.0)
+ aws-sdk-kinesis (~> 1.0)
+ aws-sdk-kms (~> 1.13)
+ aws-sdk-lambda (~> 1.0)
+ aws-sdk-organizations (~> 1.17.0)
+ aws-sdk-rds (~> 1.43)
+ aws-sdk-redshift (~> 1.0)
+ aws-sdk-route53 (~> 1.0)
+ aws-sdk-route53domains (~> 1.0)
+ aws-sdk-route53resolver (~> 1.0)
+ aws-sdk-s3 (~> 1.30)
+ aws-sdk-securityhub (~> 1.0)
+ aws-sdk-ses (~> 1.0)
+ aws-sdk-sms (~> 1.0)
+ aws-sdk-sns (~> 1.9)
+ aws-sdk-sqs (~> 1.10)
+ aws-sdk-ssm (~> 1.0)
+ train-core (3.3.27)
+ addressable (~> 2.5)
+ ffi (!= 1.13.0)
+ json (>= 1.8, < 3.0)
+ mixlib-shellout (>= 2.0, < 4.0)
+ net-scp (>= 1.2, < 4.0)
+ net-ssh (>= 2.9, < 7.0)
+ train-habitat (0.2.13)
+ train-winrm (0.2.11)
+ winrm (~> 2.0)
+ winrm-elevated (~> 1.2.2)
+ winrm-fs (~> 1.0)
+ tty-box (0.6.0)
+ pastel (~> 0.8)
+ strings (~> 0.2.0)
+ tty-cursor (~> 0.7)
+ tty-color (0.5.2)
+ tty-cursor (0.7.1)
+ tty-prompt (0.22.0)
+ pastel (~> 0.8)
+ tty-reader (~> 0.8)
+ tty-reader (0.8.0)
+ tty-cursor (~> 0.7)
+ tty-screen (~> 0.8)
+ wisper (~> 2.0)
+ tty-screen (0.8.1)
+ tty-table (0.12.0)
+ pastel (~> 0.8)
+ strings (~> 0.2.0)
+ tty-screen (~> 0.8)
+ tzinfo (1.2.7)
+ thread_safe (~> 0.1)
+ uber (0.1.0)
+ unf (0.1.4)
+ unf_ext
+ unf_ext (0.0.7.7)
+ unicode-display_width (1.7.0)
+ unicode_utils (1.4.0)
+ uri_template (0.7.0)
+ winrm (2.3.5)
+ builder (>= 2.1.2)
+ erubi (~> 1.8)
+ gssapi (~> 1.2)
+ gyoku (~> 1.0)
+ httpclient (~> 2.2, >= 2.2.0.2)
+ logging (>= 1.6.1, < 3.0)
+ nori (~> 2.0)
+ rubyntlm (~> 0.6.0, >= 0.6.1)
+ winrm-elevated (1.2.2)
+ erubi (~> 1.8)
+ winrm (~> 2.0)
+ winrm-fs (~> 1.0)
+ winrm-fs (1.3.3)
+ erubi (~> 1.8)
+ logging (>= 1.6.1, < 3.0)
+ rubyzip (~> 1.1)
+ winrm (~> 2.0)
+ wisper (2.0.1)
+
+PLATFORMS
+ ruby
+
+DEPENDENCIES
+ inspec (~> 4.22.22)
+ kitchen-docker!
+ kitchen-inspec (>= 2.2.1)
+ kitchen-salt (>= 0.6.3)
+
+BUNDLED WITH
+ 2.1.2
diff --git a/README.rst b/README.rst
deleted file mode 100644
index 27f5b77..0000000
--- a/README.rst
+++ /dev/null
@@ -1,108 +0,0 @@
-=====
-mysql
-=====
-
-Install the MySQL client and/or server.
-
-.. note::
-
- See the full `Salt Formulas installation and usage instructions
- `_.
-
-Available states
-================
-
-.. contents::
- :local:
-
-``mysql``
----------
-
-Meta-state that includes all server packages in the correct order.
-
-This meta-state does **not** include ``mysql.remove_test_database``; see
-below for details.
-
-``mysql.client``
-----------------
-
-Install the MySQL client package.
-
-``mysql.server``
-----------------
-
-Install the MySQL server package and start the service.
-
-Debian OS family supports setting MySQL root password during install via
-debconf.
-
-.. note::
-
- If no root password is provided in the pillar, a random one will
- be created. Because Hydrogen doesn't have easy access to a random
- function (test.rand_str isn't introduced until Helium), instead,
- we use the not-at-all random ``grains.server_id``. As this is
- cryptographically insecure, future formula versions should use the
- newly available ``random.get_str`` method.
-
-``mysql.disabled``
-------------------
-
-Ensure that the MySQL service is not running.
-
-``mysql.database``
-------------------
-
-Create and manage MySQL databases.
-
-``mysql.python``
-----------------
-
-Install mysql python bindings.
-
-``mysql.user``
---------------
-
-Create and manage MySQL database users with definable GRANT privileges.
-
-The state accepts MySQL hashed passwords or clear text. Hashed password have
-priority.
-
-.. note::
- See the `salt.states.mysql_user
- `_
- docs for additional information on configuring hashed passwords.
-
- Make sure to **quote the passwords** in the pillar so YAML doesn't throw an exception.
-
-``mysql.remove_test_database``
-------------------------------
-
-.. warning::
-
- Do not use this state if your MySQL instance has a database in use called ``test``.
- If you do, it will be irrevocably removed!
-
-Remove the database called ``test``, normally created as part of a default
-MySQL installation. This state is **not** included as part of the meta-state
-above as this name may conflict with a real database.
-
-``mysql.dev``
--------------
-
-Install the MySQL development libraries and header files.
-
-.. note::
- Note that this state is not installed by the mysql meta-state unless you set
- your pillar data accordingly.
-
-``mysql.repo``
---------------
-
-Add the official MySQL 5.7 repository.
-
-.. note::
- Note that this state currently only supports MySQL 5.7 for RHEL systems.
- Debian and Suse support to be added. Also need to add the option to allow
- selection of MySQL version (5.6 and 5.5 repos are added but disabled) and
- changed enabled repository accordingly.
diff --git a/Rakefile b/Rakefile
deleted file mode 100644
index 2a6eafb..0000000
--- a/Rakefile
+++ /dev/null
@@ -1,31 +0,0 @@
-require 'rake'
-require 'rake/testtask'
-require 'bundler/setup'
-
-Rake::TestTask.new do |t|
- t.libs << 'lib'
- t.pattern = 'test/**/*_test.rb'
- t.verbose = false
-end
-
-desc 'Run Test Kitchen integration tests'
-namespace :integration do
- desc 'Run integration tests with kitchen-docker'
- task :docker do
- require 'kitchen'
- Kitchen.logger = Kitchen.default_file_logger
- @loader = Kitchen::Loader::YAML.new(local_config: '.kitchen.docker.yml')
- Kitchen::Config.new(loader: @loader).instances.each do |instance|
- instance.test(:always)
- end
- end
-end
-
-task default: :test
-
-begin
- require 'kitchen/rake_tasks'
- Kitchen::RakeTasks.new
-rescue LoadError
- puts '>>>>> Kitchen gem not loaded, omitting tasks' unless ENV['CI']
-end
diff --git a/bin/install-hooks b/bin/install-hooks
new file mode 100755
index 0000000..840bb6c
--- /dev/null
+++ b/bin/install-hooks
@@ -0,0 +1,16 @@
+#!/usr/bin/env sh
+set -o nounset # Treat unset variables as an error and immediately exit
+set -o errexit # If a command fails exit the whole script
+
+if [ "${DEBUG:-false}" = "true" ]; then
+ set -x # Run the entire script in debug mode
+fi
+
+if ! command -v pre-commit >/dev/null 2>&1; then
+ echo "pre-commit not found: please install or check your PATH" >&2
+ echo "See https://pre-commit.com/#installation" >&2
+ exit 1
+fi
+
+pre-commit install --install-hooks
+pre-commit install --hook-type commit-msg --install-hooks
diff --git a/bin/kitchen b/bin/kitchen
new file mode 100755
index 0000000..dcfdb4c
--- /dev/null
+++ b/bin/kitchen
@@ -0,0 +1,32 @@
+#!/usr/bin/env ruby
+# frozen_string_literal: true
+
+#
+# This file was generated by Bundler.
+#
+# The application 'kitchen' is installed as part of a gem, and
+# this file is here to facilitate running it.
+#
+
+require 'pathname'
+ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile',
+ Pathname.new(__FILE__).realpath)
+
+bundle_binstub = File.expand_path('bundle', __dir__)
+
+if File.file?(bundle_binstub)
+ if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
+ load(bundle_binstub)
+ else
+ abort(
+ 'Your `bin/bundle` was not generated by Bundler, '\
+ 'so this binstub cannot run. Replace `bin/bundle` by running '\
+ '`bundle binstubs bundler --force`, then run this command again.'
+ )
+ end
+end
+
+require 'rubygems'
+require 'bundler/setup'
+
+load Gem.bin_path('test-kitchen', 'kitchen')
diff --git a/commitlint.config.js b/commitlint.config.js
new file mode 100644
index 0000000..4eb37f4
--- /dev/null
+++ b/commitlint.config.js
@@ -0,0 +1,8 @@
+module.exports = {
+ extends: ['@commitlint/config-conventional'],
+ rules: {
+ 'body-max-line-length': [2, 'always', 120],
+ 'footer-max-line-length': [2, 'always', 120],
+ 'header-max-length': [2, 'always', 72],
+ },
+};
diff --git a/docs/AUTHORS.rst b/docs/AUTHORS.rst
new file mode 100644
index 0000000..66c7b62
--- /dev/null
+++ b/docs/AUTHORS.rst
@@ -0,0 +1,254 @@
+.. role:: raw-html-m2r(raw)
+ :format: html
+
+
+Authors
+=======
+
+This list is sorted by the number of commits per contributor in *descending* order.
+
+.. list-table::
+ :header-rows: 1
+
+ * - Avatar
+ - Contributor
+ - Contributions
+ * - :raw-html-m2r:`
`
+ - `@myii `_
+ - 65
+ * - :raw-html-m2r:`
`
+ - `@gravyboat `_
+ - 38
+ * - :raw-html-m2r:`
`
+ - `@aboe76 `_
+ - 37
+ * - :raw-html-m2r:`
`
+ - `@nmadhok `_
+ - 28
+ * - :raw-html-m2r:`
`
+ - `@whiteinge `_
+ - 27
+ * - :raw-html-m2r:`
`
+ - `@noelmcloughlin `_
+ - 18
+ * - :raw-html-m2r:`
`
+ - `@alxwr `_
+ - 14
+ * - :raw-html-m2r:`
`
+ - `@cheuschober `_
+ - 11
+ * - :raw-html-m2r:`
`
+ - `@babilen5 `_
+ - 11
+ * - :raw-html-m2r:`
`
+ - `@pprkut `_
+ - 9
+ * - :raw-html-m2r:`
`
+ - `@techhat `_
+ - 7
+ * - :raw-html-m2r:`
`
+ - `@roock `_
+ - 6
+ * - :raw-html-m2r:`
`
+ - `@Routhinator `_
+ - 5
+ * - :raw-html-m2r:`
`
+ - `@puneetk `_
+ - 5
+ * - :raw-html-m2r:`
`
+ - `@davidjb `_
+ - 5
+ * - :raw-html-m2r:`
`
+ - `@xenophonf `_
+ - 4
+ * - :raw-html-m2r:`
`
+ - `@thatch45 `_
+ - 4
+ * - :raw-html-m2r:`
`
+ - `@toanju `_
+ - 4
+ * - :raw-html-m2r:`
`
+ - `@tiger-seo `_
+ - 4
+ * - :raw-html-m2r:`
`
+ - `@gtmanfred `_
+ - 4
+ * - :raw-html-m2r:`
`
+ - `@alexhayes `_
+ - 3
+ * - :raw-html-m2r:`
`
+ - `@alfonsfoubert `_
+ - 3
+ * - :raw-html-m2r:`
`
+ - `@cboltz `_
+ - 3
+ * - :raw-html-m2r:`
`
+ - `@pcdummy `_
+ - 3
+ * - :raw-html-m2r:`
`
+ - `@sticky-note `_
+ - 3
+ * - :raw-html-m2r:`
`
+ - `@amontalban `_
+ - 2
+ * - :raw-html-m2r:`
`
+ - `@iggy `_
+ - 2
+ * - :raw-html-m2r:`
`
+ - `@ogabrielsantos `_
+ - 2
+ * - :raw-html-m2r:`
`
+ - `@kaharlichenko `_
+ - 2
+ * - :raw-html-m2r:`
`
+ - `@javierbertoli `_
+ - 2
+ * - :raw-html-m2r:`
`
+ - `@neuhalje `_
+ - 2
+ * - :raw-html-m2r:`
`
+ - `@stp-ip `_
+ - 2
+ * - :raw-html-m2r:`
`
+ - `@RonWilliams `_
+ - 2
+ * - :raw-html-m2r:`
`
+ - `@ross-p `_
+ - 2
+ * - :raw-html-m2r:`
`
+ - `@sray `_
+ - 2
+ * - :raw-html-m2r:`
`
+ - `@tomasfejfar `_
+ - 2
+ * - :raw-html-m2r:`
`
+ - `@vschum `_
+ - 2
+ * - :raw-html-m2r:`
`
+ - `@madflojo `_
+ - 2
+ * - :raw-html-m2r:`
`
+ - `@UtahDave `_
+ - 2
+ * - :raw-html-m2r:`
`
+ - `@daks `_
+ - 2
+ * - :raw-html-m2r:`
`
+ - `@nesteves `_
+ - 2
+ * - :raw-html-m2r:`
`
+ - `@1exx `_
+ - 1
+ * - :raw-html-m2r:`
`
+ - `@aaronm-cloudtek `_
+ - 1
+ * - :raw-html-m2r:`
`
+ - `@Achimh3011 `_
+ - 1
+ * - :raw-html-m2r:`
`
+ - `@asenci `_
+ - 1
+ * - :raw-html-m2r:`
`
+ - `@word `_
+ - 1
+ * - :raw-html-m2r:`
`
+ - `@arthurlogilab `_
+ - 1
+ * - :raw-html-m2r:`
`
+ - `@johnklehm `_
+ - 1
+ * - :raw-html-m2r:`
`
+ - `@tardypad `_
+ - 1
+ * - :raw-html-m2r:`
`
+ - `@dosercz `_
+ - 1
+ * - :raw-html-m2r:`
`
+ - `@sivir `_
+ - 1
+ * - :raw-html-m2r:`
`
+ - `@terminalmage `_
+ - 1
+ * - :raw-html-m2r:`
`
+ - `@replicant0wnz `_
+ - 1
+ * - :raw-html-m2r:`
`
+ - `@GeJ `_
+ - 1
+ * - :raw-html-m2r:`
`
+ - `@imran1008 `_
+ - 1
+ * - :raw-html-m2r:`
`
+ - `@JubbaSmail `_
+ - 1
+ * - :raw-html-m2r:`
`
+ - `@h4ck3rm1k3 `_
+ - 1
+ * - :raw-html-m2r:`
`
+ - `@dijit `_
+ - 1
+ * - :raw-html-m2r:`
`
+ - `@joejulian `_
+ - 1
+ * - :raw-html-m2r:`
`
+ - `@stromnet `_
+ - 1
+ * - :raw-html-m2r:`
`
+ - `@thejcannon `_
+ - 1
+ * - :raw-html-m2r:`
`
+ - `@TaiSHiNet `_
+ - 1
+ * - :raw-html-m2r:`
`
+ - `@mkotsbak `_
+ - 1
+ * - :raw-html-m2r:`
`
+ - `@miska `_
+ - 1
+ * - :raw-html-m2r:`
`
+ - `@natehouk `_
+ - 1
+ * - :raw-html-m2r:`
`
+ - `@phil-lavin `_
+ - 1
+ * - :raw-html-m2r:`
`
+ - `@S-Wilhelm `_
+ - 1
+ * - :raw-html-m2r:`
`
+ - `@Cottser `_
+ - 1
+ * - :raw-html-m2r:`
`
+ - `@soniah `_
+ - 1
+ * - :raw-html-m2r:`
`
+ - `@tony `_
+ - 1
+ * - :raw-html-m2r:`
`
+ - `@wido `_
+ - 1
+ * - :raw-html-m2r:`
`
+ - `@Yoda-BZH `_
+ - 1
+ * - :raw-html-m2r:`
`
+ - `@abednarik `_
+ - 1
+ * - :raw-html-m2r:`
`
+ - `@jam13 `_
+ - 1
+ * - :raw-html-m2r:`
`
+ - `@getSurreal `_
+ - 1
+ * - :raw-html-m2r:`
`
+ - `@slawekp `_
+ - 1
+ * - :raw-html-m2r:`
`
+ - `@tsia `_
+ - 1
+ * - :raw-html-m2r:`
`
+ - `@zhujinhe `_
+ - 1
+
+
+----
+
+Auto-generated by a `forked version `_ of `gaocegege/maintainer `_ on 2020-08-27.
diff --git a/docs/CHANGELOG.rst b/docs/CHANGELOG.rst
new file mode 100644
index 0000000..4cef594
--- /dev/null
+++ b/docs/CHANGELOG.rst
@@ -0,0 +1,212 @@
+
+Changelog
+=========
+
+`0.54.2 `_ (2020-08-27)
+----------------------------------------------------------------------------------------------------------
+
+Bug Fixes
+^^^^^^^^^
+
+
+* **indent:** properly indent file.directory block (\ `7791268 `_\ ), closes `#250 `_
+
+`0.54.1 `_ (2020-08-24)
+----------------------------------------------------------------------------------------------------------
+
+Bug Fixes
+^^^^^^^^^
+
+
+* **freebsd:** upgrade to mysql57-server (\ `ec68199 `_\ )
+
+`0.54.0 `_ (2020-07-10)
+----------------------------------------------------------------------------------------------------------
+
+Continuous Integration
+^^^^^^^^^^^^^^^^^^^^^^
+
+
+* **kitchen:** use ``saltimages`` Docker Hub where available [skip ci] (\ `b37a8a7 `_\ )
+
+Features
+^^^^^^^^
+
+
+* **socket_authentication:** allow unix_socket authentication (\ `8eccd5a `_\ )
+
+`0.53.0 `_ (2020-06-01)
+----------------------------------------------------------------------------------------------------------
+
+Continuous Integration
+^^^^^^^^^^^^^^^^^^^^^^
+
+
+* **kitchen+travis:** use latest pre-salted images (\ `7ea518a `_\ )
+* **travis:** add notifications => zulip [skip ci] (\ `8adfc4b `_\ )
+
+Features
+^^^^^^^^
+
+
+* **focal:** add settings for ``ubuntu-20.04`` (\ `0d77164 `_\ )
+
+`0.52.7 `_ (2020-05-19)
+----------------------------------------------------------------------------------------------------------
+
+Bug Fixes
+^^^^^^^^^
+
+
+* **osfamilymap.yaml:** update SUSE defaults (\ `8ee79a7 `_\ )
+
+Continuous Integration
+^^^^^^^^^^^^^^^^^^^^^^
+
+
+* **gemfile.lock:** add to repo with updated ``Gemfile`` [skip ci] (\ `9e9fa3e `_\ )
+* **kitchen+travis:** remove ``master-py2-arch-base-latest`` [skip ci] (\ `c1dddc3 `_\ )
+* **workflows/commitlint:** add to repo [skip ci] (\ `b4c6570 `_\ )
+
+`0.52.6 `_ (2020-04-17)
+----------------------------------------------------------------------------------------------------------
+
+Bug Fixes
+^^^^^^^^^
+
+
+* **reload-modules:** do ``reload_modules`` on py module installation (\ `2b6e704 `_\ )
+
+Continuous Integration
+^^^^^^^^^^^^^^^^^^^^^^
+
+
+* **gemfile:** restrict ``train`` gem version until upstream fix [skip ci] (\ `04f75a7 `_\ )
+* **kitchen:** avoid using bootstrap for ``master`` instances [skip ci] (\ `ef7a2ce `_\ )
+* **travis:** use ``major.minor`` for ``semantic-release`` version [skip ci] (\ `b4f5f79 `_\ )
+
+`0.52.5 `_ (2019-12-10)
+----------------------------------------------------------------------------------------------------------
+
+Bug Fixes
+^^^^^^^^^
+
+
+* **db_load:** preserve space between -h and -p on the db load ``cmd.wait`` (\ `a05f263 `_\ )
+
+`0.52.4 `_ (2019-12-03)
+----------------------------------------------------------------------------------------------------------
+
+Styles
+^^^^^^
+
+
+* remove previous line from jinja directives (\ `ec0e2a7 `_\ )
+
+`0.52.3 `_ (2019-12-03)
+----------------------------------------------------------------------------------------------------------
+
+Bug Fixes
+^^^^^^^^^
+
+
+* **mac_shortcut.sh:** fix ``shellcheck`` errors (\ `7b309f8 `_\ )
+* **release.config.js:** use full commit hash in commit link [skip ci] (\ `3f51b8b `_\ )
+
+Continuous Integration
+^^^^^^^^^^^^^^^^^^^^^^
+
+
+* **kitchen:** use ``debian-10-master-py3`` instead of ``develop`` [skip ci] (\ `5efe938 `_\ )
+* **kitchen:** use ``develop`` image until ``master`` is ready (\ ``amazonlinux``\ ) [skip ci] (\ `63bfb4a `_\ )
+* **kitchen+travis:** upgrade matrix after ``2019.2.2`` release [skip ci] (\ `27ac5a3 `_\ )
+* **travis:** apply changes from build config validation [skip ci] (\ `d520848 `_\ )
+* **travis:** opt-in to ``dpl v2`` to complete build config validation [skip ci] (\ `1a8d914 `_\ )
+* **travis:** quote pathspecs used with ``git ls-files`` [skip ci] (\ `3fb5a82 `_\ )
+* **travis:** run ``shellcheck`` during lint job [skip ci] (\ `0931835 `_\ )
+* **travis:** update ``salt-lint`` config for ``v0.0.10`` [skip ci] (\ `1512279 `_\ )
+* **travis:** use build config validation (beta) [skip ci] (\ `40d4b97 `_\ )
+
+Documentation
+^^^^^^^^^^^^^
+
+
+* **contributing:** remove to use org-level file instead [skip ci] (\ `6afcc80 `_\ )
+* **readme:** update link to ``CONTRIBUTING`` [skip ci] (\ `01f25a3 `_\ )
+
+Performance Improvements
+^^^^^^^^^^^^^^^^^^^^^^^^
+
+
+* **travis:** improve ``salt-lint`` invocation [skip ci] (\ `1980c63 `_\ )
+
+`0.52.2 `_ (2019-10-11)
+----------------------------------------------------------------------------------------------------------
+
+Bug Fixes
+^^^^^^^^^
+
+
+* **rubocop:** add fixes using ``rubocop --safe-auto-correct`` (\ ` `_\ )
+
+Continuous Integration
+^^^^^^^^^^^^^^^^^^^^^^
+
+
+* merge travis matrix, add ``salt-lint`` & ``rubocop`` to ``lint`` job (\ ` `_\ )
+* **travis:** merge ``rubocop`` linter into main ``lint`` job (\ ` `_\ )
+
+`0.52.1 `_ (2019-10-10)
+----------------------------------------------------------------------------------------------------------
+
+Bug Fixes
+^^^^^^^^^
+
+
+* **server.sls:** fix ``salt-lint`` errors (\ ` `_\ )
+* **user.sls:** fix ``salt-lint`` errors (\ ` `_\ )
+
+Continuous Integration
+^^^^^^^^^^^^^^^^^^^^^^
+
+
+* **kitchen:** change ``log_level`` to ``debug`` instead of ``info`` (\ ` `_\ )
+* **kitchen:** install required packages to bootstrapped ``opensuse`` [skip ci] (\ ` `_\ )
+* **kitchen:** use bootstrapped ``opensuse`` images until ``2019.2.2`` [skip ci] (\ ` `_\ )
+* **platform:** add ``arch-base-latest`` (commented out for now) [skip ci] (\ ` `_\ )
+* **yamllint:** add rule ``empty-values`` & use new ``yaml-files`` setting (\ ` `_\ )
+* merge travis matrix, add ``salt-lint`` & ``rubocop`` to ``lint`` job (\ ` `_\ )
+* use ``dist: bionic`` & apply ``opensuse-leap-15`` SCP error workaround (\ ` `_\ )
+
+`0.52.0 `_ (2019-08-17)
+----------------------------------------------------------------------------------------------------------
+
+Features
+^^^^^^^^
+
+
+* **yamllint:** include for this repo and apply rules throughout (\ `9f739fa `_\ )
+
+`0.51.0 `_ (2019-08-08)
+----------------------------------------------------------------------------------------------------------
+
+Bug Fixes
+^^^^^^^^^
+
+
+* **connector:** fix typos (connnector) and missing ``enabled`` (\ `bdee94a `_\ )
+
+Features
+^^^^^^^^
+
+
+* **linux:** archlinux support (no osmajorrelase grain) (\ `4b4ad88 `_\ )
+
+`0.50.0 `_ (2019-07-12)
+----------------------------------------------------------------------------------------------------------
+
+Features
+^^^^^^^^
+
+
+* **semantic-release:** implement for this formula (\ `1d2e2f5 `_\ )
diff --git a/docs/README.rst b/docs/README.rst
new file mode 100644
index 0000000..844ac63
--- /dev/null
+++ b/docs/README.rst
@@ -0,0 +1,213 @@
+.. _readme:
+
+mysql
+=====
+
+|img_travis| |img_sr|
+
+.. |img_travis| image:: https://travis-ci.com/saltstack-formulas/mysql-formula.svg?branch=master
+ :alt: Travis CI Build Status
+ :scale: 100%
+ :target: https://travis-ci.com/saltstack-formulas/mysql-formula
+.. |img_sr| image:: https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg
+ :alt: Semantic Release
+ :scale: 100%
+ :target: https://github.com/semantic-release/semantic-release
+
+Install the MySQL client and/or server on Linux and MacOS.
+
+.. contents:: **Table of Contents**
+
+General notes
+-------------
+
+See the full `SaltStack Formulas installation and usage instructions
+`_.
+
+If you are interested in writing or contributing to formulas, please pay attention to the `Writing Formula Section
+`_.
+
+If you want to use this formula, please pay attention to the ``FORMULA`` file and/or ``git tag``,
+which contains the currently released version. This formula is versioned according to `Semantic Versioning `_.
+
+See `Formula Versioning Section `_ for more details.
+
+Contributing to this repo
+-------------------------
+
+**Commit message formatting is significant!!**
+
+Please see `How to contribute `_ for more details.
+
+Available states
+----------------
+
+.. contents::
+ :local:
+
+``mysql``
+^^^^^^^^^
+
+Meta-state including all server packages in correct order. This meta-state does **not** include ``mysql.remove_test_database``.
+
+``mysql.macos``
+^^^^^^^^^^^^^^^^
+
+Install "MySQL Community Server", "MySQL Workbench", and other related mysql products on MacOS (and create Desktop shortcuts).
+
+``mysql.macos.remove``
+^^^^^^^^^^^^^^^^
+
+Remove "MySQL Community Server", "MySQL Workbench", and any other enabled products from MacOS.
+
+``mysql.client``
+^^^^^^^^^^^^^^^^
+
+Install the MySQL client package on Linux.
+
+``mysql.server``
+^^^^^^^^^^^^^^^^
+
+Install the MySQL server package and start the service.
+
+Debian OS family supports setting MySQL root password during install via debconf.
+
+.. note::
+
+ If no root password is provided in the pillar, a random one will
+ be created. Because Hydrogen doesn't have easy access to a random
+ function (test.rand_str isn't introduced until Helium), instead,
+ we use the not-at-all random ``grains.server_id``. As this is
+ cryptographically insecure, future formula versions should use the
+ newly available ``random.get_str`` method.
+
+``mysql.server_checks``
+^^^^^^^^^^^^^^^^^^^^^^^
+
+Enforces a root password to be set.
+
+
+``mysql.disabled``
+^^^^^^^^^^^^^^^^^^
+
+Ensure that the MySQL service is not running.
+
+``mysql.database``
+^^^^^^^^^^^^^^^^^^
+
+Create and manage MySQL databases.
+
+``mysql.python``
+^^^^^^^^^^^^^^^^
+
+Install mysql python bindings.
+
+``mysql.user``
+^^^^^^^^^^^^^^
+
+Create and manage MySQL database users with definable GRANT privileges.
+
+The state accepts MySQL hashed passwords or clear text. Hashed password have
+priority.
+
+.. note::
+ See the `salt.states.mysql_user
+ `_
+ docs for additional information on configuring hashed passwords.
+
+ Make sure to **quote the passwords** in the pillar so YAML doesn't throw an exception.
+
+``mysql.remove_test_database``
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+.. warning::
+
+ Do not use this state if your MySQL instance has a database in use called ``test``.
+ If you do, it will be irrevocably removed!
+
+Remove the database called ``test``, normally created as part of a default
+MySQL installation. This state is **not** included as part of the meta-state
+above as this name may conflict with a real database.
+
+``mysql.dev``
+^^^^^^^^^^^^^
+
+Install the MySQL development libraries and header files.
+
+.. note::
+ Note that this state is not installed by the mysql meta-state unless you set
+ your pillar data accordingly.
+
+``mysql.repo``
+^^^^^^^^^^^^^^
+
+Add the official MySQL 5.7 repository.
+
+.. note::
+ Note that this state currently only supports MySQL 5.7 for RHEL systems.
+ Debian and Suse support to be added. Also need to add the option to allow
+ selection of MySQL version (5.6 and 5.5 repos are added but disabled) and
+ changed enabled repository accordingly.
+
+``mysql.config``
+^^^^^^^^^^^^^^^^^^
+
+Manage the MySQL configuration.
+
+.. note::
+ There are currently two common ways to configure MySQL, a monolithic configuration file
+ or a configuration directory with configuration files per component. By default this
+ state will use a configuration directory for CentOS and Fedora, and a monolithic
+ configuration file for all other supported OSes.
+
+ Whether the configuration directory is used or not depends on whether `mysql.config_directory`
+ is defined in the pillar. If it is present it will pick the configuration from individual
+ component keys (`mysql.server`, `mysql.galera`, `mysql.libraries`, etc) with optional global
+ configuration from `mysql.global`. The monolithic configuration, however, is defined separately
+ in `mysql.config`.
+
+
+Testing
+-------
+
+Linux testing is done with ``kitchen-salt``.
+
+Requirements
+^^^^^^^^^^^^
+
+* Ruby
+* Docker
+
+.. code-block:: bash
+
+ $ gem install bundler
+ $ bundle install
+ $ bin/kitchen test [platform]
+
+Where ``[platform]`` is the platform name defined in ``kitchen.yml``,
+e.g. ``debian-9-2019-2-py3``.
+
+``bin/kitchen converge``
+^^^^^^^^^^^^^^^^^^^^^^^^
+
+Creates the docker instance and runs the ``mysql`` main state, ready for testing.
+
+``bin/kitchen verify``
+^^^^^^^^^^^^^^^^^^^^^^
+
+Runs the ``inspec`` tests on the actual instance.
+
+``bin/kitchen destroy``
+^^^^^^^^^^^^^^^^^^^^^^^
+
+Removes the docker instance.
+
+``bin/kitchen test``
+^^^^^^^^^^^^^^^^^^^^
+
+Runs all of the stages above in one go: i.e. ``destroy`` + ``converge`` + ``verify`` + ``destroy``.
+
+``bin/kitchen login``
+^^^^^^^^^^^^^^^^^^^^^
+
+Gives you SSH access to the instance for manual testing.
diff --git a/kitchen.yml b/kitchen.yml
new file mode 100644
index 0000000..84eff78
--- /dev/null
+++ b/kitchen.yml
@@ -0,0 +1,166 @@
+# -*- coding: utf-8 -*-
+# vim: ft=yaml
+---
+# For help on this file's format, see https://kitchen.ci/
+driver:
+ name: docker
+ use_sudo: false
+ privileged: true
+ run_command: /lib/systemd/systemd
+
+# Make sure the platforms listed below match up with
+# the `env.matrix` instances defined in `.travis.yml`
+platforms:
+ ## SALT `master`
+ - name: debian-10-master-py3
+ driver:
+ image: saltimages/salt-master-py3:debian-10
+ - name: ubuntu-2004-master-py3
+ driver:
+ image: saltimages/salt-master-py3:ubuntu-20.04
+ - name: ubuntu-1804-master-py3
+ driver:
+ image: saltimages/salt-master-py3:ubuntu-18.04
+ - name: centos-8-master-py3
+ driver:
+ image: saltimages/salt-master-py3:centos-8
+ - name: fedora-32-master-py3
+ driver:
+ image: saltimages/salt-master-py3:fedora-32
+ - name: fedora-31-master-py3
+ driver:
+ image: saltimages/salt-master-py3:fedora-31
+ - name: opensuse-leap-152-master-py3
+ driver:
+ image: saltimages/salt-master-py3:opensuse-leap-15.2
+ run_command: /usr/lib/systemd/systemd
+ # Workaround to avoid intermittent failures on `opensuse-leap-15.2`:
+ # => SCP did not finish successfully (255): (Net::SCP::Error)
+ transport:
+ max_ssh_sessions: 1
+ - name: amazonlinux-2-master-py3
+ driver:
+ image: saltimages/salt-master-py3:amazonlinux-2
+
+ ## SALT `3000.3`
+ - name: debian-10-3000-3-py3
+ driver:
+ image: saltimages/salt-3000.3-py3:debian-10
+ - name: debian-9-3000-3-py3
+ driver:
+ image: saltimages/salt-3000.3-py3:debian-9
+ - name: ubuntu-1804-3000-3-py3
+ driver:
+ image: saltimages/salt-3000.3-py3:ubuntu-18.04
+ - name: centos-8-3000-3-py3
+ driver:
+ image: saltimages/salt-3000.3-py3:centos-8
+ - name: centos-7-3000-3-py3
+ driver:
+ image: saltimages/salt-3000.3-py3:centos-7
+ - name: fedora-31-3000-3-py3
+ driver:
+ image: saltimages/salt-3000.3-py3:fedora-31
+ - name: opensuse-leap-152-3000-3-py3
+ driver:
+ image: saltimages/salt-3000.3-py3:opensuse-leap-15.2
+ run_command: /usr/lib/systemd/systemd
+ # Workaround to avoid intermittent failures on `opensuse-leap-15.2`:
+ # => SCP did not finish successfully (255): (Net::SCP::Error)
+ transport:
+ max_ssh_sessions: 1
+ - name: amazonlinux-2-3000-3-py3
+ driver:
+ image: saltimages/salt-3000.3-py3:amazonlinux-2
+ - name: ubuntu-1804-3000-3-py2
+ driver:
+ image: saltimages/salt-3000.3-py2:ubuntu-18.04
+ - name: ubuntu-1604-3000-3-py2
+ driver:
+ image: saltimages/salt-3000.3-py2:ubuntu-16.04
+ - name: arch-base-latest-3000-3-py2
+ driver:
+ image: saltimages/salt-3000.3-py2:arch-base-latest
+ run_command: /usr/lib/systemd/systemd
+
+ ## SALT `2019.2`
+ - name: debian-10-2019-2-py3
+ driver:
+ image: saltimages/salt-2019.2-py3:debian-10
+ - name: debian-9-2019-2-py3
+ driver:
+ image: saltimages/salt-2019.2-py3:debian-9
+ - name: ubuntu-1804-2019-2-py3
+ driver:
+ image: saltimages/salt-2019.2-py3:ubuntu-18.04
+ - name: ubuntu-1604-2019-2-py3
+ driver:
+ image: saltimages/salt-2019.2-py3:ubuntu-16.04
+ - name: centos-8-2019-2-py3
+ driver:
+ image: saltimages/salt-2019.2-py3:centos-8
+ - name: centos-7-2019-2-py3
+ driver:
+ image: saltimages/salt-2019.2-py3:centos-7
+ - name: fedora-31-2019-2-py3
+ driver:
+ image: saltimages/salt-2019.2-py3:fedora-31
+ - name: opensuse-leap-152-2019-2-py3
+ driver:
+ image: saltimages/salt-2019.2-py3:opensuse-leap-15.2
+ run_command: /usr/lib/systemd/systemd
+ # Workaround to avoid intermittent failures on `opensuse-leap-15.2`:
+ # => SCP did not finish successfully (255): (Net::SCP::Error)
+ transport:
+ max_ssh_sessions: 1
+ - name: amazonlinux-2-2019-2-py3
+ driver:
+ image: saltimages/salt-2019.2-py3:amazonlinux-2
+ - name: centos-6-2019-2-py2
+ driver:
+ image: saltimages/salt-2019.2-py2:centos-6
+ run_command: /sbin/init
+ - name: amazonlinux-1-2019-2-py2
+ driver:
+ image: saltimages/salt-2019.2-py2:amazonlinux-1
+ run_command: /sbin/init
+ - name: arch-base-latest-2019-2-py2
+ driver:
+ image: saltimages/salt-2019.2-py2:arch-base-latest
+ run_command: /usr/lib/systemd/systemd
+
+provisioner:
+ name: salt_solo
+ log_level: debug
+ salt_install: none
+ require_chef: false
+ formula: mysql
+ salt_copy_filter:
+ - .kitchen
+ - .git
+
+verifier:
+ # https://www.inspec.io/
+ name: inspec
+ sudo: true
+ # cli, documentation, html, progress, json, json-min, json-rspec, junit
+ reporter:
+ - cli
+
+suites:
+ - name: default
+ provisioner:
+ state_top:
+ base:
+ '*':
+ - mysql
+ pillars:
+ top.sls:
+ base:
+ '*':
+ - mysql
+ pillars_from_files:
+ mysql.sls: test/salt/pillar/mysql.sls
+ verifier:
+ inspec_tests:
+ - path: test/integration/default
diff --git a/mysql/apparmor.sls b/mysql/apparmor.sls
new file mode 100644
index 0000000..1cc542d
--- /dev/null
+++ b/mysql/apparmor.sls
@@ -0,0 +1,14 @@
+{%- from tpldir ~ "/map.jinja" import mysql with context %}
+
+{%- if "apparmor" in mysql.config %}
+
+mysqld-apparmor-allow:
+ file.append:
+ - name: {{ mysql.config.apparmor.dir }}/{{ mysql.config.apparmor.file }}
+ - onlyif: test -d {{ mysql.config.apparmor.dir }}
+ - makedirs: True
+ - text:
+ - '{{ mysql.config.sections.mysqld.datadir }}/ r,'
+ - '{{ mysql.config.sections.mysqld.datadir }}/** rwk,'
+
+{%- endif %}
diff --git a/mysql/client.sls b/mysql/client.sls
index e603352..927f170 100644
--- a/mysql/client.sls
+++ b/mysql/client.sls
@@ -1,9 +1,8 @@
include:
- - mysql.config
+ - .config
-{% from "mysql/defaults.yaml" import rawmap with context %}
-{%- set mysql = salt['grains.filter_by'](rawmap, grain='os', merge=salt['pillar.get']('mysql:lookup')) %}
+{%- from tpldir ~ "/map.jinja" import mysql with context %}
mysql:
pkg.installed:
- - name: {{ mysql.client }}
+ - name: {{ mysql.clientpkg }}
diff --git a/mysql/config.sls b/mysql/config.sls
index da140ab..440120e 100644
--- a/mysql/config.sls
+++ b/mysql/config.sls
@@ -1,83 +1,100 @@
-{% from "mysql/defaults.yaml" import rawmap with context %}
-{%- set mysql = salt['grains.filter_by'](rawmap, grain='os', merge=salt['pillar.get']('mysql:lookup')) %}
-{% set os_family = salt['grains.get']('os_family', None) %}
+{%- from tpldir ~ "/map.jinja" import mysql with context %}
+{%- set os_family = salt['grains.get']('os_family', None) %}
-{% if "config_directory" in mysql %}
+{%- if "config_directory" in mysql %}
mysql_config_directory:
file.directory:
- name: {{ mysql.config_directory }}
- {% if os_family in ['Debian', 'Gentoo', 'RedHat'] %}
+ {%- if os_family in ['Debian', 'Gentoo', 'RedHat'] %}
- user: root
- group: root
- mode: 755
- {% endif %}
+ {%- endif %}
- makedirs: True
-{% if "server_config" in mysql %}
+{%- if "server_config" in mysql %}
mysql_server_config:
file.managed:
- name: {{ mysql.config_directory + mysql.server_config.file }}
- template: jinja
- - source: salt://mysql/files/server.cnf
- {% if os_family in ['Debian', 'Gentoo', 'RedHat'] %}
+ - source: salt://{{ tpldir }}/files/server.cnf
+ {%- if os_family in ['Debian', 'Gentoo', 'RedHat'] %}
+ - context:
+ tpldir: {{ tpldir }}
- user: root
- group: root
- mode: 644
- {% endif %}
-{% endif %}
+ {%- endif %}
+ - require:
+ - file: mysql_config_directory
+{%- endif %}
-{% if "galera_config" in mysql %}
+{%- if "galera_config" in mysql %}
mysql_galera_config:
file.managed:
- name: {{ mysql.config_directory + mysql.galera_config.file }}
- template: jinja
- - source: salt://mysql/files/galera.cnf
- {% if os_family in ['Debian', 'Gentoo', 'RedHat'] %}
+ - source: salt://{{ tpldir }}/files/galera.cnf
+ {%- if os_family in ['Debian', 'Gentoo', 'RedHat'] %}
+ - context:
+ tpldir: {{ tpldir }}
- user: root
- group: root
- mode: 644
- {% endif %}
-{% endif %}
+ {%- endif %}
+ - require:
+ - file: mysql_config_directory
+{%- endif %}
-{% if "library_config" in mysql %}
+{%- if "library_config" in mysql %}
mysql_library_config:
file.managed:
- name: {{ mysql.config_directory + mysql.library_config.file }}
- template: jinja
- - source: salt://mysql/files/client.cnf
- {% if os_family in ['Debian', 'Gentoo', 'RedHat'] %}
+ - source: salt://{{ tpldir }}/files/client.cnf
+ {%- if os_family in ['Debian', 'Gentoo', 'RedHat'] %}
+ - context:
+ tpldir: {{ tpldir }}
- user: root
- group: root
- mode: 644
- {% endif %}
-{% endif %}
+ {%- endif %}
+ - require:
+ - file: mysql_config_directory
+{%- endif %}
-{% if "clients_config" in mysql %}
+{%- if "clients_config" in mysql %}
mysql_clients_config:
file.managed:
- name: {{ mysql.config_directory + mysql.clients_config.file }}
- template: jinja
- - source: salt://mysql/files/mysql-clients.cnf
- {% if os_family in ['Debian', 'Gentoo', 'RedHat'] %}
+ - source: salt://{{ tpldir }}/files/mysql-clients.cnf
+ {%- if os_family in ['Debian', 'Gentoo', 'RedHat'] %}
+ - context:
+ tpldir: {{ tpldir }}
- user: root
- group: root
- mode: 644
- {% endif %}
-{% endif %}
+ {%- endif %}
+ - require:
+ - file: mysql_config_directory
+{%- endif %}
-{% endif %}
+{%- endif %}
mysql_config:
file.managed:
- name: {{ mysql.config.file }}
- template: jinja
-{% if "config_directory" in mysql %}
- - source: salt://mysql/files/my-include.cnf
-{% else %}
- - source: salt://mysql/files/my.cnf
-{% endif %}
- {% if os_family in ['Debian', 'Gentoo', 'RedHat'] %}
+{%- if "config_directory" in mysql %}
+ - source: salt://{{ tpldir }}/files/my-include.cnf
+{%- else %}
+ - source: salt://{{ tpldir }}/files/my.cnf
+{%- endif %}
+ - context:
+ tpldir: {{ tpldir }}
+ {%- if os_family in ['Debian', 'Gentoo', 'RedHat'] %}
- user: root
- group: root
- mode: 644
- {% endif %}
+ {%- endif %}
diff --git a/mysql/database.sls b/mysql/database.sls
index 72106a9..0f9796e 100644
--- a/mysql/database.sls
+++ b/mysql/database.sls
@@ -1,30 +1,46 @@
-{% from "mysql/defaults.yaml" import rawmap with context %}
-{%- set mysql = salt['grains.filter_by'](rawmap, grain='os', merge=salt['pillar.get']('mysql:lookup')) %}
+{%- from tpldir ~ "/map.jinja" import mysql with context %}
-{% set mysql_root_user = salt['pillar.get']('mysql:server:root_user', 'root') %}
-{% set mysql_root_pass = salt['pillar.get']('mysql:server:root_password', salt['grains.get']('server_id')) %}
-{% set mysql_host = salt['pillar.get']('mysql:server:host', 'localhost') %}
-{% set db_states = [] %}
+{%- set mysql_root_user = salt['pillar.get']('mysql:server:root_user', 'root') %}
+{%- set mysql_root_pass = salt['pillar.get']('mysql:server:root_password', salt['grains.get']('server_id')) %}
+{%- set mysql_host = salt['pillar.get']('mysql:server:host', 'localhost') %}
+{%- set db_states = [] %}
-{% set mysql_salt_user = salt['pillar.get']('mysql:salt_user:salt_user_name', mysql_root_user) %}
-{% set mysql_salt_pass = salt['pillar.get']('mysql:salt_user:salt_user_password', mysql_root_pass) %}
+{%- set mysql_salt_user = salt['pillar.get']('mysql:salt_user:salt_user_name', mysql_root_user) %}
+{%- set mysql_salt_pass = salt['pillar.get']('mysql:salt_user:salt_user_password', mysql_root_pass) %}
include:
- - mysql.python
+ - .python
-{% for database in salt['pillar.get']('mysql:database', []) %}
-{% set state_id = 'mysql_db_' ~ loop.index0 %}
+{%- for database_obj in salt['pillar.get']('mysql:database', []) %}
+{%- set state_id = 'mysql_db_' ~ loop.index0 %}
+{%- if not database_obj %}{# in case database_obj == [] #}
+{%- continue %}
+{%- elif database_obj is mapping %}
+{%- set database = database_obj.get('name') %}
+{%- set present = database_obj.get('present', True) %}
+{%- else %}
+{%- set database = database_obj %}
+{%- set present = True %}
+{%- endif %}
{{ state_id }}:
+ {%- if present %}
mysql_database.present:
+ {%- if database_obj is mapping %}
+ - character_set: {{ database_obj.get('character_set', '') }}
+ - collate: {{ database_obj.get('collate', '') }}
+ {%- endif %}
+ {%- else %}
+ mysql_database.absent:
+ {%- endif %}
- name: {{ database }}
- connection_host: '{{ mysql_host }}'
- connection_user: '{{ mysql_salt_user }}'
- {% if mysql_salt_pass %}
+ {%- if mysql_salt_pass %}
- connection_pass: '{{ mysql_salt_pass }}'
- {% endif %}
+ {%- endif %}
- connection_charset: utf8
-{% if salt['pillar.get'](['mysql', 'schema', database, 'load']|join(':'), False) %}
+{%- if salt['pillar.get'](['mysql', 'schema', database, 'load']|join(':'), False) %}
{{ state_id }}_schema:
file.managed:
- name: /etc/mysql/{{ database }}.schema
@@ -34,17 +50,17 @@ include:
{%- if template_type %}
- template: {{ template_type }}
- context: {{ template_context|yaml }}
-{% endif %}
+{%- endif %}
- user: {{ salt['pillar.get']('mysql:server:user', 'mysql') }}
- makedirs: True
{{ state_id }}_load:
cmd.wait:
- - name: mysql -u {{ mysql_salt_user }} -h{{ mysql_host }} -p{{ mysql_salt_pass }} {{ database }} < /etc/mysql/{{ database }}.schema
+ - name: mysql -u {{ mysql_salt_user }} -h{{ mysql_host }} {% if mysql_salt_pass %}-p{%- endif %}{{ mysql_salt_pass }} {{ database }} < /etc/mysql/{{ database }}.schema
- watch:
- file: {{ state_id }}_schema
- mysql_database: {{ state_id }}
-{% endif %}
+{%- endif %}
-{% do db_states.append(state_id) %}
-{% endfor %}
+{%- do db_states.append(state_id) %}
+{%- endfor %}
diff --git a/mysql/defaults.yaml b/mysql/defaults.yaml
index e17e7eb..83f556d 100644
--- a/mysql/defaults.yaml
+++ b/mysql/defaults.yaml
@@ -1,410 +1,119 @@
-# vim: sts=2 ts=2 sw=2 et ai
-#
-# SET ALL PARAMS IN CONFIG SECTION USING UNDERSCORE, NOT HYPHEN
-# so that it works correctly
-{% load_yaml as rawmap %}
-Ubuntu:
- server: mysql-server
- client: mysql-client
+# -*- coding: utf-8 -*-
+# vim: ft=yaml
+---
+mysql:
+ serverpkg: mysql-server
+ clientpkg: mysql-client
service: mysql
- python: python-mysqldb
+ devpkg: mysql-devel
debconf_utils: debconf-utils
- dev: libmysqlclient-dev
+
config:
file: /etc/mysql/my.cnf
sections:
client:
port: 3306
socket: /var/run/mysqld/mysqld.sock
- mysqld_safe:
- socket: /var/run/mysqld/mysqld.sock
- nice: 0
+ mysqld_safe: {}
mysqld:
user: mysql
- pid_file: /var/run/mysqld/mysqld.pid
socket: /var/run/mysqld/mysqld.sock
port: 3306
- basedir: /usr
datadir: /var/lib/mysql
- tmpdir: /tmp
- lc_messages_dir: /usr/share/mysql
- skip_external_locking: noarg_present
- bind_address: 127.0.0.1
- key_buffer_size: 16M
- max_allowed_packet: 16M
- thread_stack: 192K
- thread_cache_size: 8
- query_cache_limit: 1M
- query_cache_size: 16M
- log_error: /var/log/mysql/error.log
- expire_logs_days: 10
- max_binlog_size: 100M
- mysqldump:
- quick: noarg_present
- quote_names: noarg_present
- max_allowed_packet: 16M
- isamchk:
- key_buffer_size: 16M
- append: |
- !includedir /etc/mysql/conf.d/
-Debian:
- server: mysql-server
- client: mysql-client
- service: mysql
- python: python-mysqldb
- debconf_utils: debconf-utils
- dev: libmysqlclient-dev
- config:
- file: /etc/mysql/my.cnf
- sections:
- client:
- port: 3306
- socket: /var/run/mysqld/mysqld.sock
- mysqld_safe:
- socket: /var/run/mysqld/mysqld.sock
- nice: 0
- mysqld:
- user: mysql
- pid_file: /var/run/mysqld/mysqld.pid
- socket: /var/run/mysqld/mysqld.sock
- port: 3306
- basedir: /usr
- datadir: /var/lib/mysql
- tmpdir: /tmp
- lc_messages_dir: /usr/share/mysql
- skip_external_locking: noarg_present
- bind_address: 127.0.0.1
- key_buffer_size: 16M
- max_allowed_packet: 16M
- thread_stack: 192K
- thread_cache_size: 8
- query_cache_limit: 1M
- query_cache_size: 16M
- expire_logs_days: 10
- max_binlog_size: 100M
- innodb_flush_log_at_trx_commit: 1
- innodb_lock_wait_timeout: 50
- innodb_file_per_table: noarg_present
- mysqldump:
- quick: noarg_present
- quote_names: noarg_present
- max_allowed_packet: 16M
- isamchk:
- key_buffer_size: 16M
- append: |
- !includedir /etc/mysql/conf.d/
-CentOS:
- # https://mariadb.com/blog/rhel7-transition-mysql-mariadb-first-look
- {%- if salt['grains.get']('osmajorrelease') in ['7'] %}
- {% set mysql_engine = 'mariadb' %}
- {% set mysql_service = 'mariadb' %}
- {%- else %}
- {% set mysql_engine = 'mysql' %}
- {% set mysql_service = 'mysqld' %}
- {%- endif %}
+ apparmor:
+ dir: /etc/apparmor.d/local
+ file: usr.sbin.mysqld
- server: {{ mysql_engine }}-server
- service: {{ mysql_service }}
- client: {{ mysql_engine }}
- python: MySQL-python
- dev: {{ mysql_engine }}-devel
- config_directory: /etc/my.cnf.d/
- config:
- file: /etc/my.cnf
- server_config:
- file: server.cnf
- sections:
- mysqld_safe:
- log_error: /var/log/{{ mysql_engine }}/mysqld.log
- pid_file: /var/run/{{ mysql_engine }}/mysqld.pid
- mysqld:
- datadir: /var/lib/mysql
- socket: /var/lib/mysql/mysql.sock
- user: mysql
- port: 3306
- bind_address: 127.0.0.1
- symbolic_links: 0
-RedHat:
- # https://mariadb.com/blog/rhel7-transition-mysql-mariadb-first-look
- {%- if salt['grains.get']('osmajorrelease') in ['7'] %}
- {% set mysql_engine = 'mariadb' %}
- {% set mysql_service = 'mariadb' %}
- {%- else %}
- {% set mysql_engine = 'mysql' %}
- {% set mysql_service = 'mysqld' %}
- {%- endif %}
+ macos:
+ userhomes: /Users
+ # `user` and `group` are set from `map.jinja`
+ # user: ~
+ # group: ~
+ dl:
+ tmpdir: /tmp/mysqltmp
+ prefix: /usr/local
+ opts: -s -L
+ interval: 60
+ retries: 2
+ products:
+ community_server:
+ enabled: true
+ # yamllint disable-line rule:line-length
+ url: https://downloads.mysql.com/archives/get/file/mysql-8.0.11-macos10.13-x86_64.dmg
+ sum: 'md5=602a84390ecf3d82025b1d99fc594124'
+ isapp: false
+ path: /usr/local/mysql
+ app: mysql
+ workbench:
+ enabled: true
+ # yamllint disable-line rule:line-length
+ url: https://downloads.mysql.com/archives/get/file/mysql-workbench-community-8.0.11-rc-macos-x86_64.dmg
+ sum: 'md5=37c5ae5bd75a4e1804ae6e0127d68611'
+ isapp: true
+ path: /Applications/MySQLWorkbench/Contents/Versions/latest
+ app: MySQLWorkbench
+ cluster:
+ enabled: false
+ # yamllint disable-line rule:line-length
+ url: https://downloads.mysql.com/archives/get/file/mysql-cluster-gpl-7.6.6-macos10.13-x86_64.dmg
+ sum: 'md5=0df975908e7d8e4e8c1003d95edf4721'
+ isapp: false
+ path: /usr/local/mysqlcluster
+ app: MySQLCluster
+ router:
+ enabled: false
+ # yamllint disable-line rule:line-length
+ url: https://downloads.mysql.com/archives/get/file/mysql-router-8.0.11-macos10.13-x86-64bit.dmg
+ sum: 'md5=8dd536f2f223933ecbfb8b19e54ee2f6'
+ isapp: false
+ app: MySQLRouter
+ utilities:
+ enabled: false
+ # yamllint disable-line rule:line-length
+ url: https://downloads.mysql.com/archives/get/file/mysql-utilities-1.6.5-macos10.12.dmg
+ sum: 'md5=4c8e75bb217b8293dcdeb915b649c2c8'
+ isapp: true ## ??
+ app: MySQLUtilties
+ shell:
+ enabled: false
+ # yamllint disable-line rule:line-length
+ url: https://downloads.mysql.com/archives/get/file/mysql-shell-8.0.11-macos10.13-x86-64bit.dmg
+ sum: 'md5=43db4f0fc39f88c1d7be4a4f52cec363'
+ isapp: true ## ??
+ app: MySQLShell
+ proxy:
+ enabled: false
+ # yamllint disable-line rule:line-length
+ url: https://downloads.mysql.com/archives/get/file/mysql-proxy-0.8.5-osx10.7-x86-32bit.tar.gz
+ sum: 'md5=107df22412aa8c483d2021e1af24ee22'
+ connector:
+ enabled: false
+ # yamllint disable-line rule:line-length
+ url: https://downloads.mysql.com/archives/get/file/mysql-connector-nodejs-8.0.11.tar.gz
+ sum: 'md5=dece7fe5607918ba68499ef07c31508d'
+ forvisualstudio:
+ enabled: false
+ # yamllint disable-line rule:line-length
+ url: https://downloads.mysql.com/archives/get/file/mysql-for-visualstudio-2.0.4-src.zip
+ sum: 'md5=fcf39316505ee2921e31a431eae77a9c'
+ forexcel:
+ enabled: false
+ # yamllint disable-line rule:line-length
+ url: https://downloads.mysql.com/archives/get/file/mysql-for-excel-1.3.6-src.zip
+ sum: 'md5=2cc8b65eb72a1b07a6e4e2665e2a29e3'
+ notifier:
+ enabled: false
+ # yamllint disable-line rule:line-length
+ url: https://downloads.mysql.com/archives/get/file/mysql-notifier-1.1.6-src.zip
+ sum: 'md5=349f1994681763fd6626a8ddf6be5363'
- server: {{ mysql_engine }}-server
- service: {{ mysql_service }}
- client: {{ mysql_engine }}
- python: MySQL-python
- dev: {{ mysql_engine }}-devel
- config:
- file: /etc/my.cnf
- sections:
- mysqld_safe:
- log_error: /var/log/{{ mysql_engine }}/mysqld.log
- pid_file: /var/run/{{ mysql_engine }}/mysqld.pid
- mysqld:
- datadir: /var/lib/mysql
- socket: /var/lib/mysql/mysql.sock
- user: mysql
- port: 3306
- bind_address: 127.0.0.1
- symbolic_links: 0
-Fedora:
- server: mariadb-server
- client: mariadb
- service: mariadb
- python: python2-mysql
- config_directory: /etc/my.cnf.d/
- config:
- file: /etc/my.cnf
- server_config:
- file: server.cnf
- sections:
- mysqld_safe:
- log_error: /var/log/mysqld.log
- pid_file: /var/run/mysqld/mysqld.pid
- mysqld:
- datadir: /var/lib/mysql
- socket: /var/lib/mysql/mysql.sock
- user: mysql
- port: 3306
- bind_address: 127.0.0.1
- symbolic_links: 0
- galera_config:
- file: galera.cnf
- sections:
- mysqld:
- binlog_format: ROW
- default-storage-engine: innodb
- innodb_autoinc_lock_mode: 2
- bind-address: 0.0.0.0
- wsrep_provider: /usr/lib64/galera/libgalera_smm.so
- wsrep_cluster_name: "my_wsrep_cluster"
- wsrep_slave_threads: 1
- wsrep_certify_nonPK: 1
- wsrep_max_ws_rows: 131072
- wsrep_max_ws_size: 1073741824
- wsrep_debug: 0
- wsrep_convert_LOCK_to_trx: 0
- wsrep_retry_autocommit: 1
- wsrep_auto_increment_control: 1
- wsrep_drupal_282555_workaround: 0
- wsrep_causal_reads: 0
- wsrep_sst_method: rsync
- wsrep_sst_auth: "root:"
-
-openSUSE:
- server: mariadb
- client: mariadb-client
- service: mysql
- python: python-MySQL-python
- config:
- file: /etc/my.cnf
- sections:
- client:
- port: 3306
- socket: /var/run/mysql/mysql.sock
- mysqld:
- innodb_file_format: Barracuda
- innodb_file_per_table: ON
- server-id: 1
- sql_mode: NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
- mysqld_multi:
- mysqld: /usr/bin/mysqld_safe
- mysqladmin: /usr/bin/mysqladmin
- log: /var/log/mysqld_multi.log
- append: |
- !includedir /etc/my.cnf.d
-
-Arch:
- server: mariadb
- client: mariadb-clients
- service: mysqld
- python: mysql-python
- config:
- file: /etc/mysql/my.cnf
- sections:
- client:
- port: 3306
- socket: /run/mysqld/mysqld.sock
-
- mysqld:
- datadir: /var/lib/mysql
- socket: /run/mysqld/mysqld.sock
- user: mysql
- port: 3306
- symbolic_links: 0
- log-bin: mysql-bin
- key_buffer_size: 16M
- max_allowed_packet: 1M
- table_open_cache: 64
- sort_buffer_size: 512K
- net_buffer_length: 8K
- read_buffer_size: 256K
- read_rnd_buffer_size: 512K
- myisam_sort_buffer_size: 8M
- binlog_format: mixed
- server-id: 1
- skip-external-locking: noarg_present
-
- mysqldump:
- max_allowed_packet: 16M
- quick: noarg_present
-
- mysql:
- no-auto-rehash: noarg_present
-
- myisamchk:
- key_buffer_size: 20M
- sort_buffer_size: 20M
- read_buffer: 2M
- write_buffer: 2M
-
- mysqlhotcopy:
- interactive-timeout: noarg_present
-
-Amazon:
- server: mysql-server
- client: mysql
- service: mysqld
- python: MySQL-python
- dev: mysql-devel
- config:
- file: /etc/my.cnf
- sections:
- mysqld_safe:
- log_error: /var/log/mysqld.log
- pid_file: /var/run/mysqld/mysqld.pid
- mysqld:
- datadir: /var/lib/mysql
- socket: /var/lib/mysql/mysql.sock
- user: mysql
- port: 3306
- bind_address: 127.0.0.1
- symbolic_links: 0
-Gentoo:
- server: dev-db/mysql
- client: dev-db/mysql
- service: mysql
- python: dev-python/mysql-python
- dev: dev-db/mysqlced
- config:
- file: /etc/mysql/my.cnf
- sections:
- client:
- port: 3306
- socket: /var/run/mysqld/mysqld.sock
- mysql:
- character_sets_dir: /usr/share/mysql/charsets
- default_character_set: utf8
- mysqladmin:
- character_sets_dir: /usr/share/mysql/charsets
- default_character_set: utf8
- mysqlcheck:
- character_sets_dir: /usr/share/mysql/charsets
- default_character_set: utf8
- mysqldump:
- character_sets_dir: /usr/share/mysql/charsets
- default_character_set: utf8
- mysqlimport:
- character_sets_dir: /usr/share/mysql/charsets
- default_character_set: utf8
- mysqlshow:
- character_sets_dir: /usr/share/mysql/charsets
- default_character_set: utf8
- myisamchk:
- character_sets_dir: /usr/share/mysql/charsets
- key_buffer: 20M
- sort_buffer_size: 20M
- read_buffer: 2M
- write_buffer: 2M
- myisampack:
- character_sets_dir: /usr/share/mysql/charsets
- mysqld_safe:
- err_log: /var/log/mysql/mysql.err
- mysqld:
- character_set_server: utf8
- user: mysql
- port: 3306
- socket: /var/run/mysqld/mysqld.sock
- # note: on gentoo the init.d script specifically relies on the variable called pid-file, so don't use the underscore
- pid-file: /var/run/mysqld/mysqld.pid
- log_error: /var/log/mysql/mysqld.err
- basedir: /usr
- datadir: /var/lib/mysql
- skip_external_locking: noarg_present
- key_buffer_size: 16M
- max_allowed_packet: 1M
- table_open_cache: 64
- sort_buffer_size: 512K
- net_buffer_length: 8K
- read_buffer_size: 256K
- read_rnd_buffer_size: 512K
- myisam_sort_buffer_size: 8M
- language: /usr/share/mysql/english
- bind_address: 127.0.0.1
- log_bin: noarg_present
- server_id: 1
- tmpdir: /tmp/
- innodb_buffer_pool_size: 16M
- innodb_additional_mem_pool_size: 2M
- innodb_data_file_path: ibdata1:10M:autoextend:max:128M
- innodb_log_file_size: 5M
- innodb_log_buffer_size: 8M
- innodb_log_files_in_group: 2
- innodb_flush_log_at_trx_commit: 1
- innodb_lock_wait_timeout: 50
- innodb_file_per_table: noarg_present
- mysqldump:
- quick: noarg_present
- max_allowed_packet: 16M
- isamchk:
- key_buffer: 20M
- sort_buffer_size: 20M
- read_buffer: 2M
- write_buffer: 2M
- mysqlhotcopy:
- interactive_timeout: noarg_present
-FreeBSD:
- server: mysql56-server
- client: mysql56-client
- service: mysql-server
- python: pymysql
- dev: mysql56-server
- config:
- file: /usr/local/etc/my.cnf
- sections:
- client:
- port: 3306
- socket: /tmp/mysql.sock
- mysqld:
- port: 3306
- socket: /tmp/mysql.sock
- skip-external-locking: noarg_present
- key_buffer_size: 16M
- max_allowed_packet: 1M
- table_open_cache: 64
- sort_buffer_size: 512K
- net_buffer_length: 8K
- read_buffer_size: 256K
- read_rnd_buffer_size: 512K
- myisam_sort_buffer_size: 8M
- log-bin: mysql-bin
- binlog_format: mixed
- server-id: 1
- mysqldump:
- quick: noarg_present
- max_allowed_packet: 16M
- mysql:
- no-auto-rehash: noarg_present
- myisamchk:
- key_buffer_size: 20M
- sort_buffer_size: 20M
- read_buffer: 2M
- write_buffer: 2M
- mysqlhotcopy:
- interactive-timeout: noarg_present
-{% endload %}
+ # The following dict names are reserved for pillar data (see pillar.example)
+ global: {}
+ clients: {}
+ library: {}
+ server: {}
+ salt_user: {}
+ database: {}
+ schema: {}
+ user: {}
+ dev: {}
diff --git a/mysql/dev.sls b/mysql/dev.sls
index e111b70..4f7e19f 100644
--- a/mysql/dev.sls
+++ b/mysql/dev.sls
@@ -1,7 +1,6 @@
-{% from "mysql/defaults.yaml" import rawmap with context %}
-{%- set mysql = salt['grains.filter_by'](rawmap, grain='os', merge=salt['pillar.get']('mysql:server:lookup')) %}
+{%- from tpldir ~ "/map.jinja" import mysql with context %}
mysql_dev:
pkg:
- installed
- - name: {{ mysql.dev }}
+ - name: {{ mysql.devpkg }}
diff --git a/mysql/disabled.sls b/mysql/disabled.sls
index ddcea6f..7466d47 100644
--- a/mysql/disabled.sls
+++ b/mysql/disabled.sls
@@ -1,5 +1,4 @@
-{% from "mysql/defaults.yaml" import rawmap with context %}
-{%- set mysql = salt['grains.filter_by'](rawmap, grain='os', merge=salt['pillar.get']('mysql:server:lookup')) %}
+{%- from tpldir ~ "/map.jinja" import mysql with context %}
mysql:
service.dead:
diff --git a/mysql/files/client.cnf b/mysql/files/client.cnf
index 0dee293..292ec1e 100644
--- a/mysql/files/client.cnf
+++ b/mysql/files/client.cnf
@@ -4,15 +4,14 @@
{#-
===== FETCH DATA =====
-#}
-{%- from "mysql/defaults.yaml" import rawmap with context -%}
-{%- from "mysql/supported_sections.yaml" import supported_sections with context -%}
-{%- set datamap = salt['grains.filter_by'](rawmap, grain='os', merge=salt['pillar.get']('mysql:library:lookup')) -%}
+{% from tpldir ~ "/map.jinja" import mysql with context %}
+{%- from tpldir ~ "/supported_sections.yaml" import supported_sections with context -%}
{#-
===== COMBINE DATA =====
-#}
-{%- set goodParamList = datamap.library_config.sections -%}
+{%- set goodParamList = mysql.library_config.sections -%}
{%- for section_name in supported_sections -%}
- {%- set sectdict = datamap.library_config.sections[section_name] | default({}) -%}
+ {%- set sectdict = mysql.library_config.sections[section_name] | default({}) -%}
{%- for mparam, mvalue in salt['pillar.get']('mysql:library:'+section_name, {}).items() -%}
{%- set mparamUnderscore = mparam | replace('-','_') -%}
{%- do sectdict.update({mparamUnderscore:mvalue}) -%}
@@ -27,6 +26,7 @@
[{{ sname }}]
{%- for mparam, mvalue in sdata.items()|default([])|sort -%}
+{%- if mvalue is none %}{% continue %}{% endif -%}
{%- set indents = 40 - mparam|count %}
{% if mvalue == "noarg_present" -%}
{{ mparam }}
@@ -37,4 +37,4 @@
{%- endif -%}
{%- endfor %}
-{{ datamap.library_config.append | default('') }}
+{{ mysql.library_config.append | default('') }}
diff --git a/mysql/files/galera.cnf b/mysql/files/galera.cnf
index 982dafd..f3c154c 100644
--- a/mysql/files/galera.cnf
+++ b/mysql/files/galera.cnf
@@ -4,15 +4,14 @@
{#-
===== FETCH DATA =====
-#}
-{%- from "mysql/defaults.yaml" import rawmap with context -%}
-{%- from "mysql/supported_sections.yaml" import supported_sections with context -%}
-{%- set datamap = salt['grains.filter_by'](rawmap, grain='os', merge=salt['pillar.get']('mysql:galera:lookup')) -%}
+{% from tpldir ~ "/map.jinja" import mysql with context %}
+{%- from tpldir ~ "/supported_sections.yaml" import supported_sections with context -%}
{#-
===== COMBINE DATA =====
-#}
-{%- set goodParamList = datamap.galera_config.sections -%}
+{%- set goodParamList = mysql.galera_config.sections -%}
{%- for section_name in supported_sections -%}
- {%- set sectdict = datamap.galera_config.sections[section_name] | default({}) -%}
+ {%- set sectdict = mysql.galera_config.sections[section_name] | default({}) -%}
{%- for mparam, mvalue in salt['pillar.get']('mysql:galera:'+section_name, {}).items() -%}
{%- set mparamUnderscore = mparam | replace('-','_') -%}
{%- do sectdict.update({mparamUnderscore:mvalue}) -%}
@@ -27,6 +26,7 @@
[{{ sname }}]
{%- for mparam, mvalue in sdata.items()|default([])|sort -%}
+{%- if mvalue is none %}{% continue %}{% endif -%}
{%- set indents = 40 - mparam|count %}
{% if mvalue == "noarg_present" -%}
{{ mparam }}
@@ -39,4 +39,4 @@
{%- endif -%}
{%- endfor %}
-{{ datamap.galera_config.append | default('') }}
+{{ mysql.galera_config.append | default('') }}
diff --git a/mysql/files/mac_shortcut.sh b/mysql/files/mac_shortcut.sh
new file mode 100755
index 0000000..b65712c
--- /dev/null
+++ b/mysql/files/mac_shortcut.sh
@@ -0,0 +1,12 @@
+#!/usr/bin/env bash
+
+CMD='/usr/bin/osascript -e'
+
+if [[ -e "{{ home }}/{{ user }}/Desktop/{{ app }}" ]] && [[ "${1}" == "remove" ]]
+then
+ $CMD "tell application \"Finder\" to delete POSIX file \"{{home}}/{{user}}/Desktop/{{ app }}\""
+elif [[ -e "{{ dir }}/{{ app ~ '.app' if suffix else app }}" ]] && [[ "${1}" == "add" ]]
+then
+ $CMD "tell application \"Finder\" to delete POSIX file \"{{home}}/{{user}}/Desktop/{{ app }}\"" >/dev/null 2>&1
+ $CMD "tell application \"Finder\" to make new Alias at (path to desktop folder) to POSIX file \"{{ dir }}/{{ app }}{{ suffix or '' }}\""
+fi
diff --git a/mysql/files/my-include.cnf b/mysql/files/my-include.cnf
index 5e65b7c..2ea1102 100644
--- a/mysql/files/my-include.cnf
+++ b/mysql/files/my-include.cnf
@@ -4,16 +4,15 @@
{#-
===== FETCH DATA =====
-#}
-{%- from "mysql/defaults.yaml" import rawmap with context -%}
-{%- from "mysql/supported_sections.yaml" import supported_sections with context -%}
-{%- set datamap = salt['grains.filter_by'](rawmap, grain='os', merge=salt['pillar.get']('mysql:global:lookup')) -%}
+{% from tpldir ~ "/map.jinja" import mysql with context %}
+{%- from tpldir ~ "/supported_sections.yaml" import supported_sections with context -%}
{#-
===== COMBINE DATA =====
-#}
-{%- if "sections" in datamap.config -%}
-{%- set goodParamList = datamap.config.sections -%}
+{%- if "global_config" in mysql and "sections" in mysql.global_config -%}
+{%- set goodParamList = mysql.global_config.sections -%}
{%- for section_name in supported_sections -%}
- {%- set sectdict = datamap.config.sections[section_name] | default({}) -%}
+ {%- set sectdict = mysql.global_config.sections[section_name] | default({}) -%}
{%- for mparam, mvalue in salt['pillar.get']('mysql:global:'+section_name, {}).items() -%}
{%- set mparamUnderscore = mparam | replace('-','_') -%}
{%- do sectdict.update({mparamUnderscore:mvalue}) -%}
@@ -31,6 +30,7 @@
[{{ sname }}]
{%- for mparam, mvalue in sdata.items()|default([])|sort -%}
+{%- if mvalue is none %}{% continue %}{% endif -%}
{%- set indents = 40 - mparam|count %}
{% if mvalue == "noarg_present" -%}
{{ mparam }}
@@ -44,4 +44,4 @@
#
# include all files from the config directory
#
-!includedir {{ datamap.config_directory }}
+!includedir {{ mysql.config_directory }}
diff --git a/mysql/files/my.cnf b/mysql/files/my.cnf
index f36b633..08df151 100644
--- a/mysql/files/my.cnf
+++ b/mysql/files/my.cnf
@@ -4,15 +4,14 @@
{#-
===== FETCH DATA =====
-#}
-{%- from "mysql/defaults.yaml" import rawmap with context -%}
-{%- from "mysql/supported_sections.yaml" import supported_sections with context -%}
-{%- set datamap = salt['grains.filter_by'](rawmap, grain='os', merge=salt['pillar.get']('mysql:server:lookup')) -%}
+{% from tpldir ~ "/map.jinja" import mysql with context %}
+{%- from tpldir ~ "/supported_sections.yaml" import supported_sections with context -%}
{#-
===== COMBINE DATA =====
-#}
-{%- set goodParamList = datamap.config.sections -%}
+{%- set goodParamList = mysql.config.sections -%}
{%- for section_name in supported_sections -%}
- {%- set sectdict = datamap.config.sections[section_name] | default({}) -%}
+ {%- set sectdict = mysql.config.sections[section_name] | default({}) -%}
{%- for mparam, mvalue in salt['pillar.get']('mysql:server:'+section_name, {}).items() -%}
{%- set mparamUnderscore = mparam | replace('-','_') -%}
{%- do sectdict.update({mparamUnderscore:mvalue}) -%}
@@ -27,12 +26,14 @@
[{{ sname }}]
{%- for mparam, mvalue in sdata.items()|default([])|sort -%}
+{%- if mvalue is none %}{% continue %}{% endif -%}
{%- set indents = 40 - mparam|count %}
{% if mvalue == "noarg_present" -%}
{{ mparam }}
{%- else -%}
{%- if mvalue is iterable and mvalue is not string -%}
{%- for item in mvalue -%}
+{%- if item is none %}{% continue %}{% endif -%}
{{ mparam }}{{ '='|indent(indents, true) }} {{ item }}
{% endfor -%}
{%- else -%}
@@ -43,4 +44,4 @@
{%- endif -%}
{%- endfor %}
-{{ datamap.config.append | default('') }}
+{{ mysql.config.append | default('') }}
diff --git a/mysql/files/mysql-clients.cnf b/mysql/files/mysql-clients.cnf
index d56177a..345e049 100644
--- a/mysql/files/mysql-clients.cnf
+++ b/mysql/files/mysql-clients.cnf
@@ -4,15 +4,14 @@
{#-
===== FETCH DATA =====
-#}
-{%- from "mysql/defaults.yaml" import rawmap with context -%}
-{%- from "mysql/supported_sections.yaml" import supported_sections with context -%}
-{%- set datamap = salt['grains.filter_by'](rawmap, grain='os', merge=salt['pillar.get']('mysql:clients:lookup')) -%}
+{% from tpldir ~ "/map.jinja" import mysql with context %}
+{%- from tpldir ~ "/supported_sections.yaml" import supported_sections with context -%}
{#-
===== COMBINE DATA =====
-#}
-{%- set goodParamList = datamap.clients_config.sections -%}
+{%- set goodParamList = mysql.clients_config.sections -%}
{%- for section_name in supported_sections -%}
- {%- set sectdict = datamap.clients_config.sections[section_name] | default({}) -%}
+ {%- set sectdict = mysql.clients_config.sections[section_name] | default({}) -%}
{%- for mparam, mvalue in salt['pillar.get']('mysql:clients:'+section_name, {}).items() -%}
{%- set mparamUnderscore = mparam | replace('-','_') -%}
{%- do sectdict.update({mparamUnderscore:mvalue}) -%}
@@ -27,6 +26,7 @@
[{{ sname }}]
{%- for mparam, mvalue in sdata.items()|default([])|sort -%}
+{%- if mvalue is none %}{% continue %}{% endif -%}
{%- set indents = 40 - mparam|count %}
{% if mvalue == "noarg_present" -%}
{{ mparam }}
@@ -37,4 +37,4 @@
{%- endif -%}
{%- endfor %}
-{{ datamap.clients_config.append | default('') }}
+{{ mysql.clients_config.append | default('') }}
diff --git a/mysql/files/server.cnf b/mysql/files/server.cnf
index abd6b5b..b7d915b 100644
--- a/mysql/files/server.cnf
+++ b/mysql/files/server.cnf
@@ -4,15 +4,14 @@
{#-
===== FETCH DATA =====
-#}
-{%- from "mysql/defaults.yaml" import rawmap with context -%}
-{%- from "mysql/supported_sections.yaml" import supported_sections with context -%}
-{%- set datamap = salt['grains.filter_by'](rawmap, grain='os', merge=salt['pillar.get']('mysql:server:lookup')) -%}
+{% from tpldir ~ "/map.jinja" import mysql with context %}
+{%- from tpldir ~ "/supported_sections.yaml" import supported_sections with context -%}
{#-
===== COMBINE DATA =====
-#}
-{%- set goodParamList = datamap.server_config.sections -%}
+{%- set goodParamList = mysql.server_config.sections -%}
{%- for section_name in supported_sections -%}
- {%- set sectdict = datamap.server_config.sections[section_name] | default({}) -%}
+ {%- set sectdict = mysql.server_config.sections[section_name] | default({}) -%}
{%- for mparam, mvalue in salt['pillar.get']('mysql:server:'+section_name, {}).items() -%}
{%- set mparamUnderscore = mparam | replace('-','_') -%}
{%- do sectdict.update({mparamUnderscore:mvalue}) -%}
@@ -27,6 +26,7 @@
[{{ sname }}]
{%- for mparam, mvalue in sdata.items()|default([])|sort -%}
+{%- if mvalue is none %}{% continue %}{% endif -%}
{%- set indents = 40 - mparam|count %}
{% if mvalue == "noarg_present" -%}
{{ mparam }}
@@ -39,4 +39,4 @@
{%- endif -%}
{%- endfor %}
-{{ datamap.server_config.append | default('') }}
+{{ mysql.server_config.append | default('') }}
diff --git a/mysql/init.sls b/mysql/init.sls
index bc56035..3c3ee92 100644
--- a/mysql/init.sls
+++ b/mysql/init.sls
@@ -1,28 +1,32 @@
-{% from 'mysql/database.sls' import db_states with context %}
-{% from 'mysql/user.sls' import user_states with context %}
+{%- from tpldir ~ '/database.sls' import db_states with context %}
+{%- from tpldir ~ '/user.sls' import user_states with context %}
-{% macro requisites(type, states) %}
+{%- macro requisites(type, states) %}
{%- for state in states %}
- {{ type }}: {{ state }}
{%- endfor -%}
-{% endmacro %}
+{%- endmacro %}
-{% set mysql_dev = salt['pillar.get']('mysql:dev:install', False) %}
+{%- set mysql_dev = salt['pillar.get']('mysql:dev:install', False) %}
+{%- set mysql_salt_user = salt['pillar.get']('mysql:salt_user:salt_user_name', False) %}
include:
- - mysql.server
- - mysql.database
- - mysql.user
-{% if mysql_dev %}
- - mysql.dev
-{% endif %}
+ - .server
+{%- if mysql_salt_user %}
+ - .salt-user
+{%- endif %}
+ - .database
+ - .user
+{%- if mysql_dev %}
+ - .dev
+{%- endif %}
-{% if (db_states|length() + user_states|length()) > 0 %}
+{%- if (db_states|length() + user_states|length()) > 0 %}
extend:
- mysqld:
+ mysqld-service-running:
service:
- require_in:
{{ requisites('mysql_database', db_states) }}
{{ requisites('mysql_user', user_states) }}
-{% endif %}
+{%- endif %}
diff --git a/mysql/macos/init.sls b/mysql/macos/init.sls
new file mode 100644
index 0000000..dbe2ee1
--- /dev/null
+++ b/mysql/macos/init.sls
@@ -0,0 +1,3 @@
+
+include:
+ - mysql.macos.install
diff --git a/mysql/macos/install.sls b/mysql/macos/install.sls
new file mode 100644
index 0000000..be74678
--- /dev/null
+++ b/mysql/macos/install.sls
@@ -0,0 +1,96 @@
+### mysql/macos/install.sls
+# -*- coding: utf-8 -*-
+# vim: ft=yaml
+{%- from salt.file.dirname(tpldir) ~ "/map.jinja" import mysql with context %}
+
+ {%- set dl = mysql.macos.dl %}
+
+mysql-macos-extract-dirs:
+ file.directory:
+ - name: {{ dl.tmpdir }}
+ - makedirs: True
+
+ {%- for product, data in mysql.macos.products.items() if "enabled" in data and data.enabled %}
+ {%- set archivefile = data.url.split('/')[-1] %}
+ {%- set archiveformat = archivefile.split('.')[-1] %}
+ {%- set archivename = archivefile|replace('.dmg', '')|replace('.tar.gz', '')|replace('.zip', '') %}
+
+mysql-macos-download-{{ product }}-archive:
+ pkg.installed:
+ - name: curl
+ cmd.run:
+ - name: curl {{ dl.opts }} -o {{ dl.tmpdir }}/{{ archivefile }} {{ data.url }}
+ - unless: test -f {{ dl.tmpdir }}/{{ archivefile }}
+ {%- if grains['saltversioninfo'] >= [2017, 7, 0] %}
+ - retry:
+ attempts: {{ dl.retries }}
+ interval: {{ dl.interval }}
+ until: True
+ splay: 10
+ {%- endif %}
+ - require:
+ - mysql-macos-extract-dirs
+
+ {%- if data.sum %}
+mysql-macos-check-{{ product }}-archive-hash:
+ module.run:
+ - name: file.check_hash
+ - path: {{ dl.tmpdir }}/{{ archivefile }}
+ - file_hash: {{ data.sum }}
+ - require:
+ - cmd: mysql-macos-download-{{ product }}-archive
+ - require_in:
+ - mysql-macos-{{ product }}-install
+ {%- endif %}
+
+mysql-macos-{{ product }}-install:
+ {%- if archiveformat in ("dmg",) %}
+
+ macpackage.installed:
+ - name: "{{ dl.tmpdir }}/{{ archivefile }}"
+ - dmg: True
+ - app: {{ 'True' if "isapp" not in data else data.isapp }}
+ - force: True
+ - allow_untrusted: True
+ - onchanges:
+ - mysql-macos-download-{{ product }}-archive
+
+ {%- elif archiveformat in ("gz", "zip",) %}
+
+ archive.extracted:
+ - source: file://{{ dl.tmpdir }}{{ archivefile }}
+ - name: {{ dl.prefix }}/{{ archivename }}
+ - trim_output: True
+ - source_hash: {{ data.sum }}
+ - onchanges:
+ - mysql-macos-download-{{ product }}-archive
+ {%- endif %}
+
+ {%- if "path" in data and data.path and "app" in data and data.app %}
+
+mysql-macos-append-{{ product }}-path-to-bash-profile:
+ file.append:
+ - name: {{ mysql.macos.userhomes }}/{{ mysql.macos.user }}/.bash_profile
+ - text: 'export PATH=$PATH:{{ data.path }}/bin'
+ - onlyif: test -d {{ data.path }}/bin
+
+mysql-macos-{{ product }}-desktop-shortcut-add:
+ file.managed:
+ - name: /tmp/mac_shortcut.sh
+ - source: salt://mysql/files/mac_shortcut.sh
+ - mode: 755
+ - template: jinja
+ - context:
+ user: {{ mysql.macos.user }}
+ home: {{ mysql.macos.userhomes }}
+ app: {{ data.app }}
+ dir: {{ '/Applications' if "isapp" in data and data.isapp else dl.prefix ~ '/' ~ archivename ~ '/bin' }}
+ suffix: {{ '.app' if "isapp" in data and data.isapp else '' }}
+ cmd.run:
+ - name: /tmp/mac_shortcut.sh add
+ - runas: {{ mysql.macos.user }}
+ - require:
+ - file: mysql-macos-{{ product }}-desktop-shortcut-add
+
+ {%- endif %}
+ {%- endfor %}
diff --git a/mysql/macos/remove.sls b/mysql/macos/remove.sls
new file mode 100644
index 0000000..d81f2ad
--- /dev/null
+++ b/mysql/macos/remove.sls
@@ -0,0 +1,55 @@
+### mysql/macos/remove.sls
+# -*- coding: utf-8 -*-
+# vim: ft=yaml
+{%- from salt.file.dirname(tpldir) ~ "/map.jinja" import mysql with context -%}
+
+ {%- set dl = mysql.macos.dl %}
+ {%- for product, data in mysql.macos.products.items() if "app" in data and data.app and "url" in data and data.url %}
+ {%- set archivename = data.url.split('/')[-1]|replace('.dmg', '')|replace('.tar.gz', '')|replace('.zip', '') %}
+
+mysql-macos-{{ product }}-remove-destdir:
+ file.absent:
+ - names:
+ - {{ '/Applications' ~ data.app ~ '.app' if "isapp" in data and data.isapp else dl.prefix ~ '/' ~ archivename }}
+
+mysql-macos-{{ product }}-desktop-shortcut-remove:
+ file.managed:
+ - name: /tmp/mac_shortcut.sh
+ - source: salt://mysql/files/mac_shortcut.sh
+ - mode: 755
+ - template: jinja
+ - context:
+ user: {{ mysql.macos.user }}
+ home: {{ mysql.macos.userhomes }}
+ app: {{ data.app }}
+ dir: {{ '/Applications' if "isapp" in data and data.isapp else dl.prefix ~ '/' ~ archivename ~ '/bin' }}
+ suffix: {{ '.app' if "isapp" in data and data.isapp else '' }}
+ cmd.run:
+ - name: /tmp/mac_shortcut.sh remove
+ - runas: {{ mysql.macos.user }}
+ - require:
+ - file: mysql-macos-{{ product }}-desktop-shortcut-remove
+
+ {%- endfor %}
+
+##https://apple.stackexchange.com/questions/230333/how-could-i-remove-mysql-from-manually-installation-version
+##https://community.jaspersoft.com/wiki/uninstall-mysql-mac-os-x
+mysql-macos-remove-entry-in-/etc/hostconfig:
+ file.line:
+ - name: /etc/hostconfig
+ - mode: delete
+ - content: MYSQLCOM=-YES-
+ - onlyif: test -f /etc/hostconfig
+
+mysql-macos-remove-mysql-fully:
+ file.absent:
+ - names:
+ - {{ mysql.macos.dl.tmpdir }}
+ - /usr/local/mysql*
+ - /Library/PreferencePanes/MySQL.prefPane
+ - /Library/StartupItems/MySQLCOM
+ - /Library/Receipts/mysql*
+ - /Library/Receipts/MySQL*
+ - /private/var/db/receipts/*mysql*
+ - /Library/LaunchDaemons/com.oracle.oss.mysql.*
+
diff --git a/mysql/map.jinja b/mysql/map.jinja
new file mode 100644
index 0000000..f4351ac
--- /dev/null
+++ b/mysql/map.jinja
@@ -0,0 +1,61 @@
+# -*- coding: utf-8 -*-
+# vim: ft=jinja
+
+{#- Get the `tplroot` from `tpldir` #}
+{%- set tplroot = tpldir.split('/')[0] %}
+{#- Start imports as #}
+{%- import_yaml tplroot ~ "/defaults.yaml" as default_settings %}
+{%- import_yaml tplroot ~ "/osfamilymap.yaml" as osfamilymap %}
+{%- import_yaml tplroot ~ "/osmap.yaml" as osmap %}
+{%- import_yaml tplroot ~ "/osfingermap.yaml" as osfingermap %}
+
+{#- Retrieve the config dict only once #}
+{%- set _config = salt['config.get'](tplroot, default={}) %}
+
+{%- set py_ver_settings = {
+ 2: {'pythonpkg': 'python-mysqldb'},
+ 3: {'pythonpkg': 'python3-mysqldb'},
+ } %}
+
+{%- set defaults = salt['grains.filter_by'](
+ py_ver_settings,
+ default=grains.pythonversion[0],
+ merge=salt['grains.filter_by'](
+ default_settings,
+ default=tplroot,
+ merge=salt['grains.filter_by'](
+ osfamilymap,
+ grain='os_family',
+ merge=salt['grains.filter_by'](
+ osmap,
+ grain='os',
+ merge=salt['grains.filter_by'](
+ osfingermap,
+ grain='osfinger',
+ merge=salt['grains.filter_by'](
+ _config,
+ default='lookup'
+ )
+ )
+ )
+ )
+ )
+ )
+%}
+
+{%- set config = salt['grains.filter_by'](
+ {'defaults': defaults},
+ default='defaults',
+ merge=_config
+ )
+%}
+
+{%- set mysql = config %}
+
+{#- Post-processing for specific non-YAML customisations #}
+{%- if grains.os == 'MacOS' %}
+{%- set macos_user = salt['pillar.get']('mysql:user', salt['cmd.run']("stat -f '%Su' /dev/console")) %}
+{%- set macos_group = salt['pillar.get']('mysql:group', salt['cmd.run']("stat -f '%Sg' /dev/console")) %}
+{%- do mysql.macos.update({'user': macos_user}) %}
+{%- do mysql.macos.update({'group': macos_group}) %}
+{%- endif %}
diff --git a/mysql/osfamilymap.yaml b/mysql/osfamilymap.yaml
new file mode 100644
index 0000000..2ddb339
--- /dev/null
+++ b/mysql/osfamilymap.yaml
@@ -0,0 +1,248 @@
+# -*- coding: utf-8 -*-
+# vim: ft=yaml
+---
+Debian:
+ devpkg: libmysqlclient-dev
+
+ config:
+ sections:
+ mysqld_safe:
+ socket: /var/run/mysqld/mysqld.sock
+ nice: 0
+ mysqld:
+ pid_file: /var/run/mysqld/mysqld.pid
+ basedir: /usr
+ tmpdir: /tmp
+ lc_messages_dir: /usr/share/mysql
+ skip_external_locking: noarg_present
+ bind_address: 127.0.0.1
+ key_buffer_size: 16M
+ max_allowed_packet: 16M
+ thread_stack: 192K
+ thread_cache_size: 8
+ expire_logs_days: 10
+ max_binlog_size: 100M
+ # innodb_flush_log_at_trx_commit: 1
+ # innodb_lock_wait_timeout: 50
+ # innodb_file_per_table: noarg_present
+ mysqldump:
+ quick: noarg_present
+ quote_names: noarg_present
+ max_allowed_packet: 16M
+ isamchk:
+ key_buffer_size: 16M
+ append: |
+ !includedir /etc/mysql/conf.d/
+
+RedHat:
+ service: mysqld
+ clientpkg: mysql
+ pythonpkg: MySQL-python
+ config:
+ file: /etc/my.cnf
+ sections:
+ client: {}
+ mysqld_safe:
+ log_error: /var/log/mysql/mysqld.log
+ pid_file: /var/run/mysql/mysqld.pid
+ mysqld:
+ socket: /var/lib/mysql/mysql.sock
+ bind_address: 127.0.0.1
+ symbolic_links: 0
+
+Suse:
+ serverpkg: mariadb
+ clientpkg: mariadb-client
+ pythonpkg: python3-PyMySQL
+
+ config:
+ file: /etc/my.cnf
+ sections:
+ client:
+ socket: /run/mysql/mysql.sock
+ mysqld:
+ # Empty values below to be resolved, disabling the rule in the meantime
+ # yamllint disable rule:empty-values
+ port:
+ user:
+ socket:
+ datadir:
+ tmpdir:
+ # yamllint enable rule:empty-values
+ innodb_file_format: Barracuda
+ innodb_file_per_table: 'ON'
+ server-id: 1
+ sql_mode: NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
+ mysqld_multi:
+ mysqld: /usr/bin/mysqld_safe
+ mysqladmin: /usr/bin/mysqladmin
+ log: /var/log/mysqld_multi.log
+ append: |
+ !includedir /etc/my.cnf.d
+
+Arch:
+ serverpkg: mariadb
+ clientpkg: mariadb-clients
+ service: mysqld
+ pythonpkg: mysql-python
+ # Empty value below to be resolved, disabling the rule in the meantime
+ # yamllint disable-line rule:empty-values
+ dev:
+
+ config:
+ sections:
+ client:
+ socket: /run/mysqld/mysqld.sock
+ mysqld:
+ datadir: /var/lib/mysql
+ socket: /run/mysqld/mysqld.sock
+ symbolic_links: 0
+ log-bin: mysql-bin
+ key_buffer_size: 16M
+ max_allowed_packet: 1M
+ table_open_cache: 64
+ sort_buffer_size: 512K
+ net_buffer_length: 8K
+ read_buffer_size: 256K
+ read_rnd_buffer_size: 512K
+ myisam_sort_buffer_size: 8M
+ binlog_format: mixed
+ server-id: 1
+ skip-external-locking: noarg_present
+
+ mysqldump:
+ max_allowed_packet: 16M
+ quick: noarg_present
+
+ mysql:
+ no-auto-rehash: noarg_present
+
+ myisamchk:
+ key_buffer_size: 20M
+ sort_buffer_size: 20M
+ read_buffer: 2M
+ write_buffer: 2M
+
+ mysqlhotcopy:
+ interactive-timeout: noarg_present
+
+Gentoo:
+ serverpkg: dev-db/mysql
+ clientpkg: dev-db/mysql
+ pythonpkg: dev-python/mysql-python
+ devpkg: dev-db/mysqlced
+
+ config:
+ sections:
+ mysql:
+ character_sets_dir: /usr/share/mysql/charsets
+ default_character_set: utf8
+ mysqladmin:
+ character_sets_dir: /usr/share/mysql/charsets
+ default_character_set: utf8
+ mysqlcheck:
+ character_sets_dir: /usr/share/mysql/charsets
+ default_character_set: utf8
+ mysqldump:
+ character_sets_dir: /usr/share/mysql/charsets
+ default_character_set: utf8
+ quick: noarg_present
+ max_allowed_packet: 16M
+ mysqlimport:
+ character_sets_dir: /usr/share/mysql/charsets
+ default_character_set: utf8
+ mysqlshow:
+ character_sets_dir: /usr/share/mysql/charsets
+ default_character_set: utf8
+ myisamchk:
+ character_sets_dir: /usr/share/mysql/charsets
+ key_buffer: 20M ## ????? key_buffer_size ?
+ sort_buffer_size: 20M
+ read_buffer: 2M
+ write_buffer: 2M
+ myisampack:
+ character_sets_dir: /usr/share/mysql/charsets
+ mysqld_safe:
+ err_log: /var/log/mysql/mysql.err
+ mysqld:
+ character_set_serverpkg: utf8
+ # note: the gentoo init.d script specifically needs pid-file
+ # (dash not underscore)
+ pid-file: /var/run/mysqld/mysqld.pid
+ log_error: /var/log/mysql/mysqld.err
+ basedir: /usr
+ datadir: /var/lib/mysql
+ skip_external_locking: noarg_present
+ key_buffer_size: 16M
+ max_allowed_packet: 1M
+ table_open_cache: 64
+ sort_buffer_size: 512K
+ net_buffer_length: 8K
+ read_buffer_size: 256K
+ read_rnd_buffer_size: 512K
+ myisam_sort_buffer_size: 8M
+ language: /usr/share/mysql/english
+ bind_address: 127.0.0.1
+ log_bin: noarg_present
+ server_id: 1
+ tmpdir: /tmp
+ innodb_buffer_pool_size: 16M
+ innodb_additional_mem_pool_size: 2M
+ innodb_data_file_path: ibdata1:10M:autoextend:max:128M
+ innodb_log_file_size: 5M
+ innodb_log_buffer_size: 8M
+ innodb_log_files_in_group: 2
+ innodb_flush_log_at_trx_commit: 1
+ innodb_lock_wait_timeout: 50
+ innodb_file_per_table: noarg_present
+ isamchk:
+ key_buffer: 20M ## ????? key_buffer_size ?
+ sort_buffer_size: 20M
+ read_buffer: 2M
+ write_buffer: 2M
+ mysqlhotcopy:
+ interactive_timeout: noarg_present
+
+FreeBSD:
+ serverpkg: mysql57-server
+ clientpkg: mysql57-client
+ service: mysql-server
+ pythonpkg: py37-pymysql
+ devpkg: mysql57-server
+
+ config:
+ file: /usr/local/etc/mysql/my.cnf
+ sections:
+ client:
+ socket: /tmp/mysql.sock
+ mysqld:
+ # Empty values below to be resolved, disabling the rule in the meantime
+ # yamllint disable rule:empty-values
+ user:
+ datadir: /var/db/mysql
+ # yamllint enable rule:empty-values
+ socket: /tmp/mysql.sock
+ skip-external-locking: noarg_present
+ key_buffer_size: 16M
+ max_allowed_packet: 1M
+ table_open_cache: 64
+ sort_buffer_size: 512K
+ net_buffer_length: 8K
+ read_buffer_size: 256K
+ read_rnd_buffer_size: 512K
+ myisam_sort_buffer_size: 8M
+ log-bin: mysql-bin
+ binlog_format: mixed
+ server-id: 1
+ mysqldump:
+ quick: noarg_present
+ max_allowed_packet: 16M
+ mysql:
+ no-auto-rehash: noarg_present
+ myisamchk:
+ key_buffer_size: 20M
+ sort_buffer_size: 20M
+ read_buffer: 2M
+ write_buffer: 2M
+ mysqlhotcopy:
+ interactive-timeout: noarg_present
diff --git a/mysql/osfingermap.yaml b/mysql/osfingermap.yaml
new file mode 100644
index 0000000..9d98126
--- /dev/null
+++ b/mysql/osfingermap.yaml
@@ -0,0 +1,76 @@
+# -*- coding: utf-8 -*-
+# vim: ft=yaml
+---
+# Debian
+Debian-10:
+ serverpkg: mariadb-server
+ service: mariadb
+ clientpkg: mariadb-client
+ devpkg: libmariadbclient-dev
+ config:
+ append: |
+ !includedir /etc/mysql/conf.d/
+ # !includedir /etc/mysql/mariadb.conf.d/
+Debian-9:
+ serverpkg: mariadb-server
+ service: mariadb
+ clientpkg: mariadb-client
+ devpkg: libmariadbclient-dev
+ config:
+ append: |
+ !includedir /etc/mysql/conf.d/
+ # !includedir /etc/mysql/mariadb.conf.d/
+# Ubuntu
+Ubuntu-20.04:
+ serverpkg: mariadb-server
+ service: mariadb
+ clientpkg: mariadb-client
+ devpkg: libmariadbclient-dev
+ config:
+ append: |
+ !includedir /etc/mysql/conf.d/
+ # !includedir /etc/mysql/mariadb.conf.d/
+Ubuntu-18.04:
+ serverpkg: mariadb-server
+ # service: mariadb
+ clientpkg: mariadb-client
+ # devpkg: libmariadbclient-dev
+Ubuntu-16.04:
+ serverpkg: mariadb-server
+ # service: mariadb
+ clientpkg: mariadb-client
+ # devpkg: libmariadbclient-dev
+
+# Redhat
+Redhat-7:
+ # https://mariadb.com/blog/rhel7-transition-mysql-mariadb-first-look
+ serverpkg: mariadb-server
+ service: mariadb
+ clientpkg: mariadb
+ devpkg: mariadb-devel
+ config:
+ sections:
+ mysqld_safe:
+ log_error: /var/log/mariadb/mysqld.log
+ pid_file: /var/run/mariadb/mysqld.pid
+# CentOS
+CentOS Linux-7:
+ # https://mariadb.com/blog/rhel7-transition-mysql-mariadb-first-look
+ serverpkg: mariadb-server
+ service: mariadb
+ clientpkg: mariadb
+ devpkg: mariadb-devel
+ config:
+ sections:
+ mysqld_safe:
+ log_error: /var/log/mariadb/mysqld.log
+ pid_file: /var/run/mariadb/mysqld.pid
+ server_config:
+ sections:
+ mysqld_safe:
+ log_error: /var/log/mariadb/mysqld.log
+ pid_file: /var/run/mariadb/mysqld.pid
+
+# Suse
+Leap-42:
+ pythonpkg: python-PyMySQL
diff --git a/mysql/osmap.yaml b/mysql/osmap.yaml
new file mode 100644
index 0000000..c2cf746
--- /dev/null
+++ b/mysql/osmap.yaml
@@ -0,0 +1,73 @@
+# -*- coding: utf-8 -*-
+# vim: ft=yaml
+---
+Debian:
+ service: mysql
+
+Ubuntu:
+ service: mysql
+ devpkg: libmysqlclient-dev
+ config:
+ sections:
+ mysqld:
+ tmpdir: /tmp
+ log_error: /var/log/mysql/error.log
+ append: |
+ !includedir /etc/mysql/conf.d/
+
+CentOS:
+ config_directory: /etc/my.cnf.d/
+ server_config:
+ file: server.cnf
+ sections:
+ mysqld_safe:
+ log_error: /var/log/mysql/mysqld.log
+ pid_file: /var/run/mysql/mysqld.pid
+ mysqld:
+ socket: /var/lib/mysql/mysql.sock
+ bind_address: 127.0.0.1
+
+Fedora:
+ serverpkg: mariadb-server
+ clientpkg: mariadb
+ service: mariadb
+ pythonpkg: python2-mysql
+ config_directory: /etc/my.cnf.d/
+
+ server_config:
+ file: server.cnf
+ sections:
+ mysqld_safe:
+ log_error: /var/log/mariadb/mariadb.log
+ pid_file: /var/lib/mysql/mysql.pid
+ mysqld:
+ socket: /var/lib/mysql/mysql.sock
+ bind_address: 127.0.0.1
+
+ galera_config:
+ file: galera.cnf
+ sections:
+ mysqld:
+ bind-address: 0.0.0.0
+ binlog_format: ROW
+ default-storage-engine: innodb
+ innodb_autoinc_lock_mode: 2
+ wsrep_provider: /usr/lib64/galera/libgalera_smm.so
+ wsrep_cluster_name: "my_wsrep_cluster"
+ wsrep_slave_threads: 1
+ wsrep_certify_nonPK: 1
+ wsrep_max_ws_rows: 131072
+ wsrep_max_ws_size: 1073741824
+ wsrep_debug: 0
+ wsrep_convert_LOCK_to_trx: 0
+ wsrep_retry_autocommit: 1
+ wsrep_auto_increment_control: 1
+ wsrep_drupal_282555_workaround: 0
+ wsrep_causal_reads: 0
+ wsrep_sst_method: rsync
+ wsrep_sst_auth: "root:"
+
+Amazon:
+ clientpkg: mysql
+ service: mysqld
+ pythonpkg: MySQL-python
diff --git a/mysql/python.sls b/mysql/python.sls
index 9288fe3..736ecca 100644
--- a/mysql/python.sls
+++ b/mysql/python.sls
@@ -1,6 +1,6 @@
-{% from "mysql/defaults.yaml" import rawmap with context %}
-{%- set mysql = salt['grains.filter_by'](rawmap, grain='os', merge=salt['pillar.get']('mysql:server:lookup')) %}
+{%- from tpldir ~ "/map.jinja" import mysql with context %}
mysql_python:
pkg.installed:
- - name: {{ mysql.python }}
+ - name: {{ mysql.pythonpkg }}
+ - reload_modules: True
diff --git a/mysql/remove_test_database.sls b/mysql/remove_test_database.sls
index 9eca467..1286558 100644
--- a/mysql/remove_test_database.sls
+++ b/mysql/remove_test_database.sls
@@ -1,18 +1,19 @@
-{% set mysql_root_user = salt['pillar.get']('mysql:server:root_user', 'root') %}
-{% set mysql_root_pass = salt['pillar.get']('mysql:server:root_password', salt['grains.get']('server_id')) %}
-{% set mysql_host = salt['pillar.get']('mysql:server:host', 'localhost') %}
-{% set mysql_salt_user = salt['pillar.get']('mysql:salt_user:salt_user_name', mysql_root_user) %}
-{% set mysql_salt_pass = salt['pillar.get']('mysql:salt_user:salt_user_password', mysql_root_pass) %}
+{%- set mysql_root_user = salt['pillar.get']('mysql:server:root_user', 'root') %}
+{%- set mysql_root_pass = salt['pillar.get']('mysql:server:root_password', salt['grains.get']('server_id')) %}
+{%- set mysql_host = salt['pillar.get']('mysql:server:host', 'localhost') %}
+{%- set mysql_salt_user = salt['pillar.get']('mysql:salt_user:salt_user_name', mysql_root_user) %}
+{%- set mysql_salt_pass = salt['pillar.get']('mysql:salt_user:salt_user_password', mysql_root_pass) %}
include:
- - mysql.python
+ - .python
mysql remove test database:
mysql_database.absent:
- name: test
- host: '{{ mysql_host }}'
- connection_user: '{{ mysql_salt_user }}'
- {% if mysql_salt_pass %}
+ - connection_host: '{{ mysql_host }}'
+ {%- if mysql_salt_pass %}
- connection_pass: '{{ mysql_salt_pass }}'
- {% endif %}
+ {%- endif %}
- connection_charset: utf8
diff --git a/mysql/repo.sls b/mysql/repo.sls
index 7c84e7c..dde0099 100644
--- a/mysql/repo.sls
+++ b/mysql/repo.sls
@@ -1,27 +1,26 @@
include:
- - mysql.config
+ - .config
-{% from "mysql/defaults.yaml" import rawmap with context %}
-{%- set mysql = salt['grains.filter_by'](rawmap, grain='os', merge=salt['pillar.get']('mysql:lookup')) %}
+{%- from tpldir ~ "/map.jinja" import mysql with context %}
# Completely ignore non-RHEL based systems
# TODO: Add Debian and Suse systems.
# TODO: Allow user to specify MySQL version and alter yum repo file accordingly.
-{% if grains['os_family'] == 'RedHat' %}
- {% if grains['osmajorrelease'][0] == '5' %}
- {% set rpm_source = "http://repo.mysql.com/mysql57-community-release-el5.rpm" %}
- {% elif grains['osmajorrelease'][0] == '6' %}
- {% set rpm_source = "http://repo.mysql.com/mysql57-community-release-el6.rpm" %}
- {% elif grains['osmajorrelease'][0] == '7' %}
- {% set rpm_source = "http://repo.mysql.com/mysql57-community-release-el7.rpm" %}
- {% endif %}
-{% endif %}
+{%- if grains['os_family'] == 'RedHat' and 'osmajorrelease' in grains %}
+ {%- if grains['osmajorrelease']|int == 5 %}
+ {%- set rpm_source = "http://repo.mysql.com/mysql57-community-release-el5.rpm" %}
+ {%- elif grains['osmajorrelease']|int == 6 %}
+ {%- set rpm_source = "http://repo.mysql.com/mysql57-community-release-el6.rpm" %}
+ {%- elif grains['osmajorrelease']|int == 7 %}
+ {%- set rpm_source = "http://repo.mysql.com/mysql57-community-release-el7.rpm" %}
+ {%- endif %}
+{%- endif %}
-{% set mysql57_community_release = salt['pillar.get']('mysql:release', false) %}
+{%- set mysql57_community_release = salt['pillar.get']('mysql:release', false) %}
# A lookup table for MySQL Repo GPG keys & RPM URLs for various RedHat releases
- {% set pkg = {
+ {%- set pkg = {
'key': 'http://repo.mysql.com/RPM-GPG-KEY-mysql',
- 'key_hash': 'md5=e9efdf96207c90f4487462cd1f3ff764',
+ 'key_hash': 'md5=162ec8cb41add661b357e926a083b0cc',
'rpm': rpm_source
} %}
@@ -39,12 +38,12 @@ mysql57_community_release:
- require:
- file: install_pubkey_mysql
- require_in:
- {% if "server_config" in mysql %}
- - pkg: {{ mysql.server }}
- {% endif %}
- {% if "clients_config" in mysql %}
- - pkg: {{ mysql.client }}
- {% endif %}
+ {%- if "server_config" in mysql %}
+ - pkg: {{ mysql.serverpkg }}
+ {%- endif %}
+ {%- if "clients_config" in mysql %}
+ - pkg: {{ mysql.clientpkg }}
+ {%- endif %}
set_pubkey_mysql:
file.replace:
diff --git a/mysql/salt-user.sls b/mysql/salt-user.sls
index fadff43..8e88618 100644
--- a/mysql/salt-user.sls
+++ b/mysql/salt-user.sls
@@ -1,20 +1,20 @@
include:
- - mysql.server
+ - .server
-{% set os_family = salt['grains.get']('os_family', None) %}
-{% set mysql_salt_user = salt['pillar.get']('mysql:salt_user:salt_user_name', 'salt') %}
-{% set mysql_salt_pass = salt['pillar.get']('mysql:salt_user:salt_user_password', salt['grains.get']('server_id')) %}
-{% set mysql_salt_grants = salt['pillar.get']('mysql:salt_user:grants', []) %}
-{% set mysql_root_user = salt['pillar.get']('mysql:server:root_user', 'root') %}
-{% set mysql_root_pass = salt['pillar.get']('mysql:server:root_password', salt['grains.get']('server_id')) %}
-{% set mysql_root_hash = salt['pillar.get']('mysql:server:root_password_hash', None) %}
+{%- set os_family = salt['grains.get']('os_family', None) %}
+{%- set mysql_salt_user = salt['pillar.get']('mysql:salt_user:salt_user_name', 'salt') %}
+{%- set mysql_salt_pass = salt['pillar.get']('mysql:salt_user:salt_user_password', salt['grains.get']('server_id')) %}
+{%- set mysql_salt_grants = salt['pillar.get']('mysql:salt_user:grants', []) %}
+{%- set mysql_root_user = salt['pillar.get']('mysql:server:root_user', 'root') %}
+{%- set mysql_root_pass = salt['pillar.get']('mysql:server:root_password', salt['grains.get']('server_id')) %}
+{%- set mysql_root_hash = salt['pillar.get']('mysql:server:root_password_hash', None) %}
-{% set mysql_host = salt['pillar.get']('mysql:server:host', 'localhost') %}
-{% if mysql_host == 'localhost' %}
-{% set host = 'localhost' %}
-{% else %}
-{% set host = grains['fqdn'] %}
-{% endif %}
+{%- set mysql_host = salt['pillar.get']('mysql:server:host', 'localhost') %}
+{%- if mysql_host == 'localhost' %}
+{%- set host = 'localhost' %}
+{%- else %}
+{%- set host = grains['fqdn'] %}
+{%- endif %}
mysql_salt_user_with_salt_user:
mysql_user.present:
@@ -25,13 +25,13 @@ mysql_salt_user_with_salt_user:
- connection_user: '{{ mysql_salt_user }}'
- connection_pass: '{{ mysql_salt_pass }}'
- connection_charset: utf8
- - onlyif:
- - mysql --user {{ mysql_salt_user }} --password='{{ mysql_salt_pass|replace("'", "'\"'\"'") }}' -h {{ mysql_host }} --execute="SELECT 1;"
- - VALUE=$(mysql --user {{ mysql_salt_user }} --password='{{ mysql_salt_pass|replace("'", "'\"'\"'") }}' -ss -e "SELECT Grant_priv FROM mysql.user WHERE user = '{{ mysql_salt_user }}' AND host = '{{ host }}';"); if [ "$VALUE" = 'Y' ]; then /bin/true; else /bin/false; fi
-{% if os_family in ['RedHat', 'Suse'] %}
+ # - onlyif:
+ # - mysql --user {{ mysql_salt_user }} --password='{{ mysql_salt_pass|replace("'", "'\"'\"'") }}' -h {{ mysql_host }} --execute="SELECT 1;"
+ # - VALUE=$(mysql --user {{ mysql_salt_user }} --password='{{ mysql_salt_pass|replace("'", "'\"'\"'") }}' -ss -e "SELECT Grant_priv FROM mysql.user WHERE user = '{{ mysql_salt_user }}' AND host = '{{ host }}';"); if [ "$VALUE" = 'Y' ]; then /bin/true; else /bin/false; fi
+{%- if os_family in ['RedHat', 'Suse'] %}
- require_in:
- mysql_user: mysql_root_password
-{% endif %}
+{%- endif %}
{%- if mysql_salt_grants != [] %}
mysql_salt_user_with_salt_user_grants:
@@ -51,11 +51,11 @@ mysql_salt_user_with_salt_user_grants:
- VALUE=$(mysql --user {{ mysql_salt_user }} --password='{{ mysql_salt_pass|replace("'", "'\"'\"'") }}' -ss -e "SELECT Grant_priv FROM mysql.user WHERE user = '{{ mysql_salt_user }}' AND host = '{{ host }}';"); if [ "$VALUE" = 'Y' ]; then /bin/true; else /bin/false; fi
- require:
- mysql_user: mysql_salt_user_with_salt_user
-{% if os_family in ['RedHat', 'Suse'] %}
+{%- if os_family in ['RedHat', 'Suse'] %}
- require_in:
- mysql_user: mysql_root_password
-{% endif %}
-{% endif %}
+{%- endif %}
+{%- endif %}
mysql_salt_user_with_root_user:
mysql_user.present:
@@ -69,10 +69,10 @@ mysql_salt_user_with_root_user:
- onlyif:
- mysql --user {{ mysql_root_user }} --password='{{ mysql_root_pass|replace("'", "'\"'\"'") }}' -h {{ mysql_host }} --execute="SELECT 1;"
- VALUE=$(mysql --user {{ mysql_root_user }} --password='{{ mysql_root_pass|replace("'", "'\"'\"'") }}' -ss -e "SELECT Grant_priv FROM mysql.user WHERE user = '{{ mysql_salt_user }}' AND host = '{{ host }}';"); if [ "$VALUE" = 'N' -o -z "$VALUE" ]; then /bin/true; else /bin/false; fi
-{% if os_family in ['RedHat', 'Suse'] %}
+{%- if os_family in ['RedHat', 'Suse'] %}
- require_in:
- mysql_user: mysql_root_password
-{% endif %}
+{%- endif %}
{%- if mysql_salt_grants != [] %}
mysql_salt_user_with_root_user_grants:
@@ -92,11 +92,11 @@ mysql_salt_user_with_root_user_grants:
- VALUE=$(mysql --user {{ mysql_root_user }} --password='{{ mysql_root_pass|replace("'", "'\"'\"'") }}' -ss -e "SELECT Grant_priv FROM mysql.user WHERE user = '{{ mysql_salt_user }}' AND host = '{{ host }}';"); if [ "$VALUE" = 'N' -o -z "$VALUE" ]; then /bin/true; else /bin/false; fi
- require:
- mysql_user: mysql_salt_user_with_root_user
-{% if os_family in ['RedHat', 'Suse'] %}
+{%- if os_family in ['RedHat', 'Suse'] %}
- require_in:
- mysql_user: mysql_root_password
-{% endif %}
-{% endif %}
+{%- endif %}
+{%- endif %}
mysql_salt_user_with_passwordless_root_user:
mysql_user.present:
@@ -109,10 +109,10 @@ mysql_salt_user_with_passwordless_root_user:
- onlyif:
- mysql --user {{ mysql_root_user }} -h {{ mysql_host }} --execute="SELECT 1;"
- VALUE=$(mysql --user {{ mysql_root_user }} -ss -e "SELECT Grant_priv FROM mysql.user WHERE user = '{{ mysql_salt_user }}' AND host = '{{ host }}';"); if [ "$VALUE" = 'N' -o -z "$VALUE" ]; then /bin/true; else /bin/false; fi
-{% if os_family in ['RedHat', 'Suse'] %}
+{%- if os_family in ['RedHat', 'Suse'] %}
- require_in:
- mysql_user: mysql_root_password
-{% endif %}
+{%- endif %}
{%- if mysql_salt_grants != [] %}
mysql_salt_user_with_passwordless_root_user_grants:
@@ -131,13 +131,13 @@ mysql_salt_user_with_passwordless_root_user_grants:
- VALUE=$(mysql --user {{ mysql_root_user }} -ss -e "SELECT Grant_priv FROM mysql.user WHERE user = '{{ mysql_salt_user }}' AND host = '{{ host }}';"); if [ "$VALUE" = 'N' -o -z "$VALUE" ]; then /bin/true; else /bin/false; fi
- require:
- mysql_user: mysql_salt_user_with_passwordless_root_user
-{% if os_family in ['RedHat', 'Suse'] %}
+{%- if os_family in ['RedHat', 'Suse'] %}
- require_in:
- mysql_user: mysql_root_password
-{% endif %}
-{% endif %}
+{%- endif %}
+{%- endif %}
-{% if os_family in ['RedHat', 'Suse'] %}
+{%- if os_family in ['RedHat', 'Suse'] %}
extend:
mysql_root_password:
cmd.run:
@@ -157,4 +157,4 @@ extend:
- connection_user: '{{ mysql_salt_user }}'
- connection_pass: '{{ mysql_salt_pass }}'
- connection_charset: utf8
-{% endif %}
+{%- endif %}
diff --git a/mysql/server.sls b/mysql/server.sls
index f468627..d1d451e 100644
--- a/mysql/server.sls
+++ b/mysql/server.sls
@@ -1,9 +1,9 @@
include:
- - mysql.config
- - mysql.python
+ - .config
+ - .python
+
+{% from tpldir ~ "/map.jinja" import mysql with context %}
-{% from "mysql/defaults.yaml" import rawmap with context %}
-{%- set mysql = salt['grains.filter_by'](rawmap, grain='os', merge=salt['pillar.get']('mysql:lookup')) %}
{% set os = salt['grains.get']('os', None) %}
{% set os_family = salt['grains.get']('os_family', None) %}
@@ -13,33 +13,73 @@ include:
{% set mysql_salt_user = salt['pillar.get']('mysql:salt_user:salt_user_name', mysql_root_user) %}
{% set mysql_salt_password = salt['pillar.get']('mysql:salt_user:salt_user_password', mysql_root_password) %}
{% set mysql_datadir = salt['pillar.get']('mysql:server:mysqld:datadir', '/var/lib/mysql') %}
-
+{% set lsb_distrib_codename = salt['grains.get']('lsb_distrib_codename', None) %}
{% if mysql_root_password %}
{% if os_family == 'Debian' %}
+
+{% if mysql.serverpkg == 'mysql-community-server' %}
+mysql-community-server_repo:
+ pkgrepo.managed:
+ - humanname: "Mysql official repo"
+ - name: deb http://repo.mysql.com/apt/ubuntu/ {{ lsb_distrib_codename }} mysql-8.0
+ - file: /etc/apt/sources.list.d/mysql.list
+ - refresh: True
+ - require_in:
+ - pkg: mysql-community-server
+{% endif %}
+
mysql_debconf_utils:
pkg.installed:
- name: {{ mysql.debconf_utils }}
mysql_debconf:
debconf.set:
- - name: {{ mysql.server }}
+ - name: {{ mysql.serverpkg }}
- data:
- '{{ mysql.server }}/root_password': {'type': 'password', 'value': '{{ mysql_root_password }}'}
- '{{ mysql.server }}/root_password_again': {'type': 'password', 'value': '{{ mysql_root_password }}'}
- '{{ mysql.server }}/start_on_boot': {'type': 'boolean', 'value': 'true'}
+ '{{ mysql.serverpkg }}/start_on_boot': {'type': 'boolean', 'value': 'true'}
- require_in:
- - pkg: {{ mysql.server }}
+ - pkg: {{ mysql.serverpkg }}
- require:
- pkg: mysql_debconf_utils
-{% elif os_family in ['RedHat', 'Suse'] %}
+
+ {%- if 'osmajorrelease' in grains and salt['grains.get']('osmajorrelease')|int < 9 or not salt['grains.get']('os')|lower == 'debian' %}
+
+{% if mysql.serverpkg == 'mysql-community-server' %}
+mysql_password_debconf:
+ debconf.set:
+ - name: 'mysql-community-server'
+ - data:
+ 'mysql-community-server/root-pass': {'type': 'password', 'value': '{{ mysql_root_password }}'}
+ 'mysql-community-server/re-root-pass': {'type': 'password', 'value': '{{ mysql_root_password }}'}
+ 'mysql-server/default-auth-override': {'type': 'string', 'value':'Use Legacy Authentication Method (Retain MySQL 5.x Compatibility)'}
+ - require_in:
+ - pkg: {{ mysql.serverpkg }}
+ - require:
+ - pkg: mysql_debconf_utils
+{% else %}
+mysql_password_debconf:
+ debconf.set:
+ - name: mysql-server
+ - data:
+ '{{ mysql.serverpkg }}/root_password': {'type': 'password', 'value': '{{ mysql_root_password }}'}
+ '{{ mysql.serverpkg }}/root_password_again': {'type': 'password', 'value': '{{ mysql_root_password }}'}
+ - require_in:
+ - pkg: {{ mysql.serverpkg }}
+ - require:
+ - pkg: mysql_debconf_utils
+
+{% endif %}
+ {% endif %}
+
+{%- elif os_family in ['RedHat', 'Suse', 'FreeBSD'] %}
mysql_root_password:
cmd.run:
- - name: mysqladmin --user {{ mysql_root_user }} password '{{ mysql_root_password|replace("'", "'\"'\"'") }}'
- - unless: mysql --user {{ mysql_root_user }} --password='{{ mysql_root_password|replace("'", "'\"'\"'") }}' --execute="SELECT 1;"
+ - name: mysqladmin --host "{{ mysql_host }}" --user {{ mysql_root_user }} password '{{ mysql_root_password|replace("'", "'\"'\"'") }}'
+ - unless: mysql --host "{{ mysql_host }}" --user {{ mysql_root_user }} --password='{{ mysql_root_password|replace("'", "'\"'\"'") }}' --execute="SELECT 1;"
- require:
- - service: mysqld
+ - service: mysqld-service-running
-{% for host in ['localhost', 'localhost.localdomain', salt['grains.get']('fqdn')] %}
+{%- for host in {'localhost': '', 'localhost.localdomain': '', salt['grains.get']('fqdn'): ''}.keys() %}
mysql_delete_anonymous_user_{{ host }}:
mysql_user:
- absent
@@ -47,62 +87,68 @@ mysql_delete_anonymous_user_{{ host }}:
- name: ''
- connection_host: '{{ mysql_host }}'
- connection_user: '{{ mysql_salt_user }}'
- {% if mysql_salt_password %}
+ {%- if mysql_salt_password %}
- connection_pass: '{{ mysql_salt_password }}'
- {% endif %}
+ {%- endif %}
- connection_charset: utf8
- require:
- - service: mysqld
+ - service: mysqld-service-running
- pkg: mysql_python
{%- if (mysql_salt_user == mysql_root_user) and mysql_root_password %}
- cmd: mysql_root_password
{%- endif %}
-{% endfor %}
-{% endif %}
-{% endif %}
+ {%- if (mysql_salt_user != mysql_root_user) %}
+ - sls: mysql.salt-user
+ {%- endif %}
+{%- endfor %}
+{%- endif %}
+{%- endif %}
-{% if os_family == 'Arch' %}
+{%- if os_family == 'Arch' %}
# on arch linux: inital mysql datadirectory is not created
mysql_install_datadir:
cmd.run:
-{% if mysql.version is defined and mysql.version >= 5.7 %}
+{%- if mysql.version is defined and mysql.version >= 5.7 %}
- name: mysqld --initialize-insecure --user=mysql --basedir=/usr --datadir={{ mysql_datadir }}
-{% else %}
+{%- else %}
- name: mysql_install_db --user=mysql --basedir=/usr --datadir={{ mysql_datadir }}
-{% endif %}
- - user: root
+{%- endif %}
+ - runas: root
- creates: {{ mysql_datadir }}/mysql/user.frm
- env:
- TMPDIR: '/tmp'
- require:
- - pkg: {{ mysql.server }}
+ - pkg: {{ mysql.serverpkg }}
- file: mysql_config
- require_in:
- - service: mysqld
-{% endif %}
+ - service: mysqld-service-running
+{%- endif %}
mysqld-packages:
pkg.installed:
- - name: {{ mysql.server }}
-{% if os_family == 'Debian' and mysql_root_password %}
+ - name: {{ mysql.serverpkg }}
+{%- if os_family == 'Debian' and mysql_root_password %}
- require:
- debconf: mysql_debconf
-{% endif %}
+{%- endif %}
- require_in:
- file: mysql_config
+{%- if "config_directory" in mysql %}
+ - file: mysql_config_directory
+{%- endif %}
-{% if os_family in ['RedHat', 'Suse'] and mysql.version is defined and mysql.version >= 5.7 and mysql.server != 'mariadb-server' %}
+{%- if os_family in ['RedHat', 'Suse'] and mysql.version is defined and mysql.version >= 5.7 and mysql.serverpkg.lower() != 'mariadb-server' %}
# Initialize mysql database with --initialize-insecure option before starting service so we don't get locked out.
mysql_initialize:
cmd.run:
- name: mysqld --initialize-insecure --user=mysql --basedir=/usr --datadir={{ mysql_datadir }}
- - user: root
- - creates: {{ mysql_datadir}}/mysql/
+ - runas: root
+ - creates: {{ mysql_datadir }}/mysql/
- require:
- - pkg: {{ mysql.server }}
-{% endif %}
+ - pkg: {{ mysql.serverpkg }}
+{%- endif %}
-{% if os_family in ['RedHat', 'Suse'] and mysql.server == 'mariadb-server' %}
+{%- if os_family in ['RedHat', 'Suse'] and mysql.serverpkg.lower() == 'mariadb-server' %}
# For MariaDB it's enough to only create the datadir
mysql_initialize:
file.directory:
@@ -111,36 +157,59 @@ mysql_initialize:
- group: mysql
- makedirs: True
- require:
- - pkg: {{ mysql.server }}
-{% endif %}
+ - pkg: {{ mysql.serverpkg }}
+{%- endif %}
-{% if os_family in ['Gentoo'] %}
+{%- if os_family in ['Gentoo'] %}
mysql_initialize:
cmd.run:
- - name: emerge --config {{ mysql.server }}
- - user: root
- - creates: {{ mysql_datadir}}/mysql/
+ - name: emerge --config {{ mysql.serverpkg }}
+ - runas: root
+ - creates: {{ mysql_datadir }}/mysql/
- require:
- - pkg: {{ mysql.server }}
-{% endif %}
+ - pkg: {{ mysql.serverpkg }}
+{%- endif %}
-mysqld:
+{%- if os_family in ['FreeBSD'] and mysql.serverpkg.lower() != 'mariadb-server' %}
+mysql_initialize:
+ file.directory:
+ - name: /var/log/mysql
+ - user: mysql
+ - group: mysql
+ - mode: '0750'
+ cmd.run:
+ - name: /usr/local/libexec/mysqld --initialize-insecure --user=mysql --basedir=/usr/local --datadir={{ mysql_datadir }}
+ - runas: root
+ - creates: {{ mysql_datadir }}/mysql/
+ - require:
+ - pkg: {{ mysql.serverpkg }}
+ - file: /var/log/mysql
+{%- endif %}
+
+mysqld-service-running:
service.running:
- name: {{ mysql.service }}
- enable: True
- require:
- - pkg: {{ mysql.server }}
-{% if (os_family in ['RedHat', 'Suse'] and mysql.version is defined and mysql.version >= 5.7 and mysql.server != 'mariadb-server') or (os_family in ['Gentoo']) %}
+ - pkg: {{ mysql.serverpkg }}
+{%- if (os_family in ['RedHat', 'Suse'] and mysql.version is defined and mysql.version >= 5.7 and mysql.serverpkg.lower() != 'mariadb-server') or (os_family in ['Gentoo', 'FreeBSD']) %}
- cmd: mysql_initialize
-{% elif os_family in ['RedHat', 'Suse'] and mysql.server == 'mariadb-server' %}
+{%- elif os_family in ['RedHat', 'Suse'] and mysql.serverpkg.lower() == 'mariadb-server' %}
- file: {{ mysql_datadir }}
-{% endif %}
+{%- endif %}
- watch:
- - pkg: {{ mysql.server }}
+ - pkg: {{ mysql.serverpkg }}
- file: mysql_config
-{% if "config_directory" in mysql and "server_config" in mysql %}
+{%- if "config_directory" in mysql and "server_config" in mysql %}
- file: mysql_server_config
-{% endif %}
+{%- endif %}
+
+mysql_what_is_status_of_{{ mysql.service }}:
+ cmd.run:
+ - names:
+ - service {{ mysql.service }} status
+ - onfail:
+ - service: mysqld-service-running
# official oracle mysql repo
# creates this file, that rewrites /etc/mysql/my.cnf setting
@@ -148,7 +217,7 @@ mysqld:
mysql_additional_config:
file.managed:
- name: /usr/my.cnf
- - source: salt://mysql/files/usr-my.cnf
+ - source: salt://{{ tpldir }}/files/usr-my.cnf
- create: False
- watch_in:
- - service: mysqld
+ - service: mysqld-service-running
diff --git a/mysql/server_checks.sls b/mysql/server_checks.sls
new file mode 100644
index 0000000..ab5242b
--- /dev/null
+++ b/mysql/server_checks.sls
@@ -0,0 +1,4 @@
+check_pillar_for_root_password:
+ test.check_pillar:
+ - present:
+ - mysql:server:root_password
diff --git a/mysql/user.sls b/mysql/user.sls
index e4f2ebe..414633a 100644
--- a/mysql/user.sls
+++ b/mysql/user.sls
@@ -1,56 +1,64 @@
-{% from "mysql/defaults.yaml" import rawmap with context %}
-{%- set mysql = salt['grains.filter_by'](rawmap, grain='os', merge=salt['pillar.get']('mysql:server:lookup')) %}
+{%- from tpldir ~ "/map.jinja" import mysql with context %}
{%- set mysql_root_user = salt['pillar.get']('mysql:server:root_user', 'root') %}
{%- set mysql_root_pass = salt['pillar.get']('mysql:server:root_password', salt['grains.get']('server_id')) %}
{%- set mysql_host = salt['pillar.get']('mysql:server:host', 'localhost') %}
-{% set mysql_salt_user = salt['pillar.get']('mysql:salt_user:salt_user_name', mysql_root_user) %}
-{% set mysql_salt_pass = salt['pillar.get']('mysql:salt_user:salt_user_password', mysql_root_pass) %}
+{%- set mysql_salt_user = salt['pillar.get']('mysql:salt_user:salt_user_name', mysql_root_user) %}
+{%- set mysql_salt_pass = salt['pillar.get']('mysql:salt_user:salt_user_password', mysql_root_pass) %}
-{% set user_states = [] %}
-{% set user_hosts = [] %}
+{%- set user_states = [] %}
+{%- set user_hosts = [] %}
include:
- - mysql.python
+ - .python
-{% for name, user in salt['pillar.get']('mysql:user', {}).items() %}
+{%- for name, user in salt['pillar.get']('mysql:user', {}).items() %}
-{% set user_host = salt['pillar.get']('mysql:user:%s:host'|format(name)) %}
-{% if user_host != '' %}
- {% set user_hosts = [user_host] %}
-{% else %}
- {% set user_hosts = salt['pillar.get']('mysql:user:%s:hosts'|format(name)) %}
-{% endif %}
+{%- set user_host = salt['pillar.get']('mysql:user:%s:host'|format(name)) %}
+{%- if user_host != '' %}
+ {%- set user_hosts = [user_host] %}
+{%- else %}
+ {%- set user_hosts = salt['pillar.get']('mysql:user:%s:hosts'|format(name)) %}
+{%- endif %}
-{% if not user_hosts %}
- {% set mine_target = salt['pillar.get']('mysql:user:%s:mine_hosts:target'|format(name)) %}
- {% set mine_function = salt['pillar.get']('mysql:user:%s:mine_hosts:function'|format(name)) %}
- {% set mine_expression_form = salt['pillar.get']('mysql:user:%s:mine_hosts:expr_form'|format(name)) %}
+{%- if not user_hosts %}
+ {%- set mine_target = salt['pillar.get']('mysql:user:%s:mine_hosts:target'|format(name)) %}
+ {%- set mine_function = salt['pillar.get']('mysql:user:%s:mine_hosts:function'|format(name)) %}
+ {%- set mine_expression_form = salt['pillar.get']('mysql:user:%s:mine_hosts:expr_form'|format(name)) %}
- {% if mine_target and mine_function and mine_expression_form %}
- {% set user_hosts = salt['mine.get'](mine_target, mine_function, mine_expression_form).values() %}
- {% endif %}
-{% endif %}
-
-{% for host in user_hosts %}
-
-{% set state_id = 'mysql_user_' ~ name ~ '_' ~ host%}
-{{ state_id }}:
- mysql_user.present:
- - name: {{ name }}
- - host: '{{ host }}'
- {%- if user['password_hash'] is defined %}
- - password_hash: '{{ user['password_hash'] }}'
- {%- elif user['password'] is defined and user['password'] != None %}
- - password: '{{ user['password'] }}'
- {%- else %}
- - allow_passwordless: True
+ {%- if mine_target and mine_function and mine_expression_form %}
+ {%- set user_hosts = salt['mine.get'](mine_target, mine_function, mine_expression_form).values() %}
{%- endif %}
- - connection_host: '{{ mysql_host }}'
- - connection_user: '{{ mysql_salt_user }}'
- {% if mysql_salt_pass %}
- - connection_pass: '{{ mysql_salt_pass }}'
- {% endif %}
- - connection_charset: utf8
+{%- endif %}
+
+{%- for host in user_hosts %}
+
+{%- set state_id = 'mysql_user_' ~ name ~ '_' ~ host %}
+{{ state_id }}:
+ {%- if user.get('present', True) %}
+ mysql_user.present:
+ - name: {{ name }}
+ - host: '{{ host }}'
+ {%- if user['password_hash'] is defined %}
+ - password_hash: '{{ user['password_hash'] }}'
+ {%- elif user['password'] is defined and user['password'] != None %}
+ - password: '{{ user['password'] }}'
+ {%- elif user['unix_socket'] is defined and user['unix_socket'] != None %}
+ - allow_passwordless: True
+ - unix_socket: True
+ {%- else %}
+ - allow_passwordless: True
+ {%- endif %}
+ {%- else %}
+ mysql_user.absent:
+ - name: {{ name }}
+ - host: '{{ host }}'
+ {%- endif %}
+ - connection_host: '{{ mysql_host }}'
+ - connection_user: '{{ mysql_salt_user }}'
+ {%- if mysql_salt_pass %}
+ - connection_pass: '{{ mysql_salt_pass }}'
+ {%- endif %}
+ - connection_charset: utf8
{%- if 'grants' in user %}
{{ state_id ~ '_grants' }}:
@@ -59,55 +67,72 @@ include:
- grant: {{ user['grants']|join(",") }}
- database: '*.*'
- grant_option: {{ user['grant_option'] | default(False) }}
- - user: {{ name }}
- - host: '{{ host }}'
- - connection_host: localhost
- - connection_user: '{{ mysql_salt_user }}'
- {% if mysql_salt_pass -%}
- - connection_pass: '{{ mysql_salt_pass }}'
- {% endif %}
- - connection_charset: utf8
- - require:
- - mysql_user: {{ state_id }}
-{% endif %}
-
-{%- if 'databases' in user %}
-{% for db in user['databases'] %}
-{{ state_id ~ '_' ~ loop.index0 }}:
- mysql_grants.present:
- - name: {{ name ~ '_' ~ db['database'] ~ '_' ~ db['table'] | default('all') }}
- - grant: {{db['grants']|join(",")}}
- - database: '{{ db['database'] }}.{{ db['table'] | default('*') }}'
- - grant_option: {{ db['grant_option'] | default(False) }}
- {% if 'ssl' in user or 'ssl-X509' in user %}
+ {%- if 'ssl' in user or 'ssl-X509' in user %}
- ssl_option:
- SSL: {{ user['ssl'] | default(False) }}
- {% if user['ssl-X509'] is defined %}
+ {%- if user['ssl-X509'] is defined %}
- X509: {{ user['ssl-X509'] }}
- {% endif %}
- {% if user['ssl-SUBJECT'] is defined %}
+ {%- endif %}
+ {%- if user['ssl-SUBJECT'] is defined %}
- SUBJECT: {{ user['ssl-SUBJECT'] }}
- {% endif %}
- {% if user['ssl-ISSUER'] is defined %}
+ {%- endif %}
+ {%- if user['ssl-ISSUER'] is defined %}
- ISSUER: {{ user['ssl-ISSUER'] }}
- {% endif %}
- {% if user['ssl-CIPHER'] is defined %}
+ {%- endif %}
+ {%- if user['ssl-CIPHER'] is defined %}
- CIPHER: {{ user['ssl-CIPHER'] }}
- {% endif %}
- {% endif %}
+ {%- endif %}
+ {%- endif %}
- user: {{ name }}
- host: '{{ host }}'
- connection_host: '{{ mysql_host }}'
- connection_user: '{{ mysql_salt_user }}'
- {% if mysql_salt_pass -%}
+ {%- if mysql_salt_pass %}
- connection_pass: '{{ mysql_salt_pass }}'
- {% endif %}
+ {%- endif %}
- connection_charset: utf8
- require:
- mysql_user: {{ state_id }}
-{% endfor %}
-{% endif %}
+{%- endif %}
-{% do user_states.append(state_id) %}
-{% endfor %}
-{% endfor %}
+{%- if 'databases' in user %}
+{%- for db in user['databases'] %}
+{{ state_id ~ '_' ~ loop.index0 }}:
+ mysql_grants.present:
+ - name: {{ name ~ '_' ~ db['database'] ~ '_' ~ db['table'] | default('all') }}
+ - grant: {{ db['grants']|join(",") }}
+ - database: '{{ db['database'] }}.{{ db['table'] | default('*') }}'
+ - grant_option: {{ db['grant_option'] | default(False) }}
+ {%- if 'ssl' in user or 'ssl-X509' in user %}
+ - ssl_option:
+ - SSL: {{ user['ssl'] | default(False) }}
+ {%- if user['ssl-X509'] is defined %}
+ - X509: {{ user['ssl-X509'] }}
+ {%- endif %}
+ {%- if user['ssl-SUBJECT'] is defined %}
+ - SUBJECT: {{ user['ssl-SUBJECT'] }}
+ {%- endif %}
+ {%- if user['ssl-ISSUER'] is defined %}
+ - ISSUER: {{ user['ssl-ISSUER'] }}
+ {%- endif %}
+ {%- if user['ssl-CIPHER'] is defined %}
+ - CIPHER: {{ user['ssl-CIPHER'] }}
+ {%- endif %}
+ {%- endif %}
+ - user: {{ name }}
+ - host: '{{ host }}'
+ - escape: {{ db['escape'] | default(True) }}
+ - connection_host: '{{ mysql_host }}'
+ - connection_user: '{{ mysql_salt_user }}'
+ {%- if mysql_salt_pass %}
+ - connection_pass: '{{ mysql_salt_pass }}'
+ {%- endif %}
+ - connection_charset: utf8
+ - require:
+ - mysql_user: {{ state_id }}
+{%- endfor %}
+{%- endif %}
+
+{%- do user_states.append(state_id) %}
+{%- endfor %}
+{%- endfor %}
diff --git a/pillar.example b/pillar.example
index 2b50a81..17780b3 100644
--- a/pillar.example
+++ b/pillar.example
@@ -1,3 +1,6 @@
+# -*- coding: utf-8 -*-
+# vim: ft=yaml
+---
mysql:
global:
client-server:
@@ -33,10 +36,10 @@ mysql:
binlog_do_db: foo
auto_increment_increment: 5
binlog-ignore-db:
- - mysql
- - sys
- - information_schema
- - performance_schema
+ - mysql
+ - sys
+ - information_schema
+ - performance_schema
mysql:
# my.cnf param that not require value
no-auto-rehash: noarg_present
@@ -47,30 +50,54 @@ mysql:
grants:
- 'all privileges'
+ # Manage config
+ config:
+ file: ~/.my.cnf
+ sections:
+ client:
+ port: 33306
+ socket: /var/lib/mysql-socket/mysql.sock
+ mysqld_safe:
+ plugin-dir: '~/mysql/plugins'
+ mysqld:
+ user: myself
+ port: 33306
+ datadir: ~/mysql/datadir
+ apparmor:
+ dir: /etc/apparmor.d/local
+ file: usr.sbin.mysqld
+
# Manage databases
database:
+ # Simple definition using default charset and collate
- foo
- - bar
+ # Detailed definition
+ - name: bar
+ character_set: utf8
+ collate: utf8_general_ci
+ # Delete DB
+ - name: obsolete_db
+ present: false
schema:
foo:
- load: True
- source: salt://mysql/files/foo.schema
+ load: true
+ source: salt://{{ tpldir }}/files/foo.schema
bar:
- load: False
+ load: false
baz:
- load: True
- source: salt://mysql/files/baz.schema.tmpl
+ load: true
+ source: salt://{{ tpldir }}/files/baz.schema.tmpl
template: jinja
qux:
- load: True
- source: salt://mysql/files/qux.schema.tmpl
+ load: true
+ source: salt://{{ tpldir }}/files/qux.schema.tmpl
template: jinja
context:
encabulator: Turbo
girdlespring: differential
quux:
- load: True
- source: salt://mysql/files/qux.schema.tmpl
+ load: true
+ source: salt://{{ tpldir }}/files/qux.schema.tmpl
template: jinja
context:
encabulator: Retro
@@ -85,23 +112,36 @@ mysql:
databases:
- database: foo
grants: ['select', 'insert', 'update']
+ escape: true
- database: bar
grants: ['all privileges']
bob:
password_hash: '*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4'
- host: localhost
- ssl: True
- ssl-X509: True
+ host: '%' # Any host
+ ssl: true
+ ssl-X509: true
ssl-SUBJECT: Subject
ssl-ISSUER: Name
ssl-CIPHER: Cipher
databases:
- - database: foo
+ # https://github.com/saltstack/salt/issues/41178
+ # If you want to refer to databases using wildcards, turn off escape so
+ # the renderer does not escape them, enclose the string in '`' and
+ # use two '%'
+ - database: '`foo\_%%`'
grants: ['all privileges']
- grant_option: True
+ grant_option: true
+ escape: false
- database: bar
table: foobar
grants: ['select', 'insert', 'update', 'delete']
+
+ # User 'alice' will be allowed to connect to the server without password
+ # as long as she has access to the unix socket.
+ # This option forces allow_passwordless to be set to True
+ alice:
+ host: 'localhost'
+ unix_socket: true
nopassuser:
password: ~
host: localhost
@@ -116,15 +156,79 @@ mysql:
- database: foo
grants: ['select', 'insert', 'update']
+ # Remove a user
+ obsoleteuser:
+ host: localhost
+ # defaults to true
+ present: false
+
# Override any names defined in map.jinja
-# lookup:
-# server: mysql-server
-# client: mysql-client
-# service: mysql-service
-# python: python-mysqldb
+ # serverpkg: mysql-server
+ # clientpkg: mysql-client
+ # service: mysql
+ # pythonpkg: python-mysqldb
+ # devpkg: mysql-devel
+ # debconf_utils: debconf-utils
# Install MySQL headers
dev:
- # Install dev package - defaults to False
- install: False
+ # Install dev package - defaults to false
+ install: false
+ macos:
+ products:
+ community_server:
+ enabled: true # default
+ # yamllint disable-line rule:line-length
+ url: https://downloads.mysql.com/archives/get/file/mysql-8.0.11-macos10.13-x86_64.dmg
+ sum: 'md5=602a84390ecf3d82025b1d99fc594124'
+ workbench:
+ enabled: true # default
+ # yamllint disable-line rule:line-length
+ url: https://downloads.mysql.com/archives/get/file/mysql-workbench-community-8.0.11-rc-macos-x86_64.dmg
+ sum: 'md5=37c5ae5bd75a4e1804ae6e0127d68611'
+ cluster:
+ enabled: false # default
+ # yamllint disable-line rule:line-length
+ url: https://downloads.mysql.com/archives/get/file/mysql-cluster-gpl-7.6.6-macos10.13-x86_64.dmg
+ sum: 'md5=0df975908e7d8e4e8c1003d95edf4721'
+ router:
+ enabled: false # default
+ # yamllint disable-line rule:line-length
+ url: https://downloads.mysql.com/archives/get/file/mysql-router-8.0.11-macos10.13-x86-64bit.dmg
+ sum: 'md5=8dd536f2f223933ecbfb8b19e54ee2f6'
+ utilities:
+ enabled: false # default
+ # yamllint disable-line rule:line-length
+ url: https://downloads.mysql.com/archives/get/file/mysql-utilities-1.6.5-macos10.12.dmg
+ sum: 'md5=4c8e75bb217b8293dcdeb915b649c2c8'
+ shell:
+ enabled: false # default
+ # yamllint disable-line rule:line-length
+ url: https://downloads.mysql.com/archives/get/file/mysql-shell-8.0.11-macos10.13-x86-64bit.dmg
+ sum: 'md5=43db4f0fc39f88c1d7be4a4f52cec363'
+ proxy:
+ enabled: false # default
+ # yamllint disable-line rule:line-length
+ url: https://downloads.mysql.com/archives/get/file/mysql-proxy-0.8.5-osx10.7-x86-32bit.tar.gz
+ sum: 'md5=107df22412aa8c483d2021e1af24ee22'
+ connector:
+ enabled: false # default
+ # yamllint disable-line rule:line-length
+ url: https://downloads.mysql.com/archives/get/file/mysql-connector-nodejs-8.0.11.tar.gz
+ sum: 'md5=dece7fe5607918ba68499ef07c31508d'
+ forvisualstudio:
+ enabled: false # default
+ # yamllint disable-line rule:line-length
+ url: https://downloads.mysql.com/archives/get/file/mysql-for-visualstudio-2.0.4-src.zip
+ sum: 'md5=fcf39316505ee2921e31a431eae77a9c'
+ forexcel:
+ enabled: false # default
+ # yamllint disable-line rule:line-length
+ url: https://downloads.mysql.com/archives/get/file/mysql-for-excel-1.3.6-src.zip
+ sum: 'md5=2cc8b65eb72a1b07a6e4e2665e2a29e3'
+ notifier:
+ enabled: false # default
+ # yamllint disable-line rule:line-length
+ url: https://downloads.mysql.com/archives/get/file/mysql-notifier-1.1.6-src.zip
+ sum: 'md5=349f1994681763fd6626a8ddf6be5363'
diff --git a/pre-commit_semantic-release.sh b/pre-commit_semantic-release.sh
new file mode 100755
index 0000000..ba80535
--- /dev/null
+++ b/pre-commit_semantic-release.sh
@@ -0,0 +1,30 @@
+#!/bin/sh
+
+###############################################################################
+# (A) Update `FORMULA` with `${nextRelease.version}`
+###############################################################################
+sed -i -e "s_^\(version:\).*_\1 ${1}_" FORMULA
+
+
+###############################################################################
+# (B) Use `m2r` to convert automatically produced `.md` docs to `.rst`
+###############################################################################
+
+# Install `m2r`
+sudo -H pip install m2r
+
+# Copy and then convert the `.md` docs
+cp ./*.md docs/
+cd docs/ || exit
+m2r --overwrite ./*.md
+
+# Change excess `H1` headings to `H2` in converted `CHANGELOG.rst`
+sed -i -e '/^=.*$/s/=/-/g' CHANGELOG.rst
+sed -i -e '1,4s/-/=/g' CHANGELOG.rst
+
+# Use for debugging output, when required
+# cat AUTHORS.rst
+# cat CHANGELOG.rst
+
+# Return back to the main directory
+cd ..
diff --git a/release-rules.js b/release-rules.js
new file mode 100644
index 0000000..c63c850
--- /dev/null
+++ b/release-rules.js
@@ -0,0 +1,18 @@
+// No release is triggered for the types commented out below.
+// Commits using these types will be incorporated into the next release.
+//
+// NOTE: Any changes here must be reflected in `CONTRIBUTING.md`.
+module.exports = [
+ {breaking: true, release: 'major'},
+ // {type: 'build', release: 'patch'},
+ // {type: 'chore', release: 'patch'},
+ // {type: 'ci', release: 'patch'},
+ {type: 'docs', release: 'patch'},
+ {type: 'feat', release: 'minor'},
+ {type: 'fix', release: 'patch'},
+ {type: 'perf', release: 'patch'},
+ {type: 'refactor', release: 'patch'},
+ {type: 'revert', release: 'patch'},
+ {type: 'style', release: 'patch'},
+ {type: 'test', release: 'patch'},
+];
diff --git a/release.config.js b/release.config.js
new file mode 100644
index 0000000..6af7aa8
--- /dev/null
+++ b/release.config.js
@@ -0,0 +1,106 @@
+module.exports = {
+ branch: 'master',
+ plugins: [
+ ['@semantic-release/commit-analyzer', {
+ preset: 'angular',
+ releaseRules: './release-rules.js',
+ }],
+ '@semantic-release/release-notes-generator',
+ ['@semantic-release/changelog', {
+ changelogFile: 'CHANGELOG.md',
+ changelogTitle: '# Changelog',
+ }],
+ ['@semantic-release/exec', {
+ prepareCmd: 'sh ./pre-commit_semantic-release.sh ${nextRelease.version}',
+ }],
+ ['@semantic-release/git', {
+ assets: ['*.md', 'docs/*.rst', 'FORMULA'],
+ }],
+ '@semantic-release/github',
+ ],
+ generateNotes: {
+ preset: 'angular',
+ writerOpts: {
+ // Required due to upstream bug preventing all types being displayed.
+ // Bug: https://github.com/conventional-changelog/conventional-changelog/issues/317
+ // Fix: https://github.com/conventional-changelog/conventional-changelog/pull/410
+ transform: (commit, context) => {
+ const issues = []
+
+ commit.notes.forEach(note => {
+ note.title = `BREAKING CHANGES`
+ })
+
+ // NOTE: Any changes here must be reflected in `CONTRIBUTING.md`.
+ if (commit.type === `feat`) {
+ commit.type = `Features`
+ } else if (commit.type === `fix`) {
+ commit.type = `Bug Fixes`
+ } else if (commit.type === `perf`) {
+ commit.type = `Performance Improvements`
+ } else if (commit.type === `revert`) {
+ commit.type = `Reverts`
+ } else if (commit.type === `docs`) {
+ commit.type = `Documentation`
+ } else if (commit.type === `style`) {
+ commit.type = `Styles`
+ } else if (commit.type === `refactor`) {
+ commit.type = `Code Refactoring`
+ } else if (commit.type === `test`) {
+ commit.type = `Tests`
+ } else if (commit.type === `build`) {
+ commit.type = `Build System`
+ // } else if (commit.type === `chore`) {
+ // commit.type = `Maintenance`
+ } else if (commit.type === `ci`) {
+ commit.type = `Continuous Integration`
+ } else {
+ return
+ }
+
+ if (commit.scope === `*`) {
+ commit.scope = ``
+ }
+
+ if (typeof commit.hash === `string`) {
+ commit.shortHash = commit.hash.substring(0, 7)
+ }
+
+ if (typeof commit.subject === `string`) {
+ let url = context.repository
+ ? `${context.host}/${context.owner}/${context.repository}`
+ : context.repoUrl
+ if (url) {
+ url = `${url}/issues/`
+ // Issue URLs.
+ commit.subject = commit.subject.replace(/#([0-9]+)/g, (_, issue) => {
+ issues.push(issue)
+ return `[#${issue}](${url}${issue})`
+ })
+ }
+ if (context.host) {
+ // User URLs.
+ commit.subject = commit.subject.replace(/\B@([a-z0-9](?:-?[a-z0-9/]){0,38})/g, (_, username) => {
+ if (username.includes('/')) {
+ return `@${username}`
+ }
+
+ return `[@${username}](${context.host}/${username})`
+ })
+ }
+ }
+
+ // remove references that already appear in the subject
+ commit.references = commit.references.filter(reference => {
+ if (issues.indexOf(reference.issue) === -1) {
+ return true
+ }
+
+ return false
+ })
+
+ return commit
+ },
+ },
+ },
+};
diff --git a/test/integration/default/README.md b/test/integration/default/README.md
new file mode 100644
index 0000000..37cf963
--- /dev/null
+++ b/test/integration/default/README.md
@@ -0,0 +1,50 @@
+# InSpec Profile: `default`
+
+This shows the implementation of the `default` InSpec [profile](https://github.com/inspec/inspec/blob/master/docs/profiles.md).
+
+## Verify a profile
+
+InSpec ships with built-in features to verify a profile structure.
+
+```bash
+$ inspec check default
+Summary
+-------
+Location: default
+Profile: profile
+Controls: 4
+Timestamp: 2019-06-24T23:09:01+00:00
+Valid: true
+
+Errors
+------
+
+Warnings
+--------
+```
+
+## Execute a profile
+
+To run all **supported** controls on a local machine use `inspec exec /path/to/profile`.
+
+```bash
+$ inspec exec default
+..
+
+Finished in 0.0025 seconds (files took 0.12449 seconds to load)
+8 examples, 0 failures
+```
+
+## Execute a specific control from a profile
+
+To run one control from the profile use `inspec exec /path/to/profile --controls name`.
+
+```bash
+$ inspec exec default --controls package
+.
+
+Finished in 0.0025 seconds (files took 0.12449 seconds to load)
+1 examples, 0 failures
+```
+
+See an [example control here](https://github.com/inspec/inspec/blob/master/examples/profile/controls/example.rb).
diff --git a/test/integration/default/controls/packages_spec.rb b/test/integration/default/controls/packages_spec.rb
new file mode 100644
index 0000000..288f3d6
--- /dev/null
+++ b/test/integration/default/controls/packages_spec.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+# Override by OS
+package_name = 'mariadb-server'
+if (os[:name] == 'suse') || (os[:name] == 'opensuse')
+ package_name = 'mariadb'
+elsif (os[:name] == 'debian') && os[:release].start_with?('8')
+ package_name = 'mysql-server'
+end
+
+control 'mysql package' do
+ title 'should be installed'
+
+ describe package(package_name) do
+ it { should be_installed }
+ end
+end
diff --git a/test/integration/default/inspec.yml b/test/integration/default/inspec.yml
new file mode 100644
index 0000000..5865baf
--- /dev/null
+++ b/test/integration/default/inspec.yml
@@ -0,0 +1,18 @@
+# -*- coding: utf-8 -*-
+# vim: ft=yaml
+---
+name: default
+title: mysql formula
+maintainer: SaltStack Formulas
+license: Apache-2.0
+summary: Verify that the mysql formula is setup and configured correctly
+supports:
+ - platform-name: debian
+ - platform-name: ubuntu
+ - platform-name: centos
+ - platform-name: fedora
+ - platform-name: opensuse
+ - platform-name: suse
+ - platform-name: freebsd
+ - platform-name: amazon
+ - platform-name: arch
diff --git a/test/salt/pillar/mysql.sls b/test/salt/pillar/mysql.sls
new file mode 100644
index 0000000..17a3124
--- /dev/null
+++ b/test/salt/pillar/mysql.sls
@@ -0,0 +1,226 @@
+# -*- coding: utf-8 -*-
+# vim: ft=yaml
+---
+mysql:
+ global:
+ client-server:
+ default_character_set: utf8
+
+ clients:
+ mysql:
+ default_character_set: utf8
+ mysqldump:
+ default_character_set: utf8
+
+ library:
+ client:
+ default_character_set: utf8
+
+ server:
+ # Use this account for database admin (defaults to root)
+ # root_user: 'admin'
+ # root_password: '' - to have root@localhost without password
+ root_password: 'somepass'
+ root_password_hash: '*13883BDDBE566ECECC0501CDE9B293303116521A'
+ user: mysql
+ # If you only manage the dbs and users and the server is on
+ # another host
+ # host: 123.123.123.123
+ # my.cnf sections changes
+ mysqld:
+ # you can use either underscore or hyphen in param names
+ bind-address: 0.0.0.0
+ log_bin: /var/log/mysql/mysql-bin.log
+ datadir: /var/lib/mysql
+ port: 3307
+ binlog_do_db: foo
+ auto_increment_increment: 5
+ binlog-ignore-db:
+ - mysql
+ - sys
+ - information_schema
+ - performance_schema
+ mysql:
+ # my.cnf param that not require value
+ no-auto-rehash: noarg_present
+
+ # salt_user:
+ # salt_user_name: 'salt'
+ # salt_user_password: 'someotherpass'
+ # grants:
+ # - 'all privileges'
+
+ # Manage config
+ config:
+ file: ~/.my.cnf
+ sections:
+ client:
+ port: 33306
+ socket: /var/lib/mysql-socket/mysql.sock
+ mysqld_safe:
+ plugin-dir: '~/mysql/plugins'
+ mysqld:
+ user: myself
+ port: 33306
+ datadir: ~/mysql/datadir
+ apparmor:
+ dir: /etc/apparmor.d/local
+ file: usr.sbin.mysqld
+
+ # Manage databases
+ database:
+ # Simple definition using default charset and collate
+ - foo
+ # Detailed definition
+ - name: bar
+ character_set: utf8
+ collate: utf8_general_ci
+ # Delete DB
+ - name: obsolete_db
+ present: false
+ schema:
+ foo:
+ load: false
+ bar:
+ load: false
+ baz:
+ load: true
+ source: salt://{{ tpldir }}/files/baz.schema.tmpl
+ template: jinja
+ qux:
+ load: true
+ source: salt://{{ tpldir }}/files/qux.schema.tmpl
+ template: jinja
+ context:
+ encabulator: Turbo
+ girdlespring: differential
+ quux:
+ load: true
+ source: salt://{{ tpldir }}/files/qux.schema.tmpl
+ template: jinja
+ context:
+ encabulator: Retro
+ girdlespring: integral
+
+ # Manage users
+ # you can get pillar for existing server using scripts/import_users.py script
+ user:
+ frank:
+ password: 'somepass'
+ host: localhost
+ databases:
+ - database: foo
+ grants: ['select', 'insert', 'update']
+ escape: true
+ - database: bar
+ grants: ['all privileges']
+ # bob:
+ # password_hash: '*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4'
+ # host: '%' # Any host
+ # ssl: true
+ # ssl-X509: true
+ # ssl-SUBJECT: Subject
+ # ssl-ISSUER: Name
+ # ssl-CIPHER: Cipher
+ # databases:
+ # # https://github.com/saltstack/salt/issues/41178
+ # # If you want to refer to databases using wildcards, turn off escape so
+ # # the renderer does not escape them, enclose the string in '`' and
+ # # use two '%'
+ # - database: '`foo\_%%`'
+ # grants: ['all privileges']
+ # grant_option: true
+ # escape: false
+ # - database: bar
+ # table: foobar
+ # grants: ['select', 'insert', 'update', 'delete']
+ nopassuser:
+ password: ~
+ host: localhost
+ databases: []
+ application:
+ password: 'somepass'
+ mine_hosts:
+ target: "G@role:database and *.example.com"
+ function: "network.get_hostname"
+ expr_form: compound
+ databases:
+ - database: foo
+ grants: ['select', 'insert', 'update']
+
+ # Remove a user
+ obsoleteuser:
+ host: localhost
+ # defaults to true
+ present: false
+
+ # Override any names defined in map.jinja
+ # serverpkg: mysql-server
+ # clientpkg: mysql-client
+ # service: mysql
+ # pythonpkg: python-mysqldb
+ # devpkg: mysql-devel
+ # debconf_utils: debconf-utils
+
+ # Install MySQL headers
+ dev:
+ # Install dev package - defaults to false
+ install: false
+
+ macos:
+ products:
+ community_server:
+ enabled: true # default
+ # yamllint disable-line rule:line-length
+ url: https://downloads.mysql.com/archives/get/file/mysql-8.0.11-macos10.13-x86_64.dmg
+ sum: 'md5=602a84390ecf3d82025b1d99fc594124'
+ workbench:
+ enabled: true # default
+ # yamllint disable-line rule:line-length
+ url: https://downloads.mysql.com/archives/get/file/mysql-workbench-community-8.0.11-rc-macos-x86_64.dmg
+ sum: 'md5=37c5ae5bd75a4e1804ae6e0127d68611'
+ cluster:
+ enabled: false # default
+ # yamllint disable-line rule:line-length
+ url: https://downloads.mysql.com/archives/get/file/mysql-cluster-gpl-7.6.6-macos10.13-x86_64.dmg
+ sum: 'md5=0df975908e7d8e4e8c1003d95edf4721'
+ router:
+ enabled: false # default
+ # yamllint disable-line rule:line-length
+ url: https://downloads.mysql.com/archives/get/file/mysql-router-8.0.11-macos10.13-x86-64bit.dmg
+ sum: 'md5=8dd536f2f223933ecbfb8b19e54ee2f6'
+ utilities:
+ enabled: false # default
+ # yamllint disable-line rule:line-length
+ url: https://downloads.mysql.com/archives/get/file/mysql-utilities-1.6.5-macos10.12.dmg
+ sum: 'md5=4c8e75bb217b8293dcdeb915b649c2c8'
+ shell:
+ enabled: false # default
+ # yamllint disable-line rule:line-length
+ url: https://downloads.mysql.com/archives/get/file/mysql-shell-8.0.11-macos10.13-x86-64bit.dmg
+ sum: 'md5=43db4f0fc39f88c1d7be4a4f52cec363'
+ proxy:
+ enabled: false # default
+ # yamllint disable-line rule:line-length
+ url: https://downloads.mysql.com/archives/get/file/mysql-proxy-0.8.5-osx10.7-x86-32bit.tar.gz
+ sum: 'md5=107df22412aa8c483d2021e1af24ee22'
+ connector:
+ enabled: false # default
+ # yamllint disable-line rule:line-length
+ url: https://downloads.mysql.com/archives/get/file/mysql-connector-nodejs-8.0.11.tar.gz
+ sum: 'md5=dece7fe5607918ba68499ef07c31508d'
+ forvisualstudio:
+ enabled: false # default
+ # yamllint disable-line rule:line-length
+ url: https://downloads.mysql.com/archives/get/file/mysql-for-visualstudio-2.0.4-src.zip
+ sum: 'md5=fcf39316505ee2921e31a431eae77a9c'
+ forexcel:
+ enabled: false # default
+ # yamllint disable-line rule:line-length
+ url: https://downloads.mysql.com/archives/get/file/mysql-for-excel-1.3.6-src.zip
+ sum: 'md5=2cc8b65eb72a1b07a6e4e2665e2a29e3'
+ notifier:
+ enabled: false # default
+ # yamllint disable-line rule:line-length
+ url: https://downloads.mysql.com/archives/get/file/mysql-notifier-1.1.6-src.zip
+ sum: 'md5=349f1994681763fd6626a8ddf6be5363'