galaxyproject.nginx
nginx
一个用于安装和管理 nginx 服务器的 Ansible 角色。
需求
该角色在 Debian 系统上通过 APT 安装 nginx,在企业 Linux 系统上通过 EPEL 安装,或者在 SmartOS 上通过 pkgin 安装。其他系统和安装方法不受支持。
角色变量
所有变量都是可选的。
一般配置
nginx_flavor(默认:full): 要安装的 nginx 软件包(有关选择,请查看您基于 Debian 的分发版的nginx元软件包提供程序)。在基于 RedHat 的分发版中,可以选择galaxy(表示“Galaxy nginx”,包括 nginx 上传和 pam 模块),或者其他值用于 EPEL nginx。在 pkgin/SmartOS 安装中不使用该值。通常可以使用 TUS,full是未来的安全默认值。nginx_servers: 一组server {}(虚拟主机)模板(相对于templates/nginx/,文件后缀.j2会在搜索时自动添加到列表项中)。nginx_ssl_servers: 类似于nginx_servers,但仅在配置了 SSL 时安装。nginx_conf_http: 在nginx.conf的http {}部分设置任意选项。这是一个哈希(字典),其中键为 nginx 配置选项,值为选项的值。nginx_default_redirect_uri: 使用来自 EPEL 的 nginx 时,会启用一个默认虚拟主机。此选项控制默认虚拟主机应重定向到的 URI。支持 nginx 变量。nginx_enable_default_server(默认:true): 启用/禁用默认 EPEL 虚拟主机。nginx_supervisor: 在 supervisor 下运行 nginx(需要设置某些 supervisor 变量)。nginx_conf_dir(默认:/etc/nginx): nginx 配置目录。
SSL 配置
nginx_conf_ssl_certificate* 变量控制 SSL 的使用。如果未设置,SSL 将不会启用。有关用法,请参见示例剧本。
nginx_conf_ssl_certificate: 远程主机上 SSL 证书的文件名。nginx_conf_ssl_certificate_key: 远程主机上 SSL 私钥的文件名。nginx_conf_ssl_ciphers:nginx.conf中的ssl_ciphers选项,这是一个 列表。nginx_conf_ssl_protocols:nginx.conf中的ssl_protocols选项,这是一个 列表。
外部 SSL 配置
nginx_ssl_role(默认: 未定义): 用于设置 SSL 的角色。这允许使用(例如)usegalaxy_eu.certbot,通常必须在 nginx 设置并在端口 80 上运行后运行,但必须在 nginx 尝试使用 SSL 之前运行(因为在 certbot 运行之前,nginx 期望的证书还不存在)。设置此项将在该角色的适当点运行 SSL 角色。另见nginx_ssl_servers。nginx_conf_ssl_certificate: SSL 证书的文件名。nginx_conf_ssl_certificate_key: SSL 私钥的文件名。
在此模式下,nginx_conf_ssl_certificate* 变量应为绝对路径。
剧本 SSL 配置
如果未设置 nginx_ssl_role,您可以使用此角色从剧本中复制证书和密钥。
nginx_ssl_conf_dir(默认:<nginx_conf_dir>/ssl): 将 SSL 证书和其他与 SSL 相关的文件复制到的位置。nginx_ssl_src_dir(默认:files/ssl): 从中复制 SSL 证书的位置。sslkeys: 一个哈希(字典),包含私钥。键是文件名(不带前导路径元素),与nginx_conf_ssl_certificate_key匹配。nginx_conf_ssl_trusted_certificate: 用于 OCSP stapling 的受信任证书的文件名(设置启用 stapling)。
在此模式下,nginx_conf_ssl_certificate* 变量应为相对路径。然而,出于兼容性原因,它们可以是远程主机上文件的绝对路径。如果是这种情况,则在不包含路径的目录部分下搜索证书。如果路径不是绝对路径,则它相对于源的 nginx_ssl_src_dir 和目标的 nginx_ssl_conf_dir。
SELinux
如果 SELinux 处于强制模式,将采取额外的几项操作:
- 如果设置了
certbot_well_known_root,它将被更新以允许所有子目录的类型为httpd_sys_content_t的权限。 nginx_selinux_allow_local_connections(默认:false): 允许 nginx 连接到本地主机。
依赖
虽然不是必需的,但可以使用 geerlingguy.repo-epel 来通过 Ansible 启用 EPEL。
示例剧本
以下是一些示例剧本,取决于您获取证书的方式。
本地 SSL 证书
安装 nginx,并使用存储在剧本中的 SSL 证书(证书位于 {{ playbook_dir }}/files/ssl/snakeoil_cert.pem):
- name: 安装并配置 nginx
hosts: webservers
vars:
sslkeys:
snakeoil_privatekey.pem: |
-----BEGIN PRIVATE KEY-----
MIIE...
-----END PRIVATE KEY-----
nginx_conf_ssl_certificate: snakeoil_cert.pem
nginx_conf_ssl_certificate_key: snakeoil_privatekey.pem
nginx_servers:
- vhost1
- vhost2
nginx_conf_http:
client_max_body_size: 1g
roles:
- galaxyproject.nginx
Let's Encrypt
使用来自 Let's Encrypt 的证书安装 nginx,通过 Certbot 使用 usegalaxy_eu.certbot:
- name: 安装并配置 nginx
hosts: webservers
vars:
nginx_conf_ssl_certificate: /etc/ssl/certs/fullchain.pem
nginx_conf_ssl_certificate_key: /etc/ssl/private/private.pem
nginx_servers:
- vhost1
- vhost2
nginx_ssl_servers:
- vhost1_ssl
- vhost2_ssl
nginx_conf_http:
client_max_body_size: 1g
nginx_ssl_role: usegalaxy_eu.certbot
certbot_auth_method: --webroot
certbot_domains:
- vhost1.example.org
- vhost2.example.org
certbot_admin_email: [email protected]
certbot_agree_tos: --agree-tos
certbot_well_known_root: /var/www/_well-known_root
certbot_post_renewal: |
systemctl restart nginx || true
roles:
- galaxyproject.nginx
在 templates/nginx/vhost1.j2 和 templates/nginx/vhost2.j2 中,请确保添加如下内容:
server {
location /.well-known/ {
root {{ certbot_well_known_root }};
}
}
自签名证书
安装 nginx 并使用生成的自签名 SSL 证书(适合在防火墙后测试安全服务):
- name: 安装并配置 nginx
hosts: webservers
vars:
nginx_servers:
- vhost1
- vhost2
nginx_ssl_servers:
- vhost1_ssl
- vhost2_ssl
nginx_conf_http:
client_max_body_size: 1g
nginx_ssl_role: galaxyproject.self_signed_certs
openssl_domains: # 与 certbot_domains 的行为相同
- vhost1.example.org
- vhost2.example.org
# 您可以将其设置为希望存储证书和私钥的位置。
nginx_conf_ssl_certificate_key: /etc/ssl/private/{{ openssl_domains[0] }}.pem
nginx_conf_ssl_certificate: /etc/ssl/certs/{{ openssl_domains[0] }}.crt
roles:
- galaxyproject.nginx
