Skip to content
Snippets Groups Projects
Unverified Commit e8daa585 authored by N's avatar N Committed by GitHub
Browse files

Merge pull request #66 from noelmcloughlin/refactor

refactor(formula): align to template formula & new states
parents fab8f70b ee018368
No related branches found
No related tags found
No related merge requests found
......@@ -15,6 +15,7 @@
# `image`
image_commitlint: &image_commitlint 'myii/ssf-commitlint:11'
image_dindruby: &image_dindruby 'myii/ssf-dind-ruby:2.7.1-r3'
image_dindrubybionic: &image_dindrubybionic 'myii/ssf-dind-ruby-bionic:1_2.5.1'
image_precommit: &image_precommit
name: 'myii/ssf-pre-commit:2.9.2'
entrypoint: ['/bin/bash', '-c']
......@@ -129,58 +130,41 @@ rubocop:
# default-ubuntu-1804-tiamat-py3: {extends: '.test_instance'}
# default-ubuntu-1604-tiamat-py3: {extends: '.test_instance'}
# default-centos-8-tiamat-py3: {extends: '.test_instance'}
# default-centos-7-tiamat-py3: {extends: '.test_instance'}
### default-centos-7-tiamat-py3: {extends: '.test_instance'}
# default-amazonlinux-2-tiamat-py3: {extends: '.test_instance'}
# default-oraclelinux-8-tiamat-py3: {extends: '.test_instance'}
# default-oraclelinux-7-tiamat-py3: {extends: '.test_instance'}
# default-debian-10-master-py3: {extends: '.test_instance'}
latest-debian-10-master-py3: {extends: '.test_instance'}
default-debian-9-master-py3: {extends: '.test_instance'}
# latest-debian-9-master-py3: {extends: '.test_instance'}
default-debian-10-master-py3: {extends: '.test_instance'}
# default-debian-9-master-py3: {extends: '.test_instance'}
default-ubuntu-2004-master-py3: {extends: '.test_instance'}
# latest-ubuntu-2004-master-py3: {extends: '.test_instance'}
default-ubuntu-1804-master-py3: {extends: '.test_instance'}
# latest-ubuntu-1804-master-py3: {extends: '.test_instance'}
default-ubuntu-1604-master-py3: {extends: '.test_instance'}
# latest-ubuntu-1604-master-py3: {extends: '.test_instance'}
# default-centos-8-master-py3: {extends: '.test_instance'}
# latest-centos-8-master-py3: {extends: '.test_instance'}
# default-ubuntu-1604-master-py3: {extends: '.test_instance'}
default-centos-8-master-py3: {extends: '.test_instance'}
default-centos-7-master-py3: {extends: '.test_instance'}
# latest-centos-7-master-py3: {extends: '.test_instance'}
# default-fedora-33-master-py3: {extends: '.test_instance'}
latest-fedora-33-master-py3: {extends: '.test_instance'}
default-fedora-33-master-py3: {extends: '.test_instance'}
default-fedora-32-master-py3: {extends: '.test_instance'}
# latest-fedora-32-master-py3: {extends: '.test_instance'}
# default-opensuse-leap-152-master-py3: {extends: '.test_instance'}
# latest-opensuse-leap-152-master-py3: {extends: '.test_instance'}
# default-opensuse-tmbl-latest-master-py3: {extends: '.test_instance'}
# latest-opensuse-tmbl-latest-master-py3: {extends: '.test_instance'}
# default-amazonlinux-2-master-py3: {extends: '.test_instance'}
# latest-amazonlinux-2-master-py3: {extends: '.test_instance'}
# default-oraclelinux-8-master-py3: {extends: '.test_instance'}
# latest-oraclelinux-8-master-py3: {extends: '.test_instance'}
# default-oraclelinux-7-master-py3: {extends: '.test_instance'}
# latest-oraclelinux-7-master-py3: {extends: '.test_instance'}
# default-gentoo-stage3-latest-master-py3: {extends: '.test_instance'}
# latest-gentoo-stage3-latest-master-py3: {extends: '.test_instance'}
# default-gentoo-stage3-systemd-master-py3: {extends: '.test_instance'}
# latest-gentoo-stage3-systemd-master-py3: {extends: '.test_instance'}
# gentoo-gentoo-stage3-latest-master-py3: {extends: '.test_instance'}
# gentoo-gentoo-stage3-systemd-master-py3: {extends: '.test_instance'}
# default-debian-10-3002-5-py3: {extends: '.test_instance'}
# default-debian-9-3002-5-py3: {extends: '.test_instance'}
# default-ubuntu-2004-3002-5-py3: {extends: '.test_instance'}
# default-ubuntu-1804-3002-5-py3: {extends: '.test_instance'}
# default-ubuntu-1604-3002-5-py3: {extends: '.test_instance'}
# default-centos-8-3002-5-py3: {extends: '.test_instance'}
# default-centos-7-3002-5-py3: {extends: '.test_instance'}
### default-centos-7-3002-5-py3: {extends: '.test_instance'}
# default-fedora-33-3002-5-py3: {extends: '.test_instance'}
# default-fedora-32-3002-5-py3: {extends: '.test_instance'}
# default-amazonlinux-2-3002-5-py3: {extends: '.test_instance'}
# default-oraclelinux-8-3002-5-py3: {extends: '.test_instance'}
# default-oraclelinux-7-3002-5-py3: {extends: '.test_instance'}
# default-arch-base-latest-3002-5-py3: {extends: '.test_instance'}
# latest-arch-base-latest-3002-5-py3: {extends: '.test_instance'}
# default-gentoo-stage3-latest-3002-5-py3: {extends: '.test_instance'}
# default-gentoo-stage3-systemd-3002-5-py3: {extends: '.test_instance'}
# gentoo-gentoo-stage3-latest-3002-5-py3: {extends: '.test_instance'}
# gentoo-gentoo-stage3-systemd-3002-5-py3: {extends: '.test_instance'}
# default-opensuse-leap-152-3002-2-py3: {extends: '.test_instance'}
# default-opensuse-tmbl-latest-3002-2-py3: {extends: '.test_instance'}
# default-debian-10-3001-6-py3: {extends: '.test_instance'}
......@@ -198,8 +182,8 @@ default-fedora-32-master-py3: {extends: '.test_instance'}
# default-oraclelinux-8-3001-6-py3: {extends: '.test_instance'}
# default-oraclelinux-7-3001-6-py3: {extends: '.test_instance'}
# default-arch-base-latest-3001-6-py3: {extends: '.test_instance'}
# default-gentoo-stage3-latest-3001-6-py3: {extends: '.test_instance'}
# default-gentoo-stage3-systemd-3001-6-py3: {extends: '.test_instance'}
# gentoo-gentoo-stage3-latest-3001-6-py3: {extends: '.test_instance'}
# gentoo-gentoo-stage3-systemd-3001-6-py3: {extends: '.test_instance'}
# default-debian-10-3000-8-py3: {extends: '.test_instance'}
# default-debian-9-3000-8-py3: {extends: '.test_instance'}
# default-ubuntu-1804-3000-8-py3: {extends: '.test_instance'}
......@@ -210,8 +194,8 @@ default-fedora-32-master-py3: {extends: '.test_instance'}
# default-amazonlinux-2-3000-8-py3: {extends: '.test_instance'}
# default-oraclelinux-8-3000-8-py3: {extends: '.test_instance'}
# default-oraclelinux-7-3000-8-py3: {extends: '.test_instance'}
# default-gentoo-stage3-latest-3000-8-py3: {extends: '.test_instance'}
# default-gentoo-stage3-systemd-3000-8-py3: {extends: '.test_instance'}
# gentoo-gentoo-stage3-latest-3000-8-py3: {extends: '.test_instance'}
# gentoo-gentoo-stage3-systemd-3000-8-py3: {extends: '.test_instance'}
# default-ubuntu-1804-3000-8-py2: {extends: '.test_instance'}
# default-ubuntu-1604-3000-8-py2: {extends: '.test_instance'}
# default-arch-base-latest-3000-8-py2: {extends: '.test_instance'}
......
......@@ -5,7 +5,7 @@
Layout/LineLength:
# Increase from default of `80`
# Based on https://github.com/PyCQA/flake8-bugbear#opinionated-warnings (`B950`)
Max: 88
Max: 98
Metrics/BlockLength:
IgnoredMethods:
- control
......
......@@ -18,6 +18,7 @@ ignore: |
test/**/states/**/*.sls
.kitchen/
kitchen.vagrant.yml
pillar.example
yaml-files:
# Default settings
......
......@@ -4,6 +4,39 @@ This list is sorted by the number of commits per contributor in _descending_ ord
Avatar|Contributor|Contributions
:-:|---|:-:
<img class='float-left rounded-1' src='https://avatars2.githubusercontent.com/u/10231489?v=4' width='36' height='36' alt='@myii'>|[@myii](https://github.com/myii)|27
<img class='float-left rounded-1' src='https://avatars2.githubusercontent.com/u/1396878?v=4' width='36' height='36' alt='@gravyboat'>|[@gravyboat](https://github.com/gravyboat)|11
<img class='float-left rounded-1' src='https://avatars3.githubusercontent.com/u/52996?v=4' width='36' height='36' alt='@daks'>|[@daks](https://github.com/daks)|6
<img class='float-left rounded-1' src='https://avatars0.githubusercontent.com/u/3374962?v=4' width='36' height='36' alt='@nmadhok'>|[@nmadhok](https://github.com/nmadhok)|6
<img class='float-left rounded-1' src='https://avatars0.githubusercontent.com/u/507599?v=4' width='36' height='36' alt='@thatch45'>|[@thatch45](https://github.com/thatch45)|4
<img class='float-left rounded-1' src='https://avatars2.githubusercontent.com/u/3768412?v=4' width='36' height='36' alt='@stp-ip'>|[@stp-ip](https://github.com/stp-ip)|3
<img class='float-left rounded-1' src='https://avatars0.githubusercontent.com/u/1800660?v=4' width='36' height='36' alt='@aboe76'>|[@aboe76](https://github.com/aboe76)|3
<img class='float-left rounded-1' src='https://avatars2.githubusercontent.com/u/1933277?v=4' width='36' height='36' alt='@PredatorVI'>|[@PredatorVI](https://github.com/PredatorVI)|3
<img class='float-left rounded-1' src='https://avatars3.githubusercontent.com/u/398720?v=4' width='36' height='36' alt='@tiger-seo'>|[@tiger-seo](https://github.com/tiger-seo)|3
<img class='float-left rounded-1' src='https://avatars0.githubusercontent.com/u/1067420?v=4' width='36' height='36' alt='@david-thorman'>|[@david-thorman](https://github.com/david-thorman)|2
<img class='float-left rounded-1' src='https://avatars2.githubusercontent.com/u/8331921?v=4' width='36' height='36' alt='@jmdcal'>|[@jmdcal](https://github.com/jmdcal)|2
<img class='float-left rounded-1' src='https://avatars1.githubusercontent.com/u/287147?v=4' width='36' height='36' alt='@techhat'>|[@techhat](https://github.com/techhat)|2
<img class='float-left rounded-1' src='https://avatars1.githubusercontent.com/u/528061?v=4' width='36' height='36' alt='@puneetk'>|[@puneetk](https://github.com/puneetk)|2
<img class='float-left rounded-1' src='https://avatars0.githubusercontent.com/u/10833722?v=4' width='36' height='36' alt='@sylvainfaivre'>|[@sylvainfaivre](https://github.com/sylvainfaivre)|2
<img class='float-left rounded-1' src='https://avatars1.githubusercontent.com/u/639906?v=4' width='36' height='36' alt='@syphernl'>|[@syphernl](https://github.com/syphernl)|1
<img class='float-left rounded-1' src='https://avatars1.githubusercontent.com/u/4488681?v=4' width='36' height='36' alt='@frots'>|[@frots](https://github.com/frots)|1
<img class='float-left rounded-1' src='https://avatars3.githubusercontent.com/u/1511294?v=4' width='36' height='36' alt='@gustavobgama'>|[@gustavobgama](https://github.com/gustavobgama)|1
<img class='float-left rounded-1' src='https://avatars1.githubusercontent.com/u/12174604?v=4' width='36' height='36' alt='@jaygorrell'>|[@jaygorrell](https://github.com/jaygorrell)|1
<img class='float-left rounded-1' src='https://avatars3.githubusercontent.com/u/5306980?v=4' width='36' height='36' alt='@johnkeates'>|[@johnkeates](https://github.com/johnkeates)|1
<img class='float-left rounded-1' src='https://avatars3.githubusercontent.com/u/354768?v=4' width='36' height='36' alt='@jeffrey4l'>|[@jeffrey4l](https://github.com/jeffrey4l)|1
<img class='float-left rounded-1' src='https://avatars0.githubusercontent.com/u/1011603?v=4' width='36' height='36' alt='@martinhoefling'>|[@martinhoefling](https://github.com/martinhoefling)|1
<img class='float-left rounded-1' src='https://avatars3.githubusercontent.com/u/7288501?v=4' width='36' height='36' alt='@mgar'>|[@mgar](https://github.com/mgar)|1
<img class='float-left rounded-1' src='https://avatars2.githubusercontent.com/u/91293?v=4' width='36' height='36' alt='@whiteinge'>|[@whiteinge](https://github.com/whiteinge)|1
<img class='float-left rounded-1' src='https://avatars2.githubusercontent.com/u/56102?v=4' width='36' height='36' alt='@soniah'>|[@soniah](https://github.com/soniah)|1
<img class='float-left rounded-1' src='https://avatars1.githubusercontent.com/u/117961?v=4' width='36' height='36' alt='@babilen5'>|[@babilen5](https://github.com/babilen5)|1
<img class='float-left rounded-1' src='https://avatars0.githubusercontent.com/u/228723?v=4' width='36' height='36' alt='@abednarik'>|[@abednarik](https://github.com/abednarik)|1
<img class='float-left rounded-1' src='https://avatars1.githubusercontent.com/u/10587402?v=4' width='36' height='36' alt='@dnABic'>|[@dnABic](https://github.com/dnABic)|1
<img class='float-left rounded-1' src='https://avatars1.githubusercontent.com/u/23185845?v=4' width='36' height='36' alt='@necabo'>|[@necabo](https://github.com/necabo)|1
---
Auto-generated by a [forked version](https://github.com/myii/maintainer) of [gaocegege/maintainer](https://github.com/gaocegege/maintainer) on 2020-02-18.
=======
<img class='float-left rounded-1' src='https://avatars.githubusercontent.com/u/10231489?v=4' width='36' height='36' alt='@myii'>|[@myii](https://github.com/myii)|66
<img class='float-left rounded-1' src='https://avatars.githubusercontent.com/u/1396878?v=4' width='36' height='36' alt='@gravyboat'>|[@gravyboat](https://github.com/gravyboat)|11
<img class='float-left rounded-1' src='https://avatars.githubusercontent.com/u/52996?v=4' width='36' height='36' alt='@daks'>|[@daks](https://github.com/daks)|6
......
# 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
......
Copyright (c) 2013 Salt Stack Formulas
Copyright (c) 2021 Salt Stack Formulas
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
......@@ -11,4 +11,3 @@
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
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],
'body-max-line-length': [2, 'always', 1120],
'footer-max-line-length': [2, 'always', 584],
'header-max-length': [2, 'always', 82],
},
};
.. _contributing_docs:
Contributing documentation
==========================
|docs|
.. |docs| image:: https://readthedocs.org/projects/docs/badge/?version=latest
:alt: Documentation Status
:scale: 100%
:target: https://rabbitmq-formula.readthedocs.io/en/latest/?badge=latest
Toolchain
^^^^^^^^^
The documentation for this formula is written in
`reStructuredText <https://en.wikipedia.org/wiki/ReStructuredText>`_
(also known as RST, ReST, or reST).
It is built by
`Sphinx <https://en.wikipedia.org/wiki/Sphinx_(documentation_generator)>`_
and hosted on
`Read the Docs <https://en.wikipedia.org/wiki/Read_the_Docs>`_.
Adding a new page
^^^^^^^^^^^^^^^^^
Adding a new page involves two steps:
#. Use the
:ref:`provided page template <saltstack_formulas_rst_page_template>`
to create a new page.
#. Add the page name under the ``toctree`` list in ``index.rst``.
a. Do not just append it to the list.
#. Select the best place where it fits within the overall documentation.
.. _saltstack_formulas_rst_page_template:
SaltStack-Formulas' RST page template
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Use the following template when creating a new page.
This ensures consistency across the documentation for this formula.
The heading symbols have been selected in accordance to the output rendered by the
`Markdown to reStructuredText converter <https://github.com/miyakogi/m2r#restrictions>`_
we are using for some of the pages of this documentation.
.. code-block:: rst
.. _template:
[Page title]
============
[Introductory paragraph]
.. contents:: **Table of Contents**
[Heading 2]
-----------
[Heading 3]
^^^^^^^^^^^
[Heading 4]
~~~~~~~~~~~
[Heading 5]
"""""""""""
[Heading 6]
###########
#. The first line is an anchor that can be used to link back to (the top of)
this file.
a. Change this to be the lowercase version of the file name.
#. Do not include the ``.rst`` file extension.
#. Use hyphens (``-``) instead of spaces or non-letter characters.
#. Change the ``[Page title]`` accordingly, matching the same number of equals
signs (``=``) underneath.
#. Change the ``[Introductory paragraph]`` to be a short summary of the page
content.
Use no more than three paragraphs for this.
#. Leave the ``..contents:: **Table of Contents**`` line as it is.
#. Use the remaining headings as required to break up the page content.
a. You will rarely need to use beyond ``[Heading 4]``.
#. Again, no single heading should have more than about three paragraphs of
content before the next heading or sub-heading is used.
Obviously, it is not necessary to follow the steps in the order above.
For example, it is usually easier to write the ``[Introductory paragraph]``
at the end.
......@@ -3,7 +3,7 @@
rabbitmq-formula
================
|img_travis| |img_sr|
|img_travis| |img_sr| |img_pc|
.. |img_travis| image:: https://travis-ci.com/saltstack-formulas/rabbitmq-formula.svg?branch=master
:alt: Travis CI Build Status
......@@ -13,10 +13,15 @@ rabbitmq-formula
:alt: Semantic Release
:scale: 100%
:target: https://github.com/semantic-release/semantic-release
.. |img_pc| image:: https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white
:alt: pre-commit
:scale: 100%
:target: https://github.com/pre-commit/pre-commit
This formula installs and configures the RabbitMQ server.
This formula installs and configures RabbitMQ server on GNU/Linux.
.. contents:: **Table of Contents**
:depth: 1
General notes
-------------
......@@ -32,15 +37,33 @@ which contains the currently released version. This formula is versioned accordi
See `Formula Versioning Section <https://docs.saltstack.com/en/latest/topics/development/conventions/formulas.html#versioning>`_ for more details.
If you need (non-default) configuration, please pay attention to the ``pillar.example`` file and/or `Special notes`_ section.
If you need (non-default) configuration, please refer to:
- `how to configure the formula with map.jinja <map.jinja.rst>`_
- the ``pillar.example`` file
- the `Special notes`_ section
Contributing to this repo
-------------------------
Commit messages
^^^^^^^^^^^^^^^
**Commit message formatting is significant!!**
Please see `How to contribute <https://github.com/saltstack-formulas/.github/blob/master/CONTRIBUTING.rst>`_ for more details.
pre-commit
^^^^^^^^^^
`pre-commit <https://pre-commit.com/>`_ is configured for this formula, which you may optionally use to ease the steps involved in submitting your changes.
First install the ``pre-commit`` package manager using the appropriate `method <https://pre-commit.com/#installation>`_, then run ``bin/install-hooks`` and
now ``pre-commit`` will run automatically on each ``git commit``. ::
$ bin/install-hooks
pre-commit installed at .git/hooks/pre-commit
pre-commit installed at .git/hooks/commit-msg
Special notes
-------------
......@@ -55,18 +78,68 @@ Available states
``rabbitmq``
^^^^^^^^^^^^
Install rabbitmq-server and make sure that service is running.
*Meta-state (This is a state that includes other states)*.
This installs the rabbitmq package,
manages the rabbitmq configuration file and then
starts the associated rabbitmq service.
``rabbitmq.package``
^^^^^^^^^^^^^^^^^^^^
This state will install the rabbitmq package and has a dependency on ``rabbitmq.install``
via include list.
``rabbitmq.rabbitmqadmin``
^^^^^^^^^^^^^^^^^^^^^^^^^^
This state will install the rabbitmqadmin package only.
``rabbitmq.config``
^^^^^^^^^^^^^^^^^^^
Configure rabbitmq server via pillar. See pillar.example.
This state will configure the rabbitmq service and has a dependency on ``rabbitmq.install``
via include list. See ``pillar.example``.
``rabbitmq.latest``
^^^^^^^^^^^^^^^^^^^
``rabbitmq.service``
^^^^^^^^^^^^^^^^^^^^
This state will start the rabbitmq service and has a dependency on ``rabbitmq.config``
via include list.
``rabbitmq.clean``
^^^^^^^^^^^^^^^^^^
*Meta-state (This is a state that includes other states)*.
this state will undo everything performed in the ``rabbitmq`` meta-state in reverse order, i.e.
stops the service,
removes the configuration file and
then uninstalls the package.
``rabbitmq.service.clean``
^^^^^^^^^^^^^^^^^^^^^^^^^^
This state will stop the rabbitmq service and disable it at boot time.
Install latest rabbitmq from vendor repositories instead of version bundled with distribution. Use instead of rabbitmq state.
``rabbitmq.rabbitmqadmin.clean``
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
This state will remote the rabbitmqadmin package only.
``rabbitmq.config.clean``
^^^^^^^^^^^^^^^^^^^^^^^^^
This state will remove the configuration of the rabbitmq service and has a
dependency on ``rabbitmq.service.clean`` via include list.
``rabbitmq.package.clean``
^^^^^^^^^^^^^^^^^^^^^^^^^^
This state will remove the rabbitmq package and has a depency on
``rabbitmq.config.clean`` via include list.
*Meta-state (This is a state that includes other states)*.
Testing
-------
......@@ -91,7 +164,7 @@ e.g. ``debian-9-2019-2-py3``.
``bin/kitchen converge``
^^^^^^^^^^^^^^^^^^^^^^^^
Creates the docker instance and runs the ``template`` main state, ready for testing.
Creates the docker instance and runs the ``rabbitmq`` main state, ready for testing.
``bin/kitchen verify``
^^^^^^^^^^^^^^^^^^^^^^
......@@ -112,4 +185,3 @@ Runs all of the stages above in one go: i.e. ``destroy`` + ``converge`` + ``veri
^^^^^^^^^^^^^^^^^^^^^
Gives you SSH access to the instance for manual testing.
.. _tofs_pattern:
TOFS: A pattern for using SaltStack
===================================
.. list-table::
:name: tofs-authors
:header-rows: 1
:stub-columns: 1
:widths: 2,2,3,2
* -
- Person
- Contact
- Date
* - Authored by
- Roberto Moreda
- moreda@allenta.com
- 29/12/2014
* - Modified by
- Daniel Dehennin
- daniel.dehennin@baby-gnu.org
- 07/02/2019
* - Modified by
- Imran Iqbal
- https://github.com/myii
- 23/02/2019
All that follows is a proposal based on my experience with `SaltStack <http://www.saltstack.com/>`_. The good thing of a piece of software like this is that you can "bend it" to suit your needs in many possible ways, and this is one of them. All the recommendations and thoughts are given "as it is" with no warranty of any type.
.. contents:: **Table of Contents**
Usage of values in pillar vs templates in ``file_roots``
--------------------------------------------------------
Among other functions, the *master* (or *salt-master*) serves files to the *minions* (or *salt-minions*). The `file_roots <http://docs.saltstack.com/en/latest/ref/file_server/file_roots.html>`_ is the list of directories used in sequence to find a file when a minion requires it: the first match is served to the minion. Those files could be `state files <http://docs.saltstack.com/en/latest/topics/tutorials/starting_states.html>`_ or configuration templates, among others.
Using SaltStack is a simple and effective way to implement configuration management, but even in a `non-multitenant <http://en.wikipedia.org/wiki/Multitenancy>`_ scenario, it is not a good idea to generally access some data (e.g. the database password in our `Zabbix <http://www.zabbix.com/>`_ server configuration file or the private key of our `Nginx <http://nginx.org/en/>`_ TLS certificate).
To avoid this situation we can use the `pillar mechanism <http://docs.saltstack.com/en/latest/topics/pillar/>`_, which is designed to provide controlled access to data from the minions based on some selection rules. As pillar data could be easily integrated in the `Jinja <http://docs.saltstack.com/en/latest/topics/tutorials/pillar.html>`_ templates, it is a good mechanism to store values to be used in the final rendering of state files and templates.
There are a variety of approaches on the usage of pillar and templates as seen in the `saltstack-formulas <https://github.com/saltstack-formulas>`_' repositories. `Some <https://github.com/saltstack-formulas/nginx-formula/pull/18>`_ `developments <https://github.com/saltstack-formulas/php-formula/pull/14>`_ stress the initial purpose of pillar data into a storage for most of the possible variables for a determined system configuration. This, in my opinion, is shifting too much load from the original template files approach. Adding up some `non-trivial Jinja <https://github.com/saltstack-formulas/nginx-formula/blob/f74254c07e188bd448eaf1c5f9c802d78c4c005e/nginx/files/default/nginx.conf>`_ code as essential part of composing the state file definitely makes SaltStack state files (hence formulas) more difficult to read. The extreme of this approach is that we could end up with a new render mechanism, implemented in Jinja, storing everything needed in pillar data to compose configurations. Additionally, we are establishing a strong dependency with the Jinja renderer.
In opposition to the *put the code in file_roots and the data in pillars* approach, there is the *pillar as a store for a set of key-values* approach. A full-blown configuration file abstracted in pillar and jinja is complicated to develop, understand and maintain. I think a better and simpler approach is to keep a configuration file templated using just a basic (non-extensive but extensible) set of pillar values.
On the reusability of SaltStack state files
-------------------------------------------
There is a brilliant initiative of the SaltStack community called `salt-formulas <https://github.com/saltstack-formulas>`_. Their goal is to provide state files, pillar examples and configuration templates ready to be used for provisioning. I am a contributor for two small ones: `zabbix-formula <https://github.com/saltstack-formulas/zabbix-formula>`_ and `varnish-formula <https://github.com/saltstack-formulas/varnish-formula>`_.
The `design guidelines <http://docs.saltstack.com/en/latest/topics/development/conventions/formulas.html>`_ for formulas are clear in many aspects and it is a recommended reading for anyone willing to write state files, even non-formulaic ones.
In the next section, I am going to describe my proposal to extend further the reusability of formulas, suggesting some patterns of usage.
The Template Override and Files Switch (TOFS) pattern
-----------------------------------------------------
I understand a formula as a **complete, independent set of SaltStack state and configuration template files sufficient to configure a system**. A system could be something as simple as an NTP server or some other much more complex service that requires many state and configuration template files.
The customization of a formula should be done mainly by providing pillar data used later to render either the state or the configuration template files.
Example: NTP before applying TOFS
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Let's work with the NTP example. A basic formula that follows the `design guidelines <http://docs.saltstack.com/en/latest/topics/development/conventions/formulas.html>`_ has the following files and directories tree:
.. code-block:: console
/srv/saltstack/salt-formulas/ntp-saltstack-formula/
ntp/
map.jinja
init.sls
conf.sls
files/
default/
etc/
ntp.conf.jinja
In order to use it, let's assume a `masterless configuration <http://docs.saltstack.com/en/latest/topics/tutorials/quickstart.html>`_ and this relevant section of ``/etc/salt/minion``:
.. code-block:: yaml
pillar_roots:
base:
- /srv/saltstack/pillar
file_client: local
file_roots:
base:
- /srv/saltstack/salt
- /srv/saltstack/salt-formulas/ntp-saltstack-formula
.. code-block:: jinja
{#- /srv/saltstack/salt-formulas/ntp-saltstack-formula/ntp/map.jinja #}
{%- set ntp = salt['grains.filter_by']({
'default': {
'pkg': 'ntp',
'service': 'ntp',
'config': '/etc/ntp.conf',
},
}, merge=salt['pillar.get']('ntp:lookup')) %}
In ``init.sls`` we have the minimal states required to have NTP configured. In many cases ``init.sls`` is almost equivalent to an ``apt-get install`` or a ``yum install`` of the package.
.. code-block:: sls
## /srv/saltstack/salt-formulas/ntp-saltstack-formula/ntp/init.sls
{%- from 'ntp/map.jinja' import ntp with context %}
Install NTP:
pkg.installed:
- name: {{ ntp.pkg }}
Enable and start NTP:
service.running:
- name: {{ ntp.service }}
- enabled: True
- require:
- pkg: Install NTP package
In ``conf.sls`` we have the configuration states. In most cases, that is just managing configuration file templates and making them to be watched by the service.
.. code-block:: sls
## /srv/saltstack/salt-formulas/ntp-saltstack-formula/ntp/conf.sls
include:
- ntp
{%- from 'ntp/map.jinja' import ntp with context %}
Configure NTP:
file.managed:
- name: {{ ntp.config }}
- template: jinja
- source: salt://ntp/files/default/etc/ntp.conf.jinja
- watch_in:
- service: Enable and start NTP service
- require:
- pkg: Install NTP package
Under ``files/default``, there is a structure that mimics the one in the minion in order to avoid clashes and confusion on where to put the needed templates. There you can find a mostly standard template for the configuration file.
.. code-block:: jinja
{#- /srv/saltstack/salt-formulas/ntp-saltstack-formula/ntp/files/default/etc/ntp.conf.jinja #}
{#- Managed by saltstack #}
{#- Edit pillars or override this template in saltstack if you need customization #}
{%- set settings = salt['pillar.get']('ntp', {}) %}
{%- set default_servers = ['0.ubuntu.pool.ntp.org',
'1.ubuntu.pool.ntp.org',
'2.ubuntu.pool.ntp.org',
'3.ubuntu.pool.ntp.org'] %}
driftfile /var/lib/ntp/ntp.drift
statistics loopstats peerstats clockstats
filegen loopstats file loopstats type day enable
filegen peerstats file peerstats type day enable
filegen clockstats file clockstats type day enable
{%- for server in settings.get('servers', default_servers) %}
server {{ server }}
{%- endfor %}
restrict -4 default kod notrap nomodify nopeer noquery
restrict -6 default kod notrap nomodify nopeer noquery
restrict 127.0.0.1
restrict ::1
With all this, it is easy to install and configure a simple NTP server by just running ``salt-call state.sls ntp.conf``: the package will be installed, the service will be running and the configuration should be correct for most of cases, even without pillar data.
Alternatively, you can define a highstate in ``/srv/saltstack/salt/top.sls`` and run ``salt-call state.highstate``.
.. code-block:: sls
## /srv/saltstack/salt/top.sls
base:
'*':
- ntp.conf
**Customizing the formula just with pillar data**, we have the option to define the NTP servers.
.. code-block:: sls
## /srv/saltstack/pillar/top.sls
base:
'*':
- ntp
.. code-block:: sls
## /srv/saltstack/pillar/ntp.sls
ntp:
servers:
- 0.ch.pool.ntp.org
- 1.ch.pool.ntp.org
- 2.ch.pool.ntp.org
- 3.ch.pool.ntp.org
Template Override
^^^^^^^^^^^^^^^^^
If the customization based on pillar data is not enough, we can override the template by creating a new one in ``/srv/saltstack/salt/ntp/files/default/etc/ntp.conf.jinja``
.. code-block:: jinja
{#- /srv/saltstack/salt/ntp/files/default/etc/ntp.conf.jinja #}
{#- Managed by saltstack #}
{#- Edit pillars or override this template in saltstack if you need customization #}
{#- Some bizarre configurations here #}
{#- ... #}
{%- for server in settings.get('servers', default_servers) %}
server {{ server }}
{%- endfor %}
This way we are locally **overriding the template files** offered by the formula in order to make a more complex adaptation. Of course, this could be applied as well to any of the files, including the state files.
Files Switch
^^^^^^^^^^^^
To bring some order into the set of template files included in a formula, as we commented, we suggest having a similar structure to a normal final file system under ``files/default``.
We can make different templates coexist for different minions, classified by any `grain <http://docs.saltstack.com/en/latest/topics/targeting/grains.html>`_ value, by simply creating new directories under ``files``. This mechanism is based on **using values of some grains as a switch for the directories under** ``files/``.
If we decide that we want ``os_family`` as switch, then we could provide the formula template variants for both the ``RedHat`` and ``Debian`` families.
.. code-block:: console
/srv/saltstack/salt-formulas/ntp-saltstack-formula/ntp/files/
default/
etc/
ntp.conf.jinja
RedHat/
etc/
ntp.conf.jinja
Debian/
etc/
ntp.conf.jinja
To make this work we need a ``conf.sls`` state file that takes a list of possible files as the configuration template.
.. code-block:: sls
## /srv/saltstack/salt-formulas/ntp-saltstack-formula/ntp/conf.sls
include:
- ntp
{%- from 'ntp/map.jinja' import ntp with context %}
Configure NTP:
file.managed:
- name: {{ ntp.config }}
- template: jinja
- source:
- salt://ntp/files/{{ grains.get('os_family', 'default') }}/etc/ntp.conf.jinja
- salt://ntp/files/default/etc/ntp.conf.jinja
- watch_in:
- service: Enable and start NTP service
- require:
- pkg: Install NTP package
If we want to cover the possibility of a special template for a minion identified by ``node01`` then we could have a specific template in ``/srv/saltstack/salt/ntp/files/node01/etc/ntp.conf.jinja``.
.. code-block:: jinja
{#- /srv/saltstack/salt/ntp/files/node01/etc/ntp.conf.jinja #}
{#- Managed by saltstack #}
{#- Edit pillars or override this template in saltstack if you need customization #}
{#- Some crazy configurations here for node01 #}
{#- ... #}
To make this work we could write a specially crafted ``conf.sls``.
.. code-block:: sls
## /srv/saltstack/salt-formulas/ntp-saltstack-formula/ntp/conf.sls
include:
- ntp
{%- from 'ntp/map.jinja' import ntp with context %}
Configure NTP:
file.managed:
- name: {{ ntp.config }}
- template: jinja
- source:
- salt://ntp/files/{{ grains.get('id') }}/etc/ntp.conf.jinja
- salt://ntp/files/{{ grains.get('os_family') }}/etc/ntp.conf.jinja
- salt://ntp/files/default/etc/ntp.conf.jinja
- watch_in:
- service: Enable and start NTP service
- require:
- pkg: Install NTP package
Using the ``files_switch`` macro
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
We can simplify the ``conf.sls`` with the new ``files_switch`` macro to use in the ``source`` parameter for the ``file.managed`` state.
.. code-block:: sls
## /srv/saltstack/salt-formulas/ntp-saltstack-formula/ntp/conf.sls
include:
- ntp
{%- set tplroot = tpldir.split('/')[0] %}
{%- from 'ntp/map.jinja' import ntp with context %}
{%- from 'ntp/libtofs.jinja' import files_switch %}
Configure NTP:
file.managed:
- name: {{ ntp.config }}
- template: jinja
- source: {{ files_switch(['/etc/ntp.conf.jinja'],
lookup='Configure NTP'
)
}}
- watch_in:
- service: Enable and start NTP service
- require:
- pkg: Install NTP package
* This uses ``config.get``, searching for ``ntp:tofs:source_files:Configure NTP`` to determine the list of template files to use.
* If this returns a result, the default of ``['/etc/ntp.conf.jinja']`` will be appended to it.
* If this does not yield any results, the default of ``['/etc/ntp.conf.jinja']`` will be used.
In ``libtofs.jinja``, we define this new macro ``files_switch``.
.. literalinclude:: ../template/libtofs.jinja
:caption: /srv/saltstack/salt-formulas/ntp-saltstack-formula/ntp/libtofs.jinja
:language: jinja
How to customise the ``source`` further
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The examples below are based on an ``Ubuntu`` minion called ``theminion`` being configured via. pillar.
Using the default settings of the ``files_switch`` macro above,
the ``source`` will be:
.. code-block:: sls
- source:
- salt://ntp/files/theminion/etc/ntp.conf.jinja
- salt://ntp/files/Debian/etc/ntp.conf.jinja
- salt://ntp/files/default/etc/ntp.conf.jinja
Customise ``files``
~~~~~~~~~~~~~~~~~~~
The ``files`` portion can be customised:
.. code-block:: sls
ntp:
tofs:
dirs:
files: files_alt
Resulting in:
.. code-block:: sls
- source:
- salt://ntp/files_alt/theminion/etc/ntp.conf.jinja
- salt://ntp/files_alt/Debian/etc/ntp.conf.jinja
- salt://ntp/files_alt/default/etc/ntp.conf.jinja
Customise the use of grains
~~~~~~~~~~~~~~~~~~~~~~~~~~~
Grains can be customised and even arbitrary paths can be supplied:
.. code-block:: sls
ntp:
tofs:
files_switch:
- any/path/can/be/used/here
- id
- os
- os_family
Resulting in:
.. code-block:: sls
- source:
- salt://ntp/files/any/path/can/be/used/here/etc/ntp.conf.jinja
- salt://ntp/files/theminion/etc/ntp.conf.jinja
- salt://ntp/files/Ubuntu/etc/ntp.conf.jinja
- salt://ntp/files/Debian/etc/ntp.conf.jinja
- salt://ntp/files/default/etc/ntp.conf.jinja
Customise the ``default`` path
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The ``default`` portion of the path can be customised:
.. code-block:: sls
ntp:
tofs:
dirs:
default: default_alt
Resulting in:
.. code-block:: sls
- source:
...
- salt://ntp/files/default_alt/etc/ntp.conf.jinja
Customise the list of ``source_files``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The list of ``source_files`` can be given:
.. code-block:: sls
ntp:
tofs:
source_files:
Configure NTP:
- '/etc/ntp.conf_alt.jinja'
Resulting in:
.. code-block:: sls
- source:
- salt://ntp/files/theminion/etc/ntp.conf_alt.jinja
- salt://ntp/files/theminion/etc/ntp.conf.jinja
- salt://ntp/files/Debian/etc/ntp.conf_alt.jinja
- salt://ntp/files/Debian/etc/ntp.conf.jinja
- salt://ntp/files/default/etc/ntp.conf_alt.jinja
- salt://ntp/files/default/etc/ntp.conf.jinja
Note: This does *not* override the default value.
Rather, the value from the pillar/config is prepended to the default.
Using sub-directories for ``components``
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
If your formula is composed of several components, you may prefer to provides files under sub-directories, like in the `systemd-formula <https://github.com/saltstack-formulas/systemd-formula>`_.
.. code-block:: console
/srv/saltstack/systemd-formula/
systemd/
init.sls
libtofs.jinja
map.jinja
networkd/
init.sls
files/
default/
network/
99-default.link
resolved/
init.sls
files/
default/
resolved.conf
timesyncd/
init.sls
files/
Arch/
resolved.conf
Debian/
resolved.conf
default/
resolved.conf
Ubuntu/
resolved.conf
For example, the following ``formula.component.config`` SLS:
.. code-block:: sls
{%- from "formula/libtofs.jinja" import files_switch with context %}
formula configuration file:
file.managed:
- name: /etc/formula.conf
- user: root
- group: root
- mode: 644
- template: jinja
- source: {{ files_switch(['formula.conf'],
lookup='formula',
use_subpath=True
)
}}
will be rendered on a ``Debian`` minion named ``salt-formula.ci.local`` as:
.. code-block:: sls
formula configuration file:
file.managed:
- name: /etc/formula.conf
- user: root
- group: root
- mode: 644
- template: jinja
- source:
- salt://formula/component/files/salt-formula.ci.local/formula.conf
- salt://formula/component/files/Debian/formula.conf
- salt://formula/component/files/default/formula.conf
- salt://formula/files/salt-formula.ci.local/formula.conf
- salt://formula/files/Debian/formula.conf
- salt://formula/files/default/formula.conf
/*
Override styles for in-use Sphinx theme
*/
/* The next two `.wy`-based rules are specifically needed for the dealing with */
/* the `sphinx_rtd_theme` bug where long lines do not wrap in tables */
/* override table width restrictions */
.wy-table-responsive table th
, .wy-table-responsive table td
{
/* !important prevents the common CSS stylesheets from
overriding this as on RTD they are loaded after this stylesheet */
white-space: normal !important;
}
.wy-table-responsive
{
overflow: visible !important;
}
# -*- coding: utf-8 -*-
"""Configuration file for the Sphinx documentation builder.
This file does only contain a selection of the most common options. For a
full list see the documentation:
* http://www.sphinx-doc.org/en/stable/config
"""
from __future__ import division, print_function, unicode_literals
# from datetime import datetime
from recommonmark.parser import CommonMarkParser
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
__author__ = 'Imran Iqbal' # noqa: E221
__copyright__ = 'Copyright (C) 2019, MYII' # noqa: E221
__license__ = 'Apache-2.0' # noqa: E221
__version__ = 'latest' # noqa: E221
__maintainer__ = 'Imran Iqbal' # noqa: E221
# -- Project information -----------------------------------------------------
project = 'rabbitmq-formula'
copyright = __copyright__.replace('Copyright (C) ', '') # noqa: A001
author = __author__
version = __version__
release = __version__
# -- General configuration ---------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.
#
# needs_sphinx = '1.0'
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = []
# Add any paths that contain templates here, relative to this directory.
templates_path = ['templates', '_templates', '.templates']
# The suffix(es) of source filenames.
# You can specify multiple suffix as a list of string:
#
source_suffix = ['.rst', '.md']
# The master toctree document.
master_doc = 'index'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#
# This is also used if you do content translation via gettext catalogs.
# Usually you set "language" from the command line for these cases.
language = None
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
# This pattern also affects html_static_path and html_extra_path .
exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'
# -- Options for the reStructuredText parser ---------------------------------
file_insertion_enabled = False
# -- Options for HTML output -------------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
#
html_theme = 'sphinx_rtd_theme'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
#
# html_theme_options = {}
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']
# Custom sidebar templates, must be a dictionary that maps document names
# to template names.
#
# The default sidebars (for documents that don't match any pattern) are
# defined by theme itself. Builtin themes are using these templates by
# default: ``['localtoc.html', 'relations.html', 'sourcelink.html',
# 'searchbox.html']``.
#
# html_sidebars = {}
# -- Options for HTMLHelp output ---------------------------------------------
# Output file base name for HTML help builder.
htmlhelp_basename = 'rabbitmq-formula'
# -- Options for Markdown output ---------------------------------------------
source_parsers = {
'.md': CommonMarkParser,
}
# -- Options for LaTeX output ------------------------------------------------
latex_elements = {
# The paper size ('letterpaper' or 'a4paper').
#
# 'papersize': 'letterpaper',
# The font size ('10pt', '11pt' or '12pt').
#
# 'pointsize': '10pt',
# Additional stuff for the LaTeX preamble.
#
# 'preamble': '',
# Latex figure (float) alignment
#
# 'figure_align': 'htbp',
}
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title,
# author, documentclass [howto, manual, or own class]).
latex_documents = [
(
'index',
'rabbitmq-formula.tex',
u'rabbitmq-formula Documentation',
u'',
'manual',
),
]
# -- Functions: `setup`, docstring preprocessing, etc. -----------------------
def setup(app):
"""Prepare the Sphinx application object.
Used for providing a custom CSS file for override styles.
Parameters
----------
app : object
The Sphinx application object.
Returns
-------
app : object
The Sphinx application object.
"""
app.add_stylesheet('css/custom.css')
return app
.. _index:
.. ``rabbitmq-formula`` documentation master file.
You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive.
Welcome to rabbitmq-formula's documentation!
============================================
.. toctree::
:maxdepth: 2
:caption: Contents
:numbered:
:glob:
README <README>
CONTRIBUTING
TOFS_pattern
AUTHORS
CHANGELOG
This diff is collapsed.
......@@ -308,50 +308,36 @@ verifier:
suites:
- name: default
excludes:
- gentoo-stage3-latest-master-py3
- gentoo-stage3-systemd-master-py3
- gentoo-stage3-latest-3002-5-py3
- gentoo-stage3-systemd-3002-5-py3
- gentoo-stage3-latest-3001-6-py3
- gentoo-stage3-systemd-3001-6-py3
- gentoo-stage3-latest-3000-8-py3
- gentoo-stage3-systemd-3000-8-py3
provisioner:
dependencies:
- name: files
path: ./test/salt
- name: states
path: ./test/salt
state_top:
base:
'*':
- rabbitmq._mapdata
- states.files
- rabbitmq
- rabbitmq.config_files
pillars:
top.sls:
base:
'*':
- rabbitmq
- define_roles
pillars_from_files:
rabbitmq.sls: pillar.example
verifier:
inspec_tests:
- path: test/integration/default
- name: latest
provisioner:
define_roles.sls: test/salt/pillar/define_roles.sls
dependencies:
- name: files
path: ./test/salt
- name: states
path: ./test/salt
state_top:
base:
'*':
- rabbitmq._mapdata
- states.files
- rabbitmq.latest
- rabbitmq.config_files
pillars:
top.sls:
base:
'*':
- rabbitmq
pillars_from_files:
rabbitmq.sls: pillar.example
verifier:
inspec_tests:
- path: test/integration/default
# -*- coding: utf-8 -*-
# vim: ft=yaml
---
rabbitmq:
# version: "3.5.3-1"
pkg:
# https://github.com/rabbitmq/rabbitmq-server/releases/tag/v3.8.14
use_upstream: repo # if available (i.e. packagecloud)
service:
enabled: true
running: true
config:
# see rabbitmq.conf.example from rabbitmq-server github docs
context: {}
env:
rabbitmq_mnesia_base: /opt/rabbitmq
locale_all: en_US.UTF-8
context:
rabbitmq_mnesia_base: /var/lib/rabbitmq
RABBITMQ_BASE: /var/lib/rabbitmq
dir:
base: /var/lib/rabbitmq
vhost:
- test_vhost
binding:
my-new-binding:
- destination_type: queue
- destination: my-new-queue
- routing_key: a_routing_key_string
- user: saltstack
- passwd: 'password'
- vhost: test_vhost
- arguments:
- 'x-message-ttl': 8640000
queue:
my-new-queue:
- user: saltstack
- passwd: 'password'
- durable: true
- auto_delete: false
- vhost: test_vhost
- arguments:
- 'x-message-ttl': 8640000
- 'x-expires': 8640000
- 'x-dead-letter-exchange': 'my-new-exchange'
exchange:
my-new-exchange:
- user: saltstack
- passwd: 'password'
- type: fanout
- durable: true
- internal: false
- auto_delete: false
- vhost: test_vhost
- arguments:
- 'alternate-**exchange': 'amq.fanout'
- 'test-header': 'testing'
cluster:
rabbit@locahost:
- user: rabbit
- host: localhost
- ram_node: None
- runas: root
plugin:
rabbitmq_management:
- enabled
runas: root
rabbitmq_federation:
runas: root
policy:
rabbitmq_policy:
- name: HA
- pattern: '.*'
- definition: '{"ha-mode": "all"}'
vhost:
vh_name: '/virtual/host'
# default guest user will be removed unless this is set to false
remove_guest_user: true
upstream:
upstream_1:
- uri: amqp://saltstack:password@localhost
- trust_user_id: true
- ack_mode: on-confirm
- max_hops: 1
user:
user1:
- password: password
......@@ -38,17 +106,51 @@ rabbitmq:
- '.*'
- '.*'
- runas: root
config_files:
# config_files, if you need some stuffs set directly in configuration
# files, rather than via the light modules available.
rabbitmq.conf:
# source is relative to `rabbitmq` formula
# source: templates/rabbitmq.conf
# or absolute in salt fileserver
source: salt://files/rabbitmq/rabbitmq.conf
# an optional map can be passed to the jinja template
context:
src_broker_uri: "amqp://user:pass@10.1.2.3"
# rabbitmqcfg.json:
# source: templates/relay-rabbitmqcfg.config
# # context: is optional map passed to the jinja template...
saltstack:
- password: password
- force: false
- tags:
- administrator
- perms:
- test_vhost:
- '.*'
- '.*'
- '.*'
- runas: root
tofs:
# The files_switch key serves as a selector for alternative
# directories under the formula files directory. See TOFS pattern
# doc for more info.
# Note: Any value not evaluated by `config.get` will be used literally.
# This can be used to set custom paths, as many levels deep as required.
files_switch:
- any/path/can/be/used/here
- id
- roles
- osfinger
- os
- os_family
# All aspects of path/file resolution are customisable using the options below.
# This is unnecessary in most cases; there are sensible defaults.
# Default path: salt://< path_prefix >/< dirs.files >/< dirs.default >
# I.e.: salt://rabbitmq/files/default
# path_prefix: template_alt
# dirs:
# files: files_alt
# default: default_alt
# The entries under `source_files` are prepended to the default source files
# given for the state
# source_files:
# rabbitmq-config-file-file-managed:
# - 'example_alt.tmpl'
# - 'example_alt.tmpl.jinja'
# For testing purposes
source_files:
rabbitmq-config-file-file-managed:
- 'example.tmpl.jinja'
# Just for testing purposes
winner: pillar
added_in_pillar: pillar_value
# -*- coding: utf-8 -*-
# vim: ft=sls
---
{#- Get the `tplroot` from `tpldir` #}
{%- set tplroot = tpldir.split("/")[0] %}
{%- from tplroot ~ "/package-map.jinja" import pkgs with context %}
{%- from tplroot ~ "/map.jinja" import mapdata with context %}
{%- set _mapdata = {
"values": pkgs,
"values": mapdata,
} %}
{%- do salt["log.debug"]("### MAP.JINJA DUMP ###\n" ~ _mapdata | yaml(False)) %}
......
# -*- coding: utf-8 -*-
# vim: ft=sls
include:
- .config.clean
- .rabbitmqadmin.clean
- .service.clean
- .package.clean
{#- Get the `tplroot` from `tpldir` #}
{%- set tplroot = tpldir.split('/')[0] %}
{% for name, plugin in salt["pillar.get"]("rabbitmq:plugin", {}).items() %}
{{ name }}:
rabbitmq_plugin:
{% for value in plugin %}
- {{ value }}
{% endfor %}
- runas: root
- require:
- pkg: rabbitmq-server
- file: rabbitmq_binary_tool_plugins
- watch_in:
- service: rabbitmq-server
{% endfor %}
{% for name, vhost in salt["pillar.get"]("rabbitmq:vhost", {}).items() %}
rabbitmq_vhost_{{ name }}:
rabbitmq_vhost.present:
- name: {{ vhost }}
- require:
- service: rabbitmq-server
{% endfor %}
{% for name, policy in salt["pillar.get"]("rabbitmq:policy", {}).items() %}
{{ name }}:
rabbitmq_policy.present:
{% for value in policy %}
- {{ value | json }}
{% endfor %}
- require:
- service: rabbitmq-server
{% endfor %}
{% for name, user in salt["pillar.get"]("rabbitmq:user", {}).items() %}
rabbitmq_user_{{ name }}:
rabbitmq_user.present:
- name: {{ name }}
{% for value in user %}
- {{ value | json }}
{% endfor %}
- require:
- service: rabbitmq-server
{% endfor %}
{% if salt['pillar.get']('rabbitmq:remove_guest_user', True) %}
rabbitmq_user_guest:
rabbitmq_user.absent:
- name: guest
{% endif %}
{%- if salt['pillar.get']('rabbitmq:env', None) %}
rabbitmq_env-file:
file.managed:
- name: /etc/rabbitmq/rabbitmq-env.conf
- source: salt://{{ tplroot }}/files/rabbitmq-env.conf
- template: jinja
- context:
env: {{ salt['pillar.get']('rabbitmq:env', {}) }}
- watch_in:
- service: rabbitmq-server
{%- endif %}
# -*- coding: utf-8 -*-
# vim: ft=sls
---
{%- set tplroot = tpldir.split('/')[0] %}
{%- from tplroot ~ "/map.jinja" import mapdata as rabbitmq with context %}
include:
- .file.clean
{%- if salt['cmd.run']('test -f {0}/bin/rabbitmqctl'.format(rabbitmq.dir.base)) %}
- .policy.clean
- .plugin.clean
- .upstream.clean
- .vhost.clean
- .user.clean
- .file.clean
{%- endif %}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment