dfce4a20a1
When initalizing a connection to psycopg2, in order to use the default values, the keywords must be missing. So we use a dictionary as a kwarg and include only the keywords that do not have an empty value on the module parameters.
111 lines
3.4 KiB
Python
Executable file
111 lines
3.4 KiB
Python
Executable file
#!/usr/bin/python
|
|
# -*- coding: utf-8 -*-
|
|
|
|
# This file is part of Ansible
|
|
#
|
|
# Ansible is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# Ansible is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
try:
|
|
import psycopg2
|
|
except ImportError:
|
|
postgresqldb_found = False
|
|
else:
|
|
postgresqldb_found = True
|
|
|
|
# ===========================================
|
|
# PostgreSQL module specific support methods.
|
|
#
|
|
|
|
def db_exists(cursor, db):
|
|
query = "SELECT * FROM pg_database WHERE datname=%(db)s"
|
|
cursor.execute(query, {'db': db})
|
|
return cursor.rowcount == 1
|
|
|
|
def db_delete(cursor, db):
|
|
query = "DROP DATABASE %s" % db
|
|
cursor.execute(query)
|
|
return True
|
|
|
|
def db_create(cursor, db, owner, template, encoding):
|
|
if owner:
|
|
owner = " OWNER %s" % owner
|
|
if template:
|
|
template = " TEMPLATE %s" % template
|
|
if encoding:
|
|
encoding = " ENCODING '%s'" % encoding
|
|
query = "CREATE DATABASE %s%s%s%s" % (db, owner, template, encoding)
|
|
cursor.execute(query)
|
|
return True
|
|
|
|
# ===========================================
|
|
# Module execution.
|
|
#
|
|
|
|
def main():
|
|
module = AnsibleModule(
|
|
argument_spec=dict(
|
|
login_user=dict(default="postgres"),
|
|
login_password=dict(default=""),
|
|
login_host=dict(default=""),
|
|
db=dict(required=True, aliases=['name']),
|
|
owner=dict(default=""),
|
|
template=dict(default=""),
|
|
encoding=dict(default=""),
|
|
state=dict(default="present", choices=["absent", "present"]),
|
|
)
|
|
)
|
|
|
|
if not postgresqldb_found:
|
|
module.fail_json(msg="the python psycopg2 module is required")
|
|
|
|
db = module.params["db"]
|
|
owner = module.params["owner"]
|
|
template = module.params["template"]
|
|
encoding = module.params["encoding"]
|
|
state = module.params["state"]
|
|
changed = False
|
|
|
|
# To use defaults values, keyword arguments must be absent, so
|
|
# check which values are empty and don't include in the **kw
|
|
# dictionary
|
|
params_map = {
|
|
"login_host":"host",
|
|
"login_user":"user",
|
|
"login_password":"password"
|
|
}
|
|
kw = dict( (params_map[k], v) for (k, v) in module.params.iteritems()
|
|
if k in params_map and v != '' )
|
|
try:
|
|
db_connection = psycopg2.connect(database="template1", **kw)
|
|
# Enable autocommit so we can create databases
|
|
db_connection.autocommit = True
|
|
cursor = db_connection.cursor()
|
|
except Exception, e:
|
|
module.fail_json(msg="unable to connect to database: %s" % e)
|
|
|
|
try:
|
|
if db_exists(cursor, db):
|
|
if state == "absent":
|
|
changed = db_delete(cursor, db)
|
|
else:
|
|
if state == "present":
|
|
changed = db_create(cursor, db, owner, template, encoding)
|
|
except Exception, e:
|
|
module.fail_json(msg="Database query failed: %s" % e)
|
|
|
|
module.exit_json(changed=changed, db=db)
|
|
|
|
# this is magic, see lib/ansible/module_common.py
|
|
#<<INCLUDE_ANSIBLE_MODULE_COMMON>>
|
|
main()
|