commit inicial

This commit is contained in:
Mauro Torrez 2019-03-18 08:27:44 -03:00
commit e97e40e318
5 changed files with 203 additions and 0 deletions

6
.gitignore vendored Normal file
View File

@ -0,0 +1,6 @@
*~
\#*
.#*
*.pyc
*.bak
__pycache__

96
README.md Normal file
View File

@ -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"
```

21
defaults/main.yml Normal file
View File

@ -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

6
handlers/main.yml Normal file
View File

@ -0,0 +1,6 @@
---
- name: restart nginx container
docker_container:
name: nginx
state: started
restart: yes

74
tasks/main.yml Normal file
View File

@ -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