Merge "Disable Sensu support by default"
diff --git a/README.rst b/README.rst
index 5aeb715..6a33d56 100644
--- a/README.rst
+++ b/README.rst
@@ -94,9 +94,69 @@
password: 'password'
policies:
- name: HA
- pattern: '^(?!amq\.).*'
+ pattern: '^(?!amq\.).*'
definition: '{"ha-mode": "all"}'
+
+
+Enable TLS support
+------------------
+
+The certs and private key passing:
+
+.. code-block:: yaml
+
+ rabbitmq:
+ server:
+ enabled: true
+ ...
+ ssl:
+ enabled: True
+
+ cacert_chain: |
+ -----BEGIN CERTIFICATE-----
+ ...
+ -----END CERTIFICATE-------
+
+ key: |
+ -----BEGIN RSA PRIVATE KEY-----
+ ...
+ -----END RSA PRIVATE KEY-------
+
+ cert: |
+ -----BEGIN CERTIFICATE-----
+ ...
+ -----END CERTIFICATE-------
+
+
+Also you can pass them via specifing a name of ca authority at salt master:
+
+.. code-block:: yaml
+
+ rabbitmq:
+ server:
+ enabled: true
+ ...
+ ssl:
+ enabled: True
+ authority: CA_Authority_Name
+
+In this case keys and certs will be pulled from:
+
+`salt://pki/{{ authority }}/certs/{ rabbitmq.{cert|key} | ca.cert }`
+
+--
+
+Defaut port for TLS is **5671**:
+
+.. code-block:: yaml
+
+ rabbitmq:
+ server:
+ bind:
+ ssl:
+ port: 5671
+
Usage
=====
@@ -105,9 +165,9 @@
.. code-block:: yaml
> rabbitmqctl cluster_status
-
+
Cluster status of node 'rabbit@ctl-1' ...
- [{nodes,[{disc,['rabbit@ctl-1','rabbit@ctl-2','rabbit@ctl-3']}]},
+ [{nodes,[{disc,['rabbit@ctl-1','rabbit@ctl-2','rabbit@ctl-3']}]},
{running_nodes,['rabbit@ctl-3','rabbit@ctl-2','rabbit@ctl-1']},
{partitions,[]}]
...done.
diff --git a/rabbitmq/files/rabbitmq.config b/rabbitmq/files/rabbitmq.config
index 2d567f1..8f693f0 100644
--- a/rabbitmq/files/rabbitmq.config
+++ b/rabbitmq/files/rabbitmq.config
@@ -19,39 +19,40 @@
{cluster_nodes, {[{% for node in cluster.members %}'rabbit@{{ node.name }}'{% if not loop.last %}, {% endif %}{% endfor %}], {{ cluster.mode }}}},
{%- endif %}
{loopback_users, []},
- {tcp_listeners, [{"{{ server.bind.address }}",{{ server.bind.port }}}]}
- {%- if server.get('ssl', {}).get('enabled', False) %},
+ {tcp_listeners, [{"{{ server.bind.address }}",{{ server.bind.port }}}]},
+ {%- if server.get('ssl', {}).get('enabled', False) %}
{ssl_listeners, [{"{{ server.bind.get('ssl', {}).get('address', server.bind.address) }}",{{ server.bind.get('ssl', {}).get('port', 5671) }}}]},
- {ssl_options, [{cacertfile,"{{ server.ssl.get('ca_file', '/etc/rabbitmq/ssl/cacert.pem') }}"},
- {certfile,"{{ server.ssl.get('cert_file', '/etc/rabbitmq/ssl/cert.pem') }}"},
- {keyfile,"{{ server.ssl.get('key_file', '/etc/rabbitmq/ssl/key.pem') }}"},
+ {ssl_options, [{cacertfile,"{{ server.ssl.ca_file }}"},
+ {certfile,"{{ server.ssl.cert_file }}"},
+ {keyfile,"{{ server.ssl.key_file }}"},
{verify,verify_{{ server.ssl.get('verify', 'peer') }}},
- {versions, [{% if server.ssl.versions is defined %}{% for version in server.ssl.versions %}'{{ version }}'{% if not loop.last %},{% endif %}{% endfor %}{% else %}'tlsv1.2', 'tlsv1.1'{% endif %}]},
+ {versions, ['{{ server.ssl.versions | join("', '") }}']},
{%- if server.ssl.ciphers is defined %}
- {ciphers,[{% for ciph in server.ssl.ciphers %}{ {{ ciph }} }{% if not loop.last %},{% endif %}{% endfor %}]},
+ {ciphers,[ {{ server.ssl.ciphers | join(',') }} ]},
{%- endif %}
- {fail_if_no_peer_cert,false}]
- }
+ {fail_if_no_peer_cert,false}]}
+
{% endif %}
+
]
}
{%- if 'rabbitmq_management' in server.plugins %},
{rabbitmq_management,
[{listener, [{port, {{ server.management.bind.port }} },
{ip, "{{ server.management.bind.address }}" }
+
{%- if server.management.get('ssl', {}).get('enabled', False) %},
{ssl,true},
- {ssl_opts, [{cacertfile,"{{ server.management.ssl.get('ca_file', '/etc/rabbitmq/ssl/cacert.pem') }}"},
- {certfile,"{{ server.management.ssl.get('cert_file', '/etc/rabbitmq/ssl/cert.pem') }}"},
- {keyfile,"{{ server.management.ssl.get('key_file', '/etc/rabbitmq/ssl/key.pem') }}"},
- {%- if server.ssl.ciphers is defined %}
- {ciphers,[{% for ciph in server.ssl.ciphers %}{ {{ ciph }} }{% if not loop.last %},{% endif %}{% endfor %}]},
- {%- endif %}
- {versions, [{% if server.ssl.versions is defined %}{% for version in server.ssl.versions %}'{{ version }}'{% if not loop.last %},{% endif %}{% endfor %}{% else %}'tlsv1.2', 'tlsv1.1'{% endif %}]}]}
- {%- endif %}
- ]
- }]
- }
+ {ssl_opts, [{cacertfile,"{{ server.ssl.ca_file }}"},
+ {certfile,"{{ server.ssl.cert_file }}"},
+ {keyfile,"{{ server.ssl.key_file }}"},
+ {verify,verify_{{ server.ssl.get('verify', 'peer') }}},
+ {versions,[ "{{ server.ssl.versions | join('", "') }}" ]},
+ {%- if server.ssl.ciphers is defined %}
+ {ciphers,[ {{ server.ssl.ciphers | join(',') }} ]},
+ {%- endif %}]}
+ {%- endif %}
+ ]}]}
{%- endif %}
].
{#-
diff --git a/rabbitmq/files/ssl/all_file.pem.j2 b/rabbitmq/files/ssl/all_file.pem.j2
new file mode 100644
index 0000000..004f7cc
--- /dev/null
+++ b/rabbitmq/files/ssl/all_file.pem.j2
@@ -0,0 +1,2 @@
+{% include ssl_key_file %}
+{% include ssl_crt_file %}
diff --git a/rabbitmq/files/ssl/ssl_env.conf.j2 b/rabbitmq/files/ssl/ssl_env.conf.j2
new file mode 100644
index 0000000..2475655
--- /dev/null
+++ b/rabbitmq/files/ssl/ssl_env.conf.j2
@@ -0,0 +1,7 @@
+# Obtaining of an Erlang ssl library path
+export HOME="/var/lib/rabbitmq/"
+ERL_SSL_PATH=`erl -eval 'io:format("~p", [code:lib_dir(ssl, ebin)]),halt().' -noshell`
+
+# Add SSL-related environment vars for rabbitmq-server and rabbitmqctl
+SERVER_ADDITIONAL_ERL_ARGS="-pa $ERL_SSL_PATH -proto_dist inet_tls -ssl_dist_opt server_certfile {{ all_file }} -ssl_dist_opt server_secure_renegotiate true client_secure_renegotiate true server_cacertfile {{ ca_file }}"
+CTL_ERL_ARGS="$SERVER_ADDITIONAL_ERL_ARGS"
diff --git a/rabbitmq/map.jinja b/rabbitmq/map.jinja
index 35586ca..1da966d 100644
--- a/rabbitmq/map.jinja
+++ b/rabbitmq/map.jinja
@@ -1,9 +1,15 @@
-
{% set server = salt['grains.filter_by']({
- 'Arch': {
- 'pkgs': ['rabbitmq'],
- 'service': 'rabbitmq',
+ 'default': {
+ 'ssl': {
+ 'enabled': False,
+ 'versions': ['tlsv1.2','tlsv1.1','tlsv1'],
+ 'ca_file': '/etc/rabbitmq/ssl/ca.pem',
+ 'cert_file': '/etc/rabbitmq/ssl/cert.pem',
+ 'key_file': '/etc/rabbitmq/ssl/key.pem',
+ 'all_file': '/etc/rabbitmq/ssl/all_file.pem'
+ },
'config_file': '/etc/rabbitmq/rabbitmq.config',
+ 'env_file': '/etc/rabbitmq/rabbitmq-env.conf',
'cookie_file': '/var/lib/rabbitmq/.erlang.cookie',
'ulimit': 8192,
'disk_free_limit': 50000000,
@@ -19,59 +25,27 @@
'bind': {
'address': '127.0.0.1',
'port': '15672'
- },
- },
+ }
+ }
+ },
+ 'Arch': {
+ 'pkgs': ['rabbitmq'],
+ 'service': 'rabbitmq'
},
'Debian': {
'pkgs': ['rabbitmq-server', 'gettext-base'],
'service': 'rabbitmq-server',
- 'config_file': '/etc/rabbitmq/rabbitmq.config',
- 'cookie_file': '/var/lib/rabbitmq/.erlang.cookie',
- 'default_file': '/etc/default/rabbitmq-server',
- 'ulimit': 8192,
- 'disk_free_limit': 50000000,
- 'bind': {
- 'address': '0.0.0.0',
- 'port': '5672',
- 'ssl': {
- 'address': '0.0.0.0',
- 'port': '5671'
- },
- },
- 'management': {
- 'bind': {
- 'address': '127.0.0.1',
- 'port': '15672'
- },
- },
+ 'default_file': '/etc/default/rabbitmq-server'
},
'RedHat': {
'pkgs': ['rabbitmq-server'],
- 'service': 'rabbitmq-server',
- 'config_file': '/etc/rabbitmq/rabbitmq.config',
- 'cookie_file': '/var/lib/rabbitmq/.erlang.cookie',
- 'ulimit': 8192,
- 'disk_free_limit': 50000000,
- 'bind': {
- 'address': '0.0.0.0',
- 'port': '5672',
- 'ssl': {
- 'address': '0.0.0.0',
- 'port': '5671'
- },
- },
- 'management': {
- 'bind': {
- 'address': '127.0.0.1',
- 'port': '15672'
- },
- },
+ 'service': 'rabbitmq-server'
},
-}, merge=pillar.rabbitmq.get('server', {})) %}
+}, merge=pillar.rabbitmq.get('server', {}), base='default') %}
{% set cluster = pillar.rabbitmq.get('cluster', {}) %}
{%- set rabbitmq_users = {} %}
{%- for host_name, host in server.get('host', {}).iteritems() %}
{%- do rabbitmq_users.update({host.user: [host]}) %}
-{%- endfor %}
+{%- endfor %}
\ No newline at end of file
diff --git a/rabbitmq/server/init.sls b/rabbitmq/server/init.sls
index 20c5691..e6731bf 100644
--- a/rabbitmq/server/init.sls
+++ b/rabbitmq/server/init.sls
@@ -1,5 +1,7 @@
include:
- rabbitmq.server.service
+- rabbitmq.server.ssl
+
{%- if not grains.get('noservices', False) %}
- rabbitmq.server.plugin
- rabbitmq.server.vhost
diff --git a/rabbitmq/server/service.sls b/rabbitmq/server/service.sls
index 15cdb79..9fff053 100644
--- a/rabbitmq/server/service.sls
+++ b/rabbitmq/server/service.sls
@@ -107,6 +107,13 @@
- name: {{ server.service }}
- watch:
- file: rabbitmq_config
+ {% if server.ssl.enabled %}
+ - file: rabbitmq_cacertificate
+ - file: rabbitmq_certificate
+ - file: rabbitmq_server_key
+ - file: rabbitmq_ssl_all_file
+ - file: rabbitmq_ssl_env
+ {%- endif %}
{%- endif %}
{%- if grains.get('virtual_subtype', None) == "Docker" %}
diff --git a/rabbitmq/server/ssl.sls b/rabbitmq/server/ssl.sls
new file mode 100644
index 0000000..b4f5567
--- /dev/null
+++ b/rabbitmq/server/ssl.sls
@@ -0,0 +1,74 @@
+{%- from "rabbitmq/map.jinja" import server with context %}
+
+{%- if server.ssl.enabled %}
+
+rabbitmq_cacertificate:
+ file.managed:
+ - name: {{ server.ssl.ca_file }}
+ {%- if server.ssl.cacert_chain is defined %}
+ - contents_pillar: rabbitmq:server:ssl:cacert_chain
+ {%- else %}
+ - source: salt://pki/{{ server.ssl.authority }}/certs/ca.cert
+ {%- endif %}
+ - user: root
+ - group: rabbitmq
+ - mode: 640
+ - makedirs: true
+
+rabbitmq_certificate:
+ file.managed:
+ - name: {{ server.ssl.cert_file }}
+ {%- if server.ssl.cert is defined %}
+ - contents_pillar: rabbitmq:server:ssl:cert
+ {%- else %}
+ - source: salt://pki/{{ server.ssl.authority }}/certs/rabbitmq.cert
+ {%- endif %}
+ - user: root
+ - group: rabbitmq
+ - mode: 640
+ - makedirs: true
+
+rabbitmq_server_key:
+ file.managed:
+ - name: {{ server.ssl.key_file }}
+ {%- if server.ssl.key is defined %}
+ - contents_pillar: rabbitmq:server:ssl:key
+ {%- else %}
+ - source: salt://pki/{{ server.ssl.authority }}/certs/rabbitmq.key
+ {%- endif %}
+ - user: root
+ - group: rabbitmq
+ - mode: 640
+ - makedirs: true
+
+# consist of private key and cert
+rabbitmq_ssl_all_file:
+ file.managed:
+ - name: {{ server.ssl.all_file }}
+ - source: salt://rabbitmq/files/ssl/all_file.pem.j2
+ - template: jinja
+ - user: root
+ - group: rabbitmq
+ - mode: 640
+ - makedirs: true
+ - context:
+ ssl_key_file: {{ server.ssl.key_file }}
+ ssl_crt_file: {{ server.ssl.cert_file }}
+ - watch:
+ - file: rabbitmq_server_key
+ - file: rabbitmq_certificate
+
+rabbitmq_ssl_env:
+ file.managed:
+ - name: {{ server.env_file }}
+ - source: salt://rabbitmq/files/ssl/ssl_env.conf.j2
+ - template: jinja
+ - user: root
+ - group: rabbitmq
+ - mode: 640
+ - makedirs: true
+ - context:
+ all_file: {{ server.ssl.all_file }}
+ ca_file: {{ server.ssl.ca_file }}
+
+{%- endif %}