-
Notifications
You must be signed in to change notification settings - Fork 1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add molecule configuration for nginx role #58
Changes from 31 commits
be5d84e
0089d13
19df1e5
1a1f1bb
10f502d
36b0f4b
9e0a55e
d75ae33
d58fa8b
f4fe7ea
a5e9ce7
76b5442
ed7337c
51c0c4d
a18bfac
a8d2f8b
600c0a4
f354329
e0f9576
91e87d1
d370b5e
dee847f
2aef7a1
9c86fe5
94539a6
863b812
01672b1
fc39135
0861270
a9865ff
e2d2989
0c62327
9a56f97
5dc91c3
108d39f
88351f5
2ad6fb6
c077dda
c7d855d
c69df49
ac8ca63
8b0b21e
08ef842
b8f4dd1
02ec02c
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -6,6 +6,7 @@ on: | |
- "roles/xnat_container_service/**" | ||
- "playbooks/install_xnat.yml" | ||
- "playbooks/install_container_service.yml" | ||
- "playbooks/molecule/**/xnat/**" | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. ensure the tests run whenever the molecule molecule configuration or inventory changes |
||
- ".github/workflows/molecule-install-xnat.yml" | ||
release: | ||
types: [published] | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
name: Test nginx | ||
on: | ||
pull_request: | ||
paths: | ||
- "roles/nginx/**" | ||
- ".github/workflows/molecule.yml" | ||
- ".github/workflows/molecule-nginx.yml" | ||
|
||
jobs: | ||
molecule-nginx: | ||
uses: ./.github/workflows/molecule.yml | ||
with: | ||
tests-path: ansible_collections/mirsg/infrastructure/roles/nginx |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,14 +1,11 @@ | ||
--- | ||
# Bit size for OpenSSL Diffie-Hellman Parameters. Higher bit sizes are more | ||
# secure, but require exponentially larger times for the one-off parameter | ||
# generation. Use 4096 for production. These may take 10mins+ to generate but | ||
# are only generated once per server. | ||
# For local testing (non-production), use 2096 to speed up deployment. | ||
diffie_helman_size_bits: 2048 | ||
|
||
# Support for ipv6 | ||
ipv6_enabled: false | ||
|
||
# nginx config | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Should this be in the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. yep! |
||
nginx_diffie_helman_size_bits: 2048 | ||
nginx_conf_template: "nginx_xnat_as_default.j2" | ||
|
||
# XNAT configuration shared between all servers | ||
xnat_common_config: | ||
admin_email: "xnatadmin@{{ hostvars['xnat_web']['hostname'] }}" | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
--- | ||
- name: Verify XNAT instance is running | ||
hosts: localhost | ||
tasks: | ||
- name: Get server status | ||
ansible.builtin.uri: | ||
url: http://localhost:8000 | ||
method: GET | ||
validate_certs: false | ||
return_content: true | ||
register: response | ||
|
||
- name: Check server status and response | ||
ansible.builtin.assert: | ||
that: | ||
- response.status == 200 | ||
- response.server == "nginx" | ||
- "{{ response.content is search('MIRSG XNAT') }}" | ||
p-j-smith marked this conversation as resolved.
Show resolved
Hide resolved
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -12,6 +12,7 @@ firewalld_work_zone_open_services: | |
- http | ||
- https | ||
firewalld_public_zone_ports: | ||
- "80" | ||
- "8080" | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Do we need to open There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. nope, I've removed it |
||
firewalld_internal_zone_ports: | ||
- "5432" |
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
@@ -0,0 +1,52 @@ | ||||||
# mirsg.infrastructure.nginx | ||||||
|
||||||
This role is for configuring [nginx](https://www.nginx.com/) as a | ||||||
[reverse proxy](https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/) | ||||||
on CentOS 7 or RockyLinux 9. | ||||||
|
||||||
## Role Variables | ||||||
|
||||||
| Name | Description | | ||||||
| --------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | ||||||
| `nginx_owner` | The OS user that will have ownership of the nginx service file and directory. Defaults to `root` | | ||||||
| `nginx_group` | The OS group that will have ownership of the nginx service file and directory. Defaults to `root` | | ||||||
| `nginx_log_folder` | The path to the nginx logs. Defaults to `/var/log/nginx` | | ||||||
| `nginx_http_port` | The port to listen on for HTTP connections. Defaults to `80` | | ||||||
| `nginx_https_port` | The port to listen on for HTTPS connections. Defaults to `80` | | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
| `nginx_proxy_port` | The port to forward requests to. Defaults to `8080` (tomcat) | | ||||||
| `nginx_root` | The path to search for static files. Defaults to `/usr/share/tomcat/webapps/ROOT` | | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I know this is for convenience but I'm not sure about setting defaults for tomcat (or any specific web framework). There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. yeah definitely, agreed |
||||||
| `nginx_conf_template` | The template to use for generating the NGINX config. See currently available [templates](templates/). Defaults to `nginx_xnat.j2`, which is used to configure NGINX as a reverse proxy for XNAT | | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Again I'm not sure about having an XNAT default. Can we have a basic reverse proxy config? |
||||||
| `nginx_conf_file` | The path to write the NGINX config to. Defaults to `/etc/nginx/nginx.conf` | | ||||||
| `nginx_ipv6_enabled` | Whether to enable support for IPv6. Defaults to `false` | | ||||||
|
||||||
If you would like to use SSL with NGINX, you will need to have the | ||||||
certificate and key on your Ansible Controller, and may also need to set | ||||||
the following variables: | ||||||
|
||||||
| Name | Description | | ||||||
| ------------------------------- | ----------------------------------------------------------------------------------------- | | ||||||
| `nginx_use_ssl` | Whether to use SSL. Defaults to `true` | | ||||||
| `nginx_certs_dir` | Where to store the certificates. Defaults to `/etc/nginx/ssl` | | ||||||
| `nginx_server_cert_cache` | Path to SSL certificate on the Ansible Controller. No default | | ||||||
| `nginx_server_key_cache` | Path to SSL certificate on the Ansible Controller. No default | | ||||||
| `nginx_ssl_cert_file` | Path to copy the SSL certificate to. Defaults to `/etc/nginx/ssl/server.cert` | | ||||||
| `nginx_ssl_key_file` | Path to copy the SSL key to. Defaults to `/etc/nginx/ssl/server.key` | | ||||||
| `nginx_diffie_helman_size_bits` | Bit size for OpenSSL Diffie-Hellman Parameters. Defaults to `4096` | | ||||||
| `nginx_dh_params_file` | Path to write the Diffie-Hellman Parameters to. Defaults to `"/etc/nginx/ssl/dhparam.pem` | | ||||||
|
||||||
## Dependencies | ||||||
|
||||||
You will need to install the following collections before using `mirsg.infrastructure.nginx`: | ||||||
|
||||||
- `ansible.posix` | ||||||
- `community.crypto` | ||||||
- `community.general` | ||||||
|
||||||
## Example Playbook | ||||||
|
||||||
```yaml | ||||||
- name: Configure nginx | ||||||
hosts: all | ||||||
roles: | ||||||
- mirsg.infrastructure.nginx | ||||||
``` |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
--- | ||
# test this scenario from the roles/provision directory with the command | ||
# molecule --base-config ../../molecule_configs/centos7_base_config.yml test --scenario centos7 | ||
platforms: | ||
- name: instance | ||
hostname: molecule.instance.local | ||
image: ${MOLECULE_DOCKER_IMAGE:-geerlingguy/docker-centos7-ansible:latest} | ||
required: true | ||
command: "" | ||
cgroupns_mode: host | ||
privileged: true | ||
pre_build_image: ${MOLECULE_PRE_BUILD_IMAGE:-true} | ||
volumes: | ||
- ./molecule-data:/storage/molecule | ||
keep_volumes: false | ||
groups: | ||
- all | ||
- molecule | ||
- centos7 | ||
docker_networks: | ||
- name: molecule | ||
ipam_config: | ||
- subnet: 192.168.56.0/24 | ||
gateway: 192.168.56.1 | ||
networks: | ||
- name: molecule | ||
ipv4_address: 192.168.56.2 | ||
exposed_ports: | ||
- 80 | ||
- 443 | ||
- 8000 | ||
published_ports: | ||
- 127.0.0.1:8080:80 | ||
etc_hosts: | ||
molecule.instance.local: 192.168.56.2 |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
--- | ||
- name: Configure nginx as a reverse proxy | ||
hosts: all | ||
become: true | ||
gather_facts: true | ||
roles: | ||
- role: mirsg.infrastructure.nginx |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
from flask import Flask | ||
|
||
app = Flask(__name__) | ||
|
||
@app.route("/") | ||
def index(): | ||
return "<h1>Hello World!</h1>" |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
--- | ||
nginx_conf_template: "nginx_gunicorn.j2" | ||
nginx_server_name: molecule.instance.local | ||
nginx_proxy_port: 8000 | ||
nginx_diffie_helman_size_bits: 2048 | ||
nginx_root: "/home/" | ||
nginx_use_ssl: false |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
--- | ||
# mirsg.infrastructure.install_python | ||
install_python: | ||
version: "2" | ||
pip_version: "20.3.4" | ||
pip_executable: "pip" | ||
p-j-smith marked this conversation as resolved.
Show resolved
Hide resolved
|
||
system_packages: | ||
- python | ||
- python-pip | ||
- python-setuptools | ||
- libselinux-python | ||
- policycoreutils-python | ||
pip_packages: | ||
- gunicorn | ||
- Flask | ||
|
||
gunicorn_executable: /usr/bin/gunicorn |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
--- | ||
# mirsg.infrastructure.install_python | ||
install_python: | ||
version: "3" | ||
pip_version: "21.3.1" | ||
pip_executable: "/usr/local/bin/pip3" | ||
p-j-smith marked this conversation as resolved.
Show resolved
Hide resolved
|
||
system_packages: | ||
- python3 | ||
- python3-pip | ||
- python3-setuptools | ||
- python3-libselinux | ||
- policycoreutils-python-utils | ||
pip_packages: | ||
- gunicorn | ||
- flask | ||
|
||
gunicorn_executable: /usr/local/bin/gunicorn |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
--- | ||
- name: Install and configure Flask and Gunicorn | ||
hosts: all | ||
become: true | ||
gather_facts: true | ||
tasks: | ||
- name: Install python and Flask/Gunicorn dependencies | ||
ansible.builtin.include_role: | ||
name: mirsg.infrastructure.install_python | ||
|
||
- name: Copy Flask app to host | ||
ansible.builtin.copy: | ||
src: app.py | ||
dest: /home/app.py | ||
owner: root | ||
group: root | ||
mode: "0644" | ||
|
||
- name: Create Gunicorn service config | ||
ansible.builtin.template: | ||
src: gunicorn_service.j2 | ||
dest: /etc/systemd/system/gunicorn.service | ||
owner: root | ||
group: root | ||
mode: "0644" | ||
force: true | ||
|
||
- name: Start Gunicorn service | ||
ansible.builtin.systemd: | ||
name: gunicorn | ||
state: restarted |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do we need the above to catch changes to the molecule configuration?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think the molecule config changes should be included with the line below (
- "playbooks/molecule/**/xnat/**"
)