commit e97e40e3185613629802edf28de49b62cd9b3a9a Author: Mauro Torrez Date: Mon Mar 18 08:27:44 2019 -0300 commit inicial diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c24c661 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +*~ +\#* +.#* +*.pyc +*.bak +__pycache__ diff --git a/README.md b/README.md new file mode 100644 index 0000000..b56551c --- /dev/null +++ b/README.md @@ -0,0 +1,96 @@ +# Rol nginx-docker + +Este rol configura un container `nginx` en un host con Docker. +Genera la siguiente estructura de directorio para configurar nginx: + +* `{{ nginx_config }}`: en este directorio se puede sobreescribir la + configuración de nginx (sección `http`) mediante archivos `.conf`. + + * `00_ssl.conf` (no editar): configura los certificados para HTTPS. + + * `10_server.conf` (no editar): configura los servicios HTTP y HTTPS. + + * `common`: directorio con directivas comunes (locations, logs, + headers, etc) a incluir en las secciones server de HTTP y HTTPS. + + * `locations`: directorio con locations (o cualquier directiva + válida) a incluir en la sección `server` para HTTPS. + + * `locations-http`: directorio con locations (o cualquier directiva + válida) a incluir en la sección `server` para HTTP. + +## Variables + +* `nginx_image`: nombre de la imagen a bajar. Por defecto: `nginx`. + +* `nginx_ssl_certificate`: path (en el host) al certificado SSL a + usar para el servicio HTTPS. + Valor por defecto: `/etc/ssl/certs/host-rectorado.pem`. + +* `nginx_ssl_private_key`: path (en el host) a la clave privada + del certificado SSL a usar para el servicio HTTPS. + Valor por defecto: `/etc/ssl/private/host-rectorado.key`. + +* `nginx_config_volume`: nombre (path) del volumen de configuración. + Valor por defecto: `nginx_conf`, lo que significa que el volumen se + montará en `/var/lib/docker/volumes/nginx_conf/_data`. + +* `nginx_webroot_volume`: nombre (path) del volumen raíz (directiva + root de nginx). + Valor por defecto: `nginx_webroot`, lo que significa que el volumen + se montará en `/var/lib/docker/volumes/nginx_webroot/_data`. + +* `nginx_publish_ports`: puertos a publicar (sintaxis Docker). + Valor por defecto: `[ "80:80", "443:443" ]` + +* `nginx_redirect_https`: indica si forzar redireccion a https. + Valor por defecto: `yes`. + +## Variables exportadas + +* `nginx_config_mountpoint`: punto de montaje de la configuración de nginx. + Valor por defecto: `/var/lib/docker/volumes/nginx_conf/_data`. + +* `nginx_webroot_mountpoint`: punto de montaje del webroot de nginx. + Valor por defecto: `/var/lib/docker/volumes/nginx_webroot/_data`. + +## Handlers + +El rol define el siguiente handler, que puede ser usado por los roles +subsiguientes: + +* `restart nginx container`: reinicia el container. Útil para recargar + la configuración. + +## Ejemplo de uso + +En el repositorio sobre el que estamos trabajando, agregar este rol +como submódulo: + +```bash +git submodule add https://servicios.unl.edu.ar/gitlab/administradores/ansible-role-nginx-docker.git roles/nginx-docker +``` + +En el playbook, incluir el rol: + +```yaml + # ... + roles: + # .. roles basicos .. + - nginx-docker + # .. roles de la aplicacion .. +``` + +En los roles de la aplicacion, definir una tarea que configura una +`location` para ser publicada mediante nginx: + +```yaml +- copy: + content: | + location / { + proxy_pass http://NOMBRE-DE-CONTAINER:PUERTO-DE-CONTAINER; + } + dest: "{{ nginx_config_mountpoint }}/locations/MI-APLICACION.conf" + notify: "restart nginx container" + +``` diff --git a/defaults/main.yml b/defaults/main.yml new file mode 100644 index 0000000..d2a1bed --- /dev/null +++ b/defaults/main.yml @@ -0,0 +1,21 @@ +--- +# nombre de la imagen a bajar +nginx_image: nginx + +# certificado y clave privadas para HTTPS +nginx_ssl_certificate: /etc/ssl/certs/host-rectorado.pem +nginx_ssl_private_key: /etc/ssl/private/host-rectorado.key + +# nombre del volumen de configuracion +nginx_config_volume: nginx_conf + +# nombre del volumen web +nginx_webroot_volume: nginx_webroot + +# puertos a publicar +nginx_publish_ports: + - "80:80" + - "443:443" + +# forzar redireccion a https? +nginx_redirect_https: yes diff --git a/handlers/main.yml b/handlers/main.yml new file mode 100644 index 0000000..8cb294c --- /dev/null +++ b/handlers/main.yml @@ -0,0 +1,6 @@ +--- +- name: restart nginx container + docker_container: + name: nginx + state: started + restart: yes diff --git a/tasks/main.yml b/tasks/main.yml new file mode 100644 index 0000000..42b2910 --- /dev/null +++ b/tasks/main.yml @@ -0,0 +1,74 @@ +--- +- name: "Activar container nginx" + docker_container: + name: "nginx" + state: "started" + restart_policy: "unless-stopped" + image: "{{ nginx_image }}" + volumes: + - "{{ nginx_ssl_certificate }}:/etc/nginx/server.crt" + - "{{ nginx_ssl_private_key }}:/etc/nginx/server.key" + - "{{ nginx_config_volume }}:/etc/nginx/conf.d/" + - "{{ nginx_webroot_volume }}:/usr/share/nginx/html/" + networks: + - name: "{{ docker_network_name }}" + ports: "{{ nginx_publish_ports }}" + env: + register: "container" + +- name: "Configurar volumen {{ nginx_config_volume }}" + docker_volume: + name: "{{ nginx_config_volume }}" + state: "present" + register: "st_c_volume" + +- name: "Configurar volumen {{ nginx_webroot_volume }}" + docker_volume: + name: "{{ nginx_webroot_volume }}" + state: "present" + register: "st_w_volume" + +# exportar punto de montaje del volumen +- set_fact: + nginx_config_mountpoint: "{{ st_c_volume.ansible_facts.docker_volume.Mountpoint }}" + nginx_webroot_mountpoint: "{{ st_w_volume.ansible_facts.docker_volume.Mountpoint }}" + +# TODO: creo que estas tareas se deberian hacer desde dentro de un container +- copy: + content: | + ssl_certificate /etc/nginx/server.crt; + ssl_certificate_key /etc/nginx/server.key; + dest: "{{ nginx_config_mountpoint }}/00_ssl.conf" + notify: "restart nginx container" + +- copy: + content: | + server { + listen 80; + server_name _; + root /usr/share/nginx/html; + include /etc/nginx/conf.d/common/*.conf; + {% if nginx_redirect_https %} + location / { + rewrite ^ https://$http_host$request_uri permanent; + } + {% endif %} + include /etc/nginx/conf.d/locations-http/*.conf; + } + server { + listen 443 ssl; + server_name _; + root /usr/share/nginx/html; + include /etc/nginx/conf.d/common/*.conf; + include /etc/nginx/conf.d/locations/*.conf; + } + dest: "{{ nginx_config_mountpoint }}/10_server.conf" + notify: "restart nginx container" + +- file: + name: "{{ nginx_config_mountpoint }}/{{ item }}" + state: "directory" + loop: + - common + - locations + - locations-http