Using the ansible playbook to deploy OpenWISP2 is perfectly fine.
Customizing the playbook to deploy OpenWISP2 with a PostgreSQL backend leads me to the error AttributeError: 'DatabaseOperations' object has no attribute 'geo_db_type'
fatal: [
openwisp201.mydomain.org]: FAILED! => {"changed": false, "cmd": "./manage.py migrate --noinput", "msg": "stdout: Operations to perform:\n App
ly all migrations: account, admin, auth, config, contenttypes, geo, openwisp_users, pki, reversion, sessions, sites, socialaccount\nRunning migrations
:\n Applying geo.0001_initial...\n:stderr: Traceback (most recent call last):\n File \"./manage.py\", line 10, in <module>\n execute_from_command
_line(sys.argv)\n File \"/opt/openwisp2/env/lib/python3.6/site-packages/django/core/management/__init__.py\", line 371, in execute_from_command_line\
n utility.execute()\n File \"/opt/openwisp2/env/lib/python3.6/site-packages/django/core/management/__init__.py\", line 365, in execute\n self.f
etch_command(subcommand).run_from_argv(self.argv)\n File \"/opt/openwisp2/env/lib/python3.6/site-packages/django/core/management/base.py\", line 288,
in run_from_argv\n self.execute(*args, **cmd_options)\n File \"/opt/openwisp2/env/lib/python3.6/site-packages/django/core/management/base.py\", l
ine 335, in execute\n output = self.handle(*args, **options)\n File \"/opt/openwisp2/env/lib/python3.6/site-packages/django/core/management/comman
ds/migrate.py\", line 200, in handle\n fake_initial=fake_initial,\n File \"/opt/openwisp2/env/lib/python3.6/site-packages/django/db/migrations/exe
cutor.py\", line 117, in migrate\n state = self._migrate_all_forwards(state, plan, full_plan, fake=fake, fake_initial=fake_initial)\n File \"/opt/
openwisp2/env/lib/python3.6/site-packages/django/db/migrations/executor.py\", line 147, in _migrate_all_forwards\n state = self.apply_migration(sta
te, migration, fake=fake, fake_initial=fake_initial)\n File \"/opt/openwisp2/env/lib/python3.6/site-packages/django/db/migrations/executor.py\", line
244, in apply_migration\n state = migration.apply(state, schema_editor)\n File \"/opt/openwisp2/env/lib/python3.6/site-packages/django/db/migrati
ons/migration.py\", line 122, in apply\n operation.database_forwards(self.app_label, schema_editor, old_state, project_state)\n File \"/opt/openwi
sp2/env/lib/python3.6/site-packages/django/db/migrations/operations/models.py\", line 92, in database_forwards\n schema_editor.create_model(model)\
n File \"/opt/openwisp2/env/lib/python3.6/site-packages/django/db/backends/base/schema.py\", line 265, in create_model\n definition, extra_params
= self.column_sql(model, field)\n File \"/opt/openwisp2/env/lib/python3.6/site-packages/django/db/backends/base/schema.py\", line 157, in column_sql\
n db_params = field.db_parameters(connection=self.connection)\n File \"/opt/openwisp2/env/lib/python3.6/site-packages/django/db/models/fields/__in
it__.py\", line 673, in db_parameters\n type_string = self.db_type(connection)\n File \"/opt/openwisp2/env/lib/python3.6/site-packages/django/cont
rib/gis/db/models/fields.py\", line 105, in db_type\n return connection.ops.geo_db_type(self)\n
AttributeError: 'DatabaseOperations' object has no a
ttribute 'geo_db_type'\n", "path": "/opt/openwisp2/env/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin", "state": "absent",
"syspath": ["/tmp/ansible_django_manage_payload_U1csLu/ansible_django_manage_payload.zip", "/usr/lib/python2.7", "/usr/lib/python2.7/plat-x86_64-linu
x-gnu", "/usr/lib/python2.7/lib-tk", "/usr/lib/python2.7/lib-old", "/usr/lib/python2.7/lib-dynload", "/usr/local/lib/python2.7/dist-packages", "/usr/l
ib/python2.7/dist-packages"]}