23 Commits
1.3.2 ... 1.3.4

Author SHA1 Message Date
Emilien Mantel
38a8354754 Bind proxy_protocol on port 2017-01-03 12:07:31 +01:00
Emilien Mantel
1b06fe273f Add html file to test-ssl-proxy-protocol.local 2017-01-03 11:32:45 +01:00
Emilien Mantel
684c794566 Manage proxy protocol 2017-01-03 11:16:28 +01:00
Emilien Mantel
f2cfae31b1 Update APT cache should not "change" 2016-12-08 17:34:59 +01:00
Emilien Mantel
481bcd34b1 no_log while creating SSL directories 2016-12-08 09:19:12 +01:00
Emilien Mantel
875c7cfb2e Async task: generate dh 2016-12-07 07:48:32 +01:00
Emilien Mantel
8caddedc68 Deploy custom facts with nginx_vhosts 2016-11-29 14:32:27 +01:00
Emilien Mantel
4a3aed6974 no_log on task : Deploy SSL certs 2016-11-29 09:35:53 +01:00
Emilien Mantel
8ccc9f521f Secure files permission 2016-11-25 11:33:20 +01:00
Emilien Mantel
5b0977567c New feature: provide location order (#24 related) 2016-11-23 11:44:04 +01:00
E Mantel
de71e1bdcc Better display for server_name 2016-11-16 20:51:03 +01:00
Emilien Mantel
19cdab5ba4 default vhost on HTTPS redirect 2016-11-15 17:15:39 +01:00
Emilien Mantel
999f226838 Delete useless test 2016-11-07 17:40:00 +01:00
Emilien Mantel
40f67fc103 Vhost ssl_name name is now optionnal 2016-11-07 17:22:14 +01:00
Emilien Mantel
6b1366298f no_log on sensitive data 2016-11-02 14:48:49 +01:00
Emilien Mantel
817d56fb81 Fix redirect https on non standard port 2016-11-02 14:25:27 +01:00
Emilien Mantel
e08401acf8 vhost redirect_from accepts string 2016-11-02 14:23:55 +01:00
Emilien Mantel
0bda544a2f Revert "nginx -t has no side effect"
This reverts commit 2641777abe.
2016-11-02 14:21:32 +01:00
Emilien Mantel
2641777abe nginx -t has no side effect 2016-10-27 17:48:57 +02:00
Emilien Mantel
60a368f3e1 Manage many configurations 2016-10-13 11:11:07 +02:00
Emilien Mantel
41a5575627 Dynamic modules starts at version 1.9.11 2016-10-12 18:16:53 +02:00
Emilien Mantel
42bb4a3e2b Dynamic module management (closes #23) 2016-10-12 18:13:59 +02:00
Emilien Mantel
ef3440a015 Bug fix: vhost with absent state is not deleted in sites-enabled 2016-10-10 14:35:46 +02:00
22 changed files with 214 additions and 78 deletions

View File

@@ -1,15 +1,20 @@
env: matrix:
- PLATFORM=debian-jessie include:
- env: PLATFORM=debian-jessie ORIGIN=debian NGINX_PHP56=true NGINX_PHP70=false NGINX_BACKPORTS=false DOTDEB=false
- env: PLATFORM=debian-jessie ORIGIN=backports NGINX_PHP56=true NGINX_PHP70=false NGINX_BACKPORTS=true DOTDEB=false
- env: PLATFORM=debian-jessie ORIGIN=dotdeb NGINX_PHP56=true NGINX_PHP70=true NGINX_BACKPORTS=false DOTDEB=true
sudo: required sudo: required
dist: trusty
language: python language: python
services: services:
- docker - docker
script: script:
- docker build -f tests/$PLATFORM.Dockerfile -t test-$PLATFORM . && docker run --name $PLATFORM test-$PLATFORM - docker build -f tests/$PLATFORM.Dockerfile -t test-$PLATFORM . && docker run -e "DOTDEB=$DOTDEB" -e "NGINX_PHP56=$NGINX_PHP56" -e "NGINX_PHP70=$NGINX_PHP70" -e "NGINX_BACKPORTS=$NGINX_BACKPORTS" --name $PLATFORM test-$PLATFORM
notifications: notifications:
webhooks: https://galaxy.ansible.com/api/v1/notifications/ webhooks: https://galaxy.ansible.com/api/v1/notifications/

View File

@@ -13,6 +13,9 @@ Features:
- Fast PHP configuration - Fast PHP configuration
- Preconfigured vhost templates (should work on many app) - Preconfigured vhost templates (should work on many app)
- Auto-configure HTTP2 on SSL/TLS vhosts - Auto-configure HTTP2 on SSL/TLS vhosts
- Manage dynamic modules (install and loading)
- Deploy custom facts.d with sites config
- Can listen with proxy protocol
Requirements Requirements
------------ ------------
@@ -50,6 +53,7 @@ FreeBSD:
- `nginx_events_*`: all variables in events block - `nginx_events_*`: all variables in events block
- `nginx_http_*`: all variables in http block - `nginx_http_*`: all variables in http block
- `nginx_custom_http`: instructions list (will put data in `/etc/nginx/conf.d/custom.conf`) - `nginx_custom_http`: instructions list (will put data in `/etc/nginx/conf.d/custom.conf`)
- `nginx_dyn_modules`: dynamic module list to load
Fine configuration Fine configuration
------------------ ------------------

23
Vagrantfile vendored
View File

@@ -6,12 +6,14 @@
Vagrant.configure("2") do |config| Vagrant.configure("2") do |config|
vms_debian = [ vms_debian = [
[ "debian-jessie", "debian/jessie64" ], { :name => "debian-jessie", :box => "debian/jessie64", :vars => { "nginx_php56": true, "nginx_php70": false, "dotdeb": false, "nginx_backports": false }},
[ "debian-stretch", "sharlak/debian_stretch_64" ] { :name => "debian-jessie-backports", :box => "debian/jessie64", :vars => { "nginx_php56": true, "nginx_php70": false, "dotdeb": false, "nginx_backports": true }},
{ :name => "debian-jessie-dotdeb", :box => "debian/jessie64", :vars => { "nginx_php56": true, "nginx_php70": true, "dotdeb": true, "nginx_backports": false }},
{ :name => "debian-stretch", :box => "sharlak/debian_stretch_64", :vars => { "nginx_php56": false, "nginx_php70": true, "dotdeb": false, "nginx_backports": false }}
] ]
vms_freebsd = [ vms_freebsd = [
[ "freebsd-10.2", "freebsd/FreeBSD-10.2-STABLE" ] { :name => "freebsd-10.2", :box => "freebsd/FreeBSD-10.2-STABLE" }
] ]
config.vm.provider "virtualbox" do |v| config.vm.provider "virtualbox" do |v|
@@ -19,22 +21,22 @@ Vagrant.configure("2") do |config|
v.memory = 256 v.memory = 256
end end
vms_debian.each do |vm| vms_debian.each do |opts|
config.vm.define vm[0] do |m| config.vm.define opts[:name] do |m|
m.vm.box = vm[1] m.vm.box = opts[:box]
m.vm.network "private_network", type: "dhcp" m.vm.network "private_network", type: "dhcp"
m.vm.provision "ansible" do |ansible| m.vm.provision "ansible" do |ansible|
ansible.playbook = "tests/test.yml" ansible.playbook = "tests/test.yml"
ansible.groups = { "test" => [ vm[0] ] }
ansible.verbose = 'vv' ansible.verbose = 'vv'
ansible.sudo = true ansible.sudo = true
ansible.extra_vars = opts[:vars]
end end
end end
end end
# See: https://forums.freebsd.org/threads/52717/ # See: https://forums.freebsd.org/threads/52717/
vms_freebsd.each do |vm| vms_freebsd.each do |opts|
config.vm.define vm[0] do |m| config.vm.define opts[:name] do |m|
m.vm.box = vm[1] m.vm.box = opts[:box]
m.vm.network "private_network", type: "dhcp" m.vm.network "private_network", type: "dhcp"
m.vm.guest = :freebsd m.vm.guest = :freebsd
m.vm.synced_folder ".", "/vagrant", id: "vagrant-root", disabled: true m.vm.synced_folder ".", "/vagrant", id: "vagrant-root", disabled: true
@@ -43,7 +45,6 @@ Vagrant.configure("2") do |config|
m.vm.provision "shell", inline: "pkg install -y python bash" m.vm.provision "shell", inline: "pkg install -y python bash"
m.vm.provision "ansible" do |ansible| m.vm.provision "ansible" do |ansible|
ansible.playbook = "tests/test.yml" ansible.playbook = "tests/test.yml"
ansible.groups = { "test" => [ vm[0] ] }
ansible.verbose = 'vv' ansible.verbose = 'vv'
ansible.sudo = true ansible.sudo = true
ansible.extra_vars = { ansible.extra_vars = {

View File

@@ -105,6 +105,11 @@ nginx_htpasswd: []
# #
nginx_ssl_pairs: [] nginx_ssl_pairs: []
#
# Dynamic modules
#
nginx_dyn_modules: []
# #
# Diffie-Hellman # Diffie-Hellman
# #

View File

@@ -32,7 +32,8 @@ Note: `name` is used to deploy key/cert. With defaults values dans `name` = "foo
Tips Tips
---- ----
Deploying key/cert is not mandatory with this role. You can manage it in other place ([letsencrypt](https://letsencrypt.org/)? :)). You just need to set `dest_cert` and `dest_key`! - Deploying key/cert is not mandatory with this role. You can manage it in other place ([letsencrypt](https://letsencrypt.org/)? :)). You just need to set `dest_cert` and `dest_key`!
- In `nginx_vhosts`, `ssl_name` is mandatory. This role will search in `nginx_ssl_pairs` with vhost `name` (first in list if it's a list).
Diffie-Hellman Diffie-Hellman
-------------- --------------
@@ -48,6 +49,9 @@ nginx_vhosts;
proto: ['http', 'https'] proto: ['http', 'https']
template: '_base' template: '_base'
ssl_name: 'mysuperkey' ssl_name: 'mysuperkey'
- name: 'test-ssl2.local'
proto: ['http', 'https']
template: '_base'
nginx_ssl_pairs: nginx_ssl_pairs:
- name: mysuperkey - name: mysuperkey
@@ -59,5 +63,15 @@ nginx_ssl_pairs:
-----BEGIN CERTIFICATE----- -----BEGIN CERTIFICATE-----
....(snip).... ....(snip)....
-----END CERTIFICATE----- -----END CERTIFICATE-----
- name: test-ssl2.local
key: |
-----BEGIN RSA PRIVATE KEY-----
....(snip)....
-----END RSA PRIVATE KEY-----
cert: |
-----BEGIN CERTIFICATE-----
....(snip)....
-----END CERTIFICATE-----
``` ```

View File

@@ -18,15 +18,18 @@ Common
- `redirect_to_code`: Redirect code (default: 302) - `redirect_to_code`: Redirect code (default: 302)
- `redirect_https`: (O) Boolean. Redirect HTTP to HTTPS. If "true", you _MUST_ set `proto` to ```['https']```. - `redirect_https`: (O) Boolean. Redirect HTTP to HTTPS. If "true", you _MUST_ set `proto` to ```['https']```.
- `location`: (O) Add new custom locations (it does not overwrite!) - `location`: (O) Add new custom locations (it does not overwrite!)
- `location_order`: (O) Due to non preditive `location` order, you can provide the good order (see test-location.local in [tests/test.yml](../tests/test.yml)).
- `more`: (O) Add more custom infos. - `more`: (O) Add more custom infos.
- `upstream_params`: (O) Add upstream params (useful when you want to pass variables to PHP) - `upstream_params`: (O) Add upstream params (useful when you want to pass variables to PHP)
- `override_try_files`: (O) overrides default try\_files defined in template - `override_try_files`: (O) overrides default try\_files defined in template
- `manage_local_content`: (O) Boolean. Set to false if you do not want to manage local content (images, css...). This option is useless if you use `_proxy` template or `redirect_to` feature. - `manage_local_content`: (O) Boolean. Set to false if you do not want to manage local content (images, css...). This option is useless if you use `_proxy` template or `redirect_to` feature.
- `htpasswd`: (O) References name key in `nginx_htpasswd`. Enable auth basic on all vhost. - `htpasswd`: (O) References name key in `nginx_htpasswd`. Enable auth basic on all vhost.
- `proto`: (O) list of protocol used. Default is a list with "http". If you need http and https, you must set a list with "http" and "https". You can only set "https" without http support. - `proto`: (O) list of protocol used. Default is a list with "http". If you need http and https, you must set a list with "http" and "https". You can only set "https" without http support.
- `ssl_name`: (D) name of the key used when using TLS/SSL. Mandatory when `proto` contains "https" - `ssl_name`: (D) name of the key used when using TLS/SSL. Optional when `proto` contains "https". If you don't set this value, it will search by `name`.
- `ssl_template` (O) "strong" (default) or "legacy". You can disable SSL helpers and add your own directives by setting "false". - `ssl_template` (O) "strong" (default) or "legacy". You can disable SSL helpers and add your own directives by setting "false".
- `php_version` (O) Sepecify PHP version (5 or 7) - `php_version` (O) Sepecify PHP version (5 or 7)
- `http_proxy_protocol_port` (O) Enable proxy protocol on http port.
- `https_proxy_protocol_port` (O) Enable proxy protocol on https port.
(O): Optional (O): Optional
(M): Mandatory (M): Mandatory

16
tasks/dyn_modules.yml Normal file
View File

@@ -0,0 +1,16 @@
---
- name: FAIL | If Dynamic module is not available
fail: msg="{{ item }} dynamic module is not available"
with_items: "{{ nginx_dyn_modules }}"
when: "'{{ item }}=dynamic' not in nginx_modules"
- name: APT | Install nginx modules
apt: >
pkg="libnginx-mod-{{ item | replace('_', '-') }}"
state=present
default_release={{ ansible_distribution_release + '-backports' if nginx_backports else ansible_distribution_release }}
with_items: "{{ nginx_dyn_modules }}"
when: ansible_distribution == 'Debian'
# TODO: manage freebsd

View File

@@ -17,3 +17,4 @@
- "{{ nginx_htpasswd }}" - "{{ nginx_htpasswd }}"
- users - users
when: item.0.state is not defined or item.0.state == 'present' when: item.0.state is not defined or item.0.state == 'present'
no_log: true

View File

@@ -4,6 +4,7 @@
apt: > apt: >
update_cache=yes update_cache=yes
cache_valid_time=3600 cache_valid_time=3600
changed_when: false
- name: APT | Force OpenSSL from backports (fix dependency break) - name: APT | Force OpenSSL from backports (fix dependency break)
apt: > apt: >
@@ -20,4 +21,3 @@
- name: APT | Install python-passlib - name: APT | Install python-passlib
apt: pkg=python-passlib state=present apt: pkg=python-passlib state=present

View File

@@ -9,6 +9,10 @@
- name: INCLUDE | Prepare - name: INCLUDE | Prepare
include: prepare.yml include: prepare.yml
- name: INCLUDE | Manage dynamic modules
include: dyn_modules.yml
when: nginx_version.stdout | version_compare('1.9.11', 'ge')
- name: INCLUDE | Install - name: INCLUDE | Install
include: config.yml include: config.yml

View File

@@ -8,7 +8,7 @@
changed_when: false changed_when: false
- name: SHELL | Get module list - name: SHELL | Get module list
shell: nginx -V 2>&1 | tr -- - '\n' | grep -A 1 with | grep _module | sed 's/_module[[:space:]]*//g' | sort shell: nginx -V 2>&1 | tr -- - '\n' | grep -A 1 with | grep _module | sed -r 's/_module//g; s/\s+//g' | sort
args: args:
executable: /bin/sh executable: /bin/sh
register: shell_modules register: shell_modules
@@ -19,6 +19,8 @@
nginx_modules: "{{ shell_modules.stdout_lines }}" nginx_modules: "{{ shell_modules.stdout_lines }}"
- name: FILE | Create folders - name: FILE | Create folders
file: dest={{ item }} owner=root mode=0755 state=directory file: dest="{{ item.dir }}" owner="{{ item.owner }}" mode="{{ item.mode }}" state=directory
with_items: "{{ nginx_dirs }}" with_items: "{{ nginx_dirs }}"
- name: FILE | Create ansible facts dir
file: path=/etc/ansible/facts.d state=directory

View File

@@ -6,6 +6,8 @@
creates: "{{ nginx_dh_path }}" creates: "{{ nginx_dh_path }}"
when: nginx_dh is not string when: nginx_dh is not string
notify: reload nginx notify: reload nginx
async: 1000
register: dh
- name: COPY | Deploy DH file from vars - name: COPY | Deploy DH file from vars
copy: > copy: >
@@ -20,20 +22,31 @@
state=directory state=directory
with_items: "{{ nginx_ssl_pairs }}" with_items: "{{ nginx_ssl_pairs }}"
when: item.dest_key is not defined or item.dest_cert is not defined when: item.dest_key is not defined or item.dest_cert is not defined
no_log: true
- name: COPY | Deploy SSL keys - name: COPY | Deploy SSL keys
copy: > copy: >
content="{{ item.key }}" content="{{ item.key }}"
dest="{{ nginx_ssl_dir + '/' + item.name + '/' + item.name + '.key' if item.dest_key is not defined else item.dest_key }}" dest="{{ nginx_ssl_dir + '/' + item.name + '/' + item.name + '.key' if item.dest_key is not defined else item.dest_key }}"
mode=0640
with_items: "{{ nginx_ssl_pairs }}" with_items: "{{ nginx_ssl_pairs }}"
when: item.key is defined when: item.key is defined
notify: reload nginx notify: reload nginx
no_log: true
- name: COPY | Deploy SSL certs - name: COPY | Deploy SSL certs
copy: > copy: >
content="{{ item.cert }}" content="{{ item.cert }}"
dest="{{ nginx_ssl_dir + '/' + item.name + '/' + item.name + '.crt' if item.dest_cert is not defined else item.dest_cert }}" dest="{{ nginx_ssl_dir + '/' + item.name + '/' + item.name + '.crt' if item.dest_cert is not defined else item.dest_cert }}"
mode=0644
with_items: "{{ nginx_ssl_pairs }}" with_items: "{{ nginx_ssl_pairs }}"
when: item.cert is defined when: item.cert is defined
notify: reload nginx notify: reload nginx
no_log: true
- name: Check DH command status
async_status: jid={{ dh.ansible_job_id }}
register: job_result
until: job_result.finished
retries: 30
when: nginx_dh is not string

View File

@@ -5,14 +5,6 @@
when: item.filename is defined and item.filename == 'default' when: item.filename is defined and item.filename == 'default'
with_items: "{{ nginx_vhosts }}" with_items: "{{ nginx_vhosts }}"
- name: FAIL | Check vhost and SSL/TLS support
fail: msg="Missmatch configuration for vhost {{ item.name if item.name is string else item.name[0] }}"
when: >
item.proto is defined and
'https' in item.proto and
item.ssl_name is not defined
with_items: "{{ nginx_vhosts }}"
- name: FAIL | Check HTTPS redir and proto - name: FAIL | Check HTTPS redir and proto
fail: msg="You can't have HTTP proto and HTTPS redirection at the same time" fail: msg="You can't have HTTP proto and HTTPS redirection at the same time"
when: > when: >
@@ -48,8 +40,10 @@
when: item.state is not defined or item.state != 'absent' when: item.state is not defined or item.state != 'absent'
- name: FILE | Delete vhosts - name: FILE | Delete vhosts
file: path={{ nginx_etc_dir }}/sites-available/{{ item.filename | default(item.name if item.name is string else item.name[0]) }} state=absent file: path={{ nginx_etc_dir }}/{{ item.1 }}/{{ item.0.filename | default(item.0.name if item.0.name is string else item.0.name[0]) }} state=absent
with_items: "{{ nginx_vhosts }}" with_nested:
- "{{ nginx_vhosts }}"
- ['sites-available', 'sites-enabled']
notify: ['reload nginx', 'restart nginx freebsd'] notify: ['reload nginx', 'restart nginx freebsd']
when: item.state is defined and item.state == 'absent' when: item.state is defined and item.state == 'absent'
@@ -67,7 +61,7 @@
file: path={{ nginx_etc_dir}}/sites-enabled/{{ item.filename | default(item.name if item.name is string else item.name[0]) }} state=absent file: path={{ nginx_etc_dir}}/sites-enabled/{{ item.filename | default(item.name if item.name is string else item.name[0]) }} state=absent
with_items: "{{ nginx_vhosts }}" with_items: "{{ nginx_vhosts }}"
notify: ['reload nginx', 'restart nginx freebsd'] notify: ['reload nginx', 'restart nginx freebsd']
when: item.state is defined and item.state == 'disabled' when: item.state is defined and item.state == 'disabled'
- name: FILE | Delete default vhost when explicitely defined - name: FILE | Delete default vhost when explicitely defined
file: > file: >
@@ -83,3 +77,14 @@
state=link state=link
notify: ['reload nginx', 'restart nginx freebsd'] notify: ['reload nginx', 'restart nginx freebsd']
when: nginx_default_vhost is none when: nginx_default_vhost is none
- name: TEMPLATE | Deploy facts
template:
src=etc/ansible/facts.d/nginx.fact.j2
dest=/etc/ansible/facts.d/nginx.fact
mode=0644
register: fact
- name: SETUP
action: setup
when: fact.changed

View File

@@ -0,0 +1,4 @@
{
"fact_nginx_vhosts":
{{ nginx_vhosts | to_nice_json(indent=8) }}
}

View File

@@ -5,6 +5,11 @@
user {{ nginx_user }}; user {{ nginx_user }};
worker_processes {{ nginx_worker_processes }}; worker_processes {{ nginx_worker_processes }};
pid {{ nginx_pid }}; pid {{ nginx_pid }};
{% if nginx_version.stdout | version_compare('1.9.11', 'ge') %}
{% for module in nginx_dyn_modules -%}
load_module "modules/ngx_{{ module }}_module.so";
{% endfor %}
{% endif %}
events { events {
worker_connections {{ nginx_events_worker_connections }}; worker_connections {{ nginx_events_worker_connections }};

View File

@@ -1,9 +1,13 @@
{% set __proto = item.proto | default(['http']) %} {% set __proto = item.proto | default(['http']) %}
{% set __main_name = item.filename | default(item.name if item.name is string else item.name[0]) %} {% set __main_name = item.filename | default(item.name if item.name is string else item.name[0]) %}
{% set __listen = item.listen | default(['80']) %} {% set __listen = item.listen | default([80]) %}
{% set __listen_ssl = item.listen_ssl | default(['443']) %} {% set __listen_ssl = item.listen_ssl | default([443]) %}
{% set __http_proxy_protocol_port = item.http_proxy_protocol_port | default([]) %}
{% set __https_proxy_protocol_port = item.https_proxy_protocol_port | default([]) %}
{% set __location = item.location | default({}) %} {% set __location = item.location | default({}) %}
{% set __headers = item.headers | default({'X-Frame-Options': 'DENY always', 'X-Content-Type-Options': 'nosniff always' }) %} {% set __headers = item.headers | default({'X-Frame-Options': 'DENY always', 'X-Content-Type-Options': 'nosniff always' }) %}
{% set __ssl_name = item.ssl_name | default(item.name if item.name is string else item.name[0]) %}
{% set __location_order = item.location_order | default(__location.keys()) %}
{% macro htpasswd(htpasswd_name, indent=1) -%} {% macro htpasswd(htpasswd_name, indent=1) -%}
{% for ht in nginx_htpasswd if ht.name == htpasswd_name %} {% for ht in nginx_htpasswd if ht.name == htpasswd_name %}
{{ "\t" * indent }}auth_basic "{{ ht.description }}"; {{ "\t" * indent }}auth_basic "{{ ht.description }}";
@@ -26,14 +30,14 @@
server { server {
{% if 'http' in __proto %} {% if 'http' in __proto %}
{% for port in __listen %} {% for port in __listen %}
listen {{ port }}{% if nginx_default_vhost == __main_name %} default_server{% endif %}; listen {{ port }}{% if nginx_default_vhost == __main_name %} default_server{% endif %}{% if port | int in __http_proxy_protocol_port %} proxy_protocol{% endif %};
{% endfor %} {% endfor %}
{% endif %} {% endif %}
{% if 'https' in __proto %} {% if 'https' in __proto %}
{% for port in __listen_ssl %} {% for port in __listen_ssl %}
listen {{ port }}{% if nginx_default_vhost_ssl == __main_name %} default_server{% endif %} ssl{% if nginx_auto_config_httpv2 and 'http_v2' in nginx_modules %} http2{% endif %}; listen {{ port }}{% if nginx_default_vhost_ssl == __main_name %} default_server{% endif %} ssl{% if nginx_auto_config_httpv2 and 'http_v2' in nginx_modules %} http2{% endif %}{% if port | int in __https_proxy_protocol_port %} proxy_protocol{% endif %};
{% endfor %} {% endfor %}
{{ ssl(item.ssl_name) }} {{ ssl(__ssl_name) }}
{% if item.ssl_template is not defined or item.ssl_template != false %} {% if item.ssl_template is not defined or item.ssl_template != false %}
include {{ nginx_helper_dir + '/ssl-' + item.ssl_template | default('strong') }}; include {{ nginx_helper_dir + '/ssl-' + item.ssl_template | default('strong') }};
{% endif %} {% endif %}
@@ -83,10 +87,11 @@ server {
{% block template_custom_location %} {% block template_custom_location %}
{% endblock %} {% endblock %}
{% if __location is iterable and __location | length > 0 %} {% if __location_order | length > 0 %}
# --> Custom locations # --> Custom locations
{% for location, opts in __location.iteritems() %} {% for location in __location_order %}
location {{ location }} { location {{ location }} {
{% set opts = __location[location] %}
{% for opt in opts %} {% for opt in opts %}
{% if opt.htpasswd is defined %}{{ htpasswd(opt.htpasswd, 2) }}{% else %} {% if opt.htpasswd is defined %}{{ htpasswd(opt.htpasswd, 2) }}{% else %}
{{ opt }} {{ opt }}
@@ -137,10 +142,10 @@ server {
# #
server { server {
{% for port in __listen %} {% for port in __listen %}
listen {{ port }}; listen {{ port }}{% if nginx_default_vhost == __main_name %} default_server{% endif %}{% if port | int in __http_proxy_protocol_port %} proxy_protocol{% endif %};
{% endfor %} {% endfor %}
server_name {% if item.name is string %}{{ item.name }}{% else %}{{ item.name | join(' ') }}{% endif %}; server_name {% if item.name is string %}{{ item.name }}{% else %}{{ "\n\t\t" }}{{ item.name | join("\n\t\t") }}{% endif %};
return 301 https://{{ __main_name }}{% if '443' not in __listen_ssl %}:__listen_ssl[0]{% endif %}$request_uri; return 301 https://{{ __main_name }}{% if '443' not in __listen_ssl %}:{{ __listen_ssl[0] }}{% endif %}$request_uri;
} }
{% endif %} {% endif %}
@@ -151,9 +156,9 @@ server {
# #
server { server {
{% for port in __listen %} {% for port in __listen %}
listen {{ port }}; listen {{ port }}{% if port | int in __http_proxy_protocol_port %} proxy_protocol{% endif %};
{% endfor %} {% endfor %}
server_name {{ item.redirect_from | join(' ') }}; server_name {% if item.redirect_from is string %}{{ item.redirect_from }}{% else %}{{ "\n\t\t" }}{{ item.redirect_from | join("\n\t\t") }}{% endif %};
return 301 $scheme://{{ __main_name }}$request_uri; return 301 $scheme://{{ __main_name }}$request_uri;
} }
{% endif %} {% endif %}

View File

@@ -1,9 +1,9 @@
{% extends "_base.j2" %} {% extends "_base.j2" %}
{% macro phpv(version) %} {% macro phpv(version) %}
{% if version == 56 or version == "5.6" %} {% if version == 56 or version == "56" or version == "5.6" %}
{{ nginx_upstream_php56 -}} {{ nginx_upstream_php56 -}}
{% elif version == 70 or version == "7.0" %} {% elif version == 70 or version == "70" or version == "7.0" %}
{{ nginx_upstream_php70 -}} {{ nginx_upstream_php70 -}}
{% else %} {% else %}
{# Hack... define another upstream #} {# Hack... define another upstream #}

View File

@@ -1,4 +1,4 @@
FROM williamyeh/ansible:debian8-onbuild FROM williamyeh/ansible:debian8-onbuild
RUN apt-get update RUN apt-get update
CMD ["sh", "tests/test.sh"] CMD ["sh", "tests/travis.sh"]

View File

@@ -6,13 +6,13 @@
- block: - block:
- name: APT | Install DotDeb key - name: APT | Install DotDeb key
apt_key: url='http://www.dotdeb.org/dotdeb.gpg' state=present apt_key: url='http://www.dotdeb.org/dotdeb.gpg' state=present
- name: APT_REPOSITORY | Install dotdeb (PHP 7) - name: APT_REPOSITORY | Install dotdeb (PHP 7)
apt_repository: repo='deb http://packages.dotdeb.org {{ ansible_distribution_release }} all' state=present apt_repository: repo='deb http://packages.dotdeb.org {{ ansible_distribution_release }} all' state=present
- name: LINEFILEFILE | Dotdeb priority (prevent install nginx from dotdeb) - name: LINEFILEFILE | Dotdeb priority (prevent install nginx from dotdeb)
copy: > copy: >
content="Package: *\nPin: release o=packages.dotdeb.org\nPin-Priority: 100" content="Package: *\nPin: release o=packages.dotdeb.org\nPin-Priority: 100"
dest=/etc/apt/preferences dest=/etc/apt/preferences
when: ansible_distribution_release == 'jessie' when: ansible_distribution_release == 'jessie' and dotdeb
- name: APT | Install needed packages - name: APT | Install needed packages
apt: pkg={{ item }} update_cache=yes cache_valid_time=3600 state=present apt: pkg={{ item }} update_cache=yes cache_valid_time=3600 state=present
@@ -20,17 +20,28 @@
- curl - curl
- fcgiwrap - fcgiwrap
- nghttp2 - nghttp2
- php5-fpm
- php5-sqlite
- php7.0-fpm
- php7.0-sqlite3
- strace - strace
- vim - vim
- name: SERVICE | Force start services - name: APT | Install PHP5.6
service: name={{ item }} state=started apt: pkg={{ item }} update_cache=yes cache_valid_time=3600 state=present
register: sf
with_items: with_items:
- php5-fpm - php5-fpm
- php5-sqlite
when: nginx_php56
- name: APT | Install PHP7
apt: pkg={{ item }} update_cache=yes cache_valid_time=3600 state=present
with_items:
- php7.0-fpm - php7.0-fpm
- fcgiwrap - php7.0-sqlite3
when: nginx_php70
- name: SERVICE | Force start services
service: name={{ item.name }} state=started
register: sf
with_items:
- { name: 'php5-fpm', cond: "{{ nginx_php56 }}" }
- { name: 'php7.0-fpm', cond: "{{ nginx_php70 }}" }
- { name: 'fcgiwrap', cond: true }
when: "{{ item.cond }}"

View File

@@ -2,6 +2,10 @@
- hosts: all - hosts: all
pre_tasks: pre_tasks:
- debug: var=dotdeb
- debug: var=nginx_php56
- debug: var=nginx_php70
- debug: var=nginx_backports
- name: INCLUDE | Pre_tasks related to OS version - name: INCLUDE | Pre_tasks related to OS version
include: "includes/pre_{{ ansible_distribution }}.yml" include: "includes/pre_{{ ansible_distribution }}.yml"
- name: FILE | Create an internal SSL dir - name: FILE | Create an internal SSL dir
@@ -16,9 +20,7 @@
# Role vars # Role vars
nginx_worker_processes: 1 # Ansible+FreeBSD can't detect CPU number nginx_worker_processes: 1 # Ansible+FreeBSD can't detect CPU number
nginx_apt_package: 'nginx-extras' nginx_apt_package: 'nginx-extras'
nginx_backports: true nginx_dyn_modules: ['http_geoip']
nginx_php56: true
nginx_php70: true
nginx_upstreams: nginx_upstreams:
- name: 'test' - name: 'test'
servers: servers:
@@ -106,6 +108,13 @@
-----END CERTIFICATE----- -----END CERTIFICATE-----
nginx_custom_http: nginx_custom_http:
- 'add_header X-ansible 1;' - 'add_header X-ansible 1;'
- 'geoip_country /usr/share/GeoIP/GeoIP.dat;'
- 'map $geoip_country_code $allowed_country {'
- ' default yes;'
- ' MA no;'
- ' DZ no;'
- ' TN no;'
- '}'
nginx_default_vhost: 'first-test' nginx_default_vhost: 'first-test'
nginx_default_vhost_ssl: 'test-ssl-predeployed.local' nginx_default_vhost_ssl: 'test-ssl-predeployed.local'
nginx_vhosts: nginx_vhosts:
@@ -138,6 +147,7 @@
location: location:
'/hello': '/hello':
- htpasswd: 'hello' - htpasswd: 'hello'
use_error_log: true
- name: 'test-htpasswd-all.local' - name: 'test-htpasswd-all.local'
template: '_base' template: '_base'
htpasswd: 'hello' htpasswd: 'hello'
@@ -146,8 +156,19 @@
location: location:
'/': '/':
- 'alias /var/tmp;' - 'alias /var/tmp;'
'/a':
- 'alias /var/tmp;'
'/b':
- 'alias /var/tmp;'
'/c':
- 'alias /var/tmp;'
location_order:
- '/'
- '/a'
- '/b'
- '/c'
- name: 'test-php.local' - name: 'test-php.local'
php_version: 70 php_version: "{{ '7.0' if nginx_php70 else '5.6' }}"
upstream_params: upstream_params:
- 'fastcgi_param FOO bar;' - 'fastcgi_param FOO bar;'
redirect_from: redirect_from:
@@ -165,7 +186,7 @@
headers: headers:
'X-proxyfied': '1' 'X-proxyfied': '1'
- name: 'deleted.local' - name: 'deleted.local'
state: 'absent' state: 'absent'
- name: 'redirect-to.local' - name: 'redirect-to.local'
redirect_to: 'http://test.local' redirect_to: 'http://test.local'
- name: 'backuppc.local' - name: 'backuppc.local'
@@ -177,7 +198,6 @@
- name: 'test-ssl.local' - name: 'test-ssl.local'
proto: ['http', 'https'] proto: ['http', 'https']
template: '_base' template: '_base'
ssl_name: 'test-ssl.local'
- name: 'test-ssl-predeployed.local' - name: 'test-ssl-predeployed.local'
proto: ['http', 'https'] proto: ['http', 'https']
template: '_base' template: '_base'
@@ -190,9 +210,15 @@
template: '_base' template: '_base'
ssl_name: 'test-ssl.local' ssl_name: 'test-ssl.local'
redirect_https: true redirect_https: true
# - name: 'owncloud.local' - name: 'test-ssl-proxy-protocol.local'
# template: '_owncloud' proto: ['http', 'https']
nginx_dh_length: 1024 listen: [80, 20080]
listen_ssl: [443, 20443]
http_proxy_protocol_port: [20080]
https_proxy_protocol_port: [20443]
template: '_base'
ssl_name: 'test-ssl.local'
nginx_dh_length: 2048
roles: roles:
- ../../ - ../../
post_tasks: post_tasks:
@@ -209,12 +235,18 @@
with_items: ['test-php.local', 'test-php-index.local'] with_items: ['test-php.local', 'test-php-index.local']
- name: -- Add HTML file -- - name: -- Add HTML file --
copy: dest="{{ item }}/index.html" content="Index HTML test OK\n" copy: dest="{{ item }}/index.html" content="Index HTML test OK\n"
with_items: ['{{ nginx_root }}/first-test/public', '/var/tmp', '{{ nginx_root }}/test-htpasswd-all.local/public', '{{ nginx_root }}/test-ssl.local/public', '{{ nginx_root }}/test-ssl-predeployed.local/public'] with_items: ['{{ nginx_root }}/first-test/public', '/var/tmp', '{{ nginx_root }}/test-htpasswd-all.local/public', '{{ nginx_root }}/test-ssl.local/public', '{{ nginx_root }}/test-ssl-predeployed.local/public', '{{ nginx_root }}/test-ssl-proxy-protocol.local/public']
- name: -- Create directory -- - name: -- Create directory --
file: path={{ nginx_root }}/test-htpasswd.local/public/hello state=directory file: path={{ nginx_root }}/test-htpasswd.local/public/hello state=directory
- name: -- Add HTML file hello -- - name: -- Add HTML file hello --
copy: dest="{{ nginx_root }}/test-htpasswd.local/public/hello/index.html" content="hello\n" copy: dest="{{ nginx_root }}/test-htpasswd.local/public/hello/index.html" content="hello\n"
# -------------------------------- # --------------------------------
# Test custom facts
# --------------------------------
- name: -- CHECK FACTS --
assert:
that: "'{{ ansible_local.nginx.fact_nginx_vhosts[0].name[0] }}' == 'test.local'"
# --------------------------------
# Simple vhosts tests # Simple vhosts tests
# -------------------------------- # --------------------------------
- name: -- VERIFY VHOSTS -- - name: -- VERIFY VHOSTS --
@@ -238,19 +270,13 @@
# -------------------------------- # --------------------------------
# PHP # PHP
# -------------------------------- # --------------------------------
- name: -- VERIFY PHP VHOSTS --
command: "curl -H 'Host: {{ item }}' http://127.0.0.1/"
register: p
changed_when: false
failed_when: p.stdout.find('PHP Version') == -1
with_items: ['test-php.local', 'test-php-index.local']
- name: -- VERIFY PHP5 VHOSTS (implicit default) -- - name: -- VERIFY PHP5 VHOSTS (implicit default) --
command: "curl -H 'Host: {{ item }}' http://127.0.0.1/" command: "curl -H 'Host: {{ item }}' http://127.0.0.1/"
register: p register: p
changed_when: false changed_when: false
failed_when: p.stdout.find('PHP Version 5') == -1 failed_when: p.stdout.find('PHP Version 5') == -1
with_items: ['test-php-index.local'] with_items: ['test-php-index.local']
when: nginx_php56
- name: -- VERIFY PHP7 VHOSTS -- - name: -- VERIFY PHP7 VHOSTS --
command: "curl -H 'Host: {{ item }}' http://127.0.0.1/" command: "curl -H 'Host: {{ item }}' http://127.0.0.1/"
@@ -258,6 +284,7 @@
changed_when: false changed_when: false
failed_when: p.stdout.find('PHP Version 7') == -1 failed_when: p.stdout.find('PHP Version 7') == -1
with_items: ['test-php.local'] with_items: ['test-php.local']
when: nginx_php70
# -------------------------------- # --------------------------------
# Basic Auth # Basic Auth

View File

@@ -5,16 +5,21 @@
DIR=$( dirname $0 ) DIR=$( dirname $0 )
PLAYBOOK="$DIR/test.yml" PLAYBOOK="$DIR/test.yml"
set -ev set -ev
ANSIBLE_VARS="{ nginx_php56: $NGINX_PHP56, nginx_php70: $NGINX_PHP70, nginx_backports: $NGINX_BACKPORTS, dotdeb: $DOTDEB }"
echo $ANSIBLE_VARS
# Check syntax # Check syntax
ansible-playbook -i localhost, -c local --syntax-check -vv $PLAYBOOK ansible-playbook -i localhost, -c local --syntax-check -vv $PLAYBOOK
# Check role # Check role
ansible-playbook -i localhost, -c local --sudo -vv $PLAYBOOK ansible-playbook -i localhost, -c local -e "$ANSIBLE_VARS" --sudo -vv $PLAYBOOK
# Check indempotence # Check indempotence
ansible-playbook -i localhost, -c local --sudo -vv $PLAYBOOK \ ansible-playbook -i localhost, -c local -e "$ANSIBLE_VARS" --sudo -vv $PLAYBOOK \
| grep -q 'changed=0.*failed=0' \ | grep -q 'changed=0.*failed=0' \
&& (echo 'Idempotence test: pass' && exit 0) \ && (echo 'Idempotence test: pass' && exit 0) \
|| (echo 'Idempotence test: fail' && exit 1) || (echo 'Idempotence test: fail' && exit 1)

View File

@@ -23,9 +23,15 @@ nginx_upstream_server_params:
# min_version: '1.5.12' # min_version: '1.5.12'
nginx_dirs: nginx_dirs:
- "{{ nginx_htpasswd_dir }}" - dir: "{{ nginx_htpasswd_dir }}"
- "{{ nginx_ssl_dir }}" mode: "0750"
- "{{ nginx_helper_dir }}" owner: "{{ nginx_user }}"
- dir: "{{ nginx_ssl_dir }}"
mode: "0750"
owner: "root"
- dir: "{{ nginx_helper_dir }}"
mode: "0755"
owner: "root"
nginx_templates_no_dir: nginx_templates_no_dir:
- '_backuppc' - '_backuppc'