forked from cognifloyd/ansible-st2
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add ability to enable mongo auth and add users
Adds auth to mongo when the mongodb_auth_enable flag is true. Any additional users should be passed in via mongodb_users. There are several other default variables as well (like mongodb_host, mongodb_port) that can be overridden in the play or inventory that uses this role. This does not attempt to generate any passwords. It only adds users if explicitly requested, but allows external tasks/roles to import the mongodb_auth.yml tasks to add users as required after mongo is installed. This uses lineinfile to edit mongod.conf with regexs to catch as many edge cases in yaml formatting (spaces, quotes) as possible. Also, this uses a bit of python to validate that the yaml file was modified in such a way that it is still valid yaml, and the entries intrduced in the file are present as expected. This uses the mongo shell to see if authorization is required before adding the admin user. This should handle cases such as the localhost exception in a new install or upgrades where auth is not enabled or upgrades where auth is enabled. As explained in comments, we only update mongo user passwords on_create because that is the only way to maintain idempotency. This should be idempotent. Part of StackStorm#75.
- Loading branch information
1 parent
86a1cec
commit e6d16d3
Showing
6 changed files
with
228 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,64 @@ | ||
Ansible Role: stackstorm.mongodb | ||
================================ | ||
|
||
Installs MongoDB. If the `mongodb_auth_enable` boolean is enabled, then this also enables authentication, adds an admin | ||
user, and adds any other users defined in `mongodb_users`. | ||
|
||
Requirements | ||
------------ | ||
|
||
Enabling mongo auth requires the pymongo python module (requirement of the mongo_users ansible module). | ||
Enabling mongo auth also requires PyYAML to validate changes to mongod.conf. | ||
|
||
Role Variables | ||
-------------- | ||
|
||
These default variables can be set in the inventory's group or host vars, or pass them in as vars in the playbook that | ||
uses this role. An example of passing in some of these vars is shown in an example playbook below. | ||
|
||
* `mongodb_version`: The major.minor version to install (only 3.4 or 3.2 are supported). | ||
* `mongodb_enable_auth`: Whether or not to enable auth in mongodb (default: no) | ||
* `mongodb_host`: Login to this host to add users (default '127.0.0.1') | ||
* `mongodb_port`: Login on this port to add users (default '27017') | ||
* `mongodb_admin_username`: The admin's username (default 'admin') | ||
* `mongodb_admin_password`: The admin's password (default: generate a random password and store it in a file) | ||
* `mongodb_users`: A list of users to add (see example playbook below; default: []) | ||
* `mongodb_creds_dir`: The directory that should hold any generated credentials like admin (default: '.') | ||
|
||
Dependencies | ||
------------ | ||
|
||
On RedHat family distributions, this depends on the stackstorm.epel role. | ||
|
||
Example Playbook | ||
---------------- | ||
|
||
This playbook installs mongo without enabling auth or adding any users: | ||
|
||
- hosts: localhost | ||
roles: | ||
- role: StackStorm.stackstorm/roles/mongodb | ||
|
||
|
||
This playbook installs mongo, enables auth, and adds a stackstorm user, and force update the password if it already exists: | ||
|
||
- hosts: localhost | ||
roles: | ||
- role: StackStorm.stackstorm/roles/mongodb | ||
vars: | ||
mongodb_enable_auth: yes | ||
mongodb_users: | ||
- db: st2 | ||
username: st2mongo | ||
password: "{{ lookup('password', '{{ mongodb_creds_dir }}/mongodb-' + inventory_hostname + '-' + st2mongo_username + ' length=42' ) }}" | ||
roles: readWrite | ||
mongodb_force_password_update: yes | ||
|
||
Note that the `readWrite` mongo role is used by default, so `roles` can be ommitted for the above playbook. | ||
You can use the roles attribute to add any other mongo roles to your user. | ||
|
||
License | ||
------- | ||
|
||
Apache 2.0 | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
--- | ||
- name: "Add mongo auth user - {{ _mongodb_user.username }} on {{ _mongodb_user.db }}" | ||
mongodb_user: | ||
state: present | ||
|
||
# NOTE: on_create is idempotent, always is not. | ||
# With `update_password: on_create`, mongodb_user checks to see if the user | ||
# (a) exists on the db, and (b) has the same roles, | ||
# and then it only adds the user if it's not there or the roles have changed. | ||
# With `update_password: always`, mongodb_user cannot tell if the password | ||
# needs to be changed without attempting a login with those credentials. | ||
# But mongodb_user does not currently implement such a check. | ||
# A comment in mongodb_user points to https://jira.mongodb.org/browse/SERVER-22848 | ||
update_password: "{{ mongodb_force_update_password|ternary('always', 'on_create') }}" | ||
|
||
name: "{{ _mongodb_user.username }}" | ||
password: "{{ _mongodb_user.password }}" | ||
database: "{{ _mongodb_user.db }}" | ||
roles: "{{ _mongodb_user.roles|default('readWrite') }}" | ||
|
||
login_host: "{{ mongodb_host }}" | ||
login_port: "{{ mongodb_port }}" | ||
login_user: "{{ mongodb_admin_username }}" | ||
login_password: "{{ mongodb_admin_password }}" | ||
login_database: admin | ||
tags: [databases, mongodb] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters