ansible-osm-mapserver/README.md
2020-09-29 02:57:15 +02:00

126 lines
5.4 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

**Important : this playbook is quick'n dirty and work in progress. Carefully review before using it.**
This Ansible playbook aims at setting a MapServer tile server on a
Debian 10 Buster, inspired by
https://github.com/mapserver/mapserver/wiki/Rendering-OSM-data-on-Ubuntu-12.04
and https://github.com/mapserver/basemaps.
Here is a rough view of what will be set up (note: even with the following little import, be sure to have 3-4GB of available storage):
```
# Install PostgreSQL + PostGIS, Apache, the MapServer CGI, imposm
apt install postgis apache2 mapserver-bin cgi-mapserver libapache2-mod-mapcache imposm
# ...and some dev tools for the basemap
apt install make unzip wget git
# Create a dedicated database user with its own database
# (you can harden the password but remember to edit the basemap's Makefile)
# (unfortunately, I didn't manage to configure all the tools to use the unix socket. Ping me if you succeeded!)
su -c 'psql -c "CREATE USER osm WITH PASSWORD '"'"'osm'"'"';"' postgres
su -c "psql -c 'CREATE DATABASE osm WITH OWNER osm;'" postgres
su -c "psql -c 'CREATE EXTENSION postgis;' osm" postgres
# Download or clone an OSM basemap
# (in case of trouble, this tuto was tested with the commit 0c21924a1b1d20cea3acf35fc46256d019877338)
mkdir -p /srv/osm
cd /srv/osm
git clone "https://github.com/mapserver/basemaps"
# Initial (only needed once) download of worldwide shapefiles (~750MB)
# (the two zip files can be copied on following hosts to avoid the download)
cd basemaps/data
make
# Generation
# (here, you can customize the Makefile. For example the style (default, google, bing) and the database connection)
cd ..
make
# Finally, import data...
mkdir /srv/osm/imposm
cd /srv/osm/imposm
# Manually download some small .pbf files as a test
wget https://download.geofabrik.de/australia-oceania/new-caledonia-latest.osm.pbf
wget https://download.geofabrik.de/europe/iceland-latest.osm.pbf
# ...and import in PostGIS
imposm --mapping-file=/srv/osm/basemaps/imposm-mapping.py --proj=EPSG:3857 --read new-caledonia-latest.osm.pbf
imposm --mapping-file=/srv/osm/basemaps/imposm-mapping.py --proj=EPSG:3857 --read --merge-cache iceland-latest.osm.pbf
imposm --mapping-file=/srv/osm/basemaps/imposm-mapping.py --proj=EPSG:3857 --connection=postgis://osm:osm@localhost:5432/osm --write
imposm --mapping-file=/srv/osm/basemaps/imposm-mapping.py --proj=EPSG:3857 --connection=postgis://osm:osm@localhost:5432/osm --optimize
imposm --mapping-file=/srv/osm/basemaps/imposm-mapping.py --proj=EPSG:3857 --connection=postgis://osm:osm@localhost:5432/osm --deploy-production-tables
# Configure Apache, MapServer and MapCache
mkdir /srv/osm/mapcache
cp -i /usr/share/doc/libapache2-mod-mapcache/examples/mapcache.xml /srv/osm/mapcache/
# Change layer to 'default' and add a <MAP> pointer to the basemap, in mapcache > source > getmap > params
# Remember to adapt 'osm-default.map' if you changed the style in the basemap's Makefile (google, bing)
sed -i 's#^\([[:space:]]\+\)<LAYERS>.*</LAYERS>#\1<LAYERS>default</LAYERS>\n\1<MAP>/srv/osm/basemaps/osm-default.map</MAP>#' mapcache.xml
# Modify the url to point to the local CGI
sed -i 's#<url>.*#<url>http://localhost/cgi-bin/mapserv?</url>#' /srv/osm/mapcache/mapcache.xml
# And configure Apache
cd /etc/apache2
a2enmod cgi
a2disconf serve-cgi-bin.conf
sed -i 's/Require all granted/Require local/' conf-available/serve-cgi-bin.conf
sed -i 's%#Include conf-available/serve-cgi-bin.conf%Include conf-available/serve-cgi-bin.conf\n\tMapCacheAlias /mapcache "/srv/osm/mapcache/mapcache.xml"%' sites-available/000-default.conf
apache2ctl configtest
service apache2 restart
```
You can test it at http://your.server.name.tld/mapcache/demo/
## Back to Ansible
Most of the configuration should be available in the inventory.
It is launched usually like this : `ansible-playbook site.yml`
If you want to override the passwords within a vault :
```
ansible-vault create vault.yml
# vault.yml example (take variables' names from inventory, vars, ...) :
# ---
# password: mypass
ansible-playbook -e @vault.yml --ask-vault-pass site.yml
```
## Prerequisites
### Prerequisites for the hosts
Hosts should be accessible via SSH as the root user (else, add the usual
`remote_user`/`become` instructions in ansible.cfg) and with the Python
prerequisite of Ansible (usually `python-minimal`).
Only tested on Debian 10 amd64 so far, with Ansible 2.7.7.
Note : to test or to limit to one particular host :
```
ansible foo.bar.com -m ping
ansible-playbook -l foo.bar.com -v -C -D site.yml
```
## Directory layout
We follow (more or less) the recommendations of
https://docs.ansible.com/ansible/latest/user_guide/playbooks_best_practices.html
with :
- `site.yml` : master playbook
- `ansible.cfg` and `inventory.yml` : the first one set up some default configurations and introduce the second one : the inventory.
- `roles/common/`, `roles/fooapp/` : the roles with their tree `tasks/main.yml`, `files/`, `handlers/main.yml`, ...
- `group_vars/group1.yml` and `host_vars/hostname1.yml` : variables dedicated to a group or a host respectively.
Note : contrary to some recommendations, I prefer to set some variables in
the inventory instead of `host_vars` and `group_vars`. For a small playbook
like this one, it seems acceptable and it makes it easier to look where to
adapt.
## TODO
- better cross-platform compatibility
- use osmosis ? Said to be better than imposm (warning: heavy Java dependencies...)
- check disk space ?
## License
[CC-0](https://creativecommons.org/publicdomain/zero/1.0/)