apache2
Роль Ansible Apache2
Описание
:grey_exclamation: Прежде чем использовать эту роль, пожалуйста, имейте в виду, что все мои роли Ansible полностью написаны и адаптированы к моей IT-инфраструктуре. Поэтому, даже если они максимально универсальны, они не обязательно удовлетворят ваши нужды. Я рекомендую внимательно проанализировать, что они делают, и оценить их возможность безопасной установки на ваших серверах.
Эта роль настраивает экземпляр демона Apache2.
Требования
Требуется Ansible >= 2.4
Зависимости
Если вы используете профиль мониторинга Zabbix, вам понадобится роль ansible-zabbix-agent
Семейство ОС
Эта роль доступна для Debian
Возможности
На данный момент роль может использоваться для:
- установки Apache2
- настройки основного файла сервера
- создания конфигураций виртуальных хостов
- управления включенными модулями
- переопределения конфигураций некоторых модулей
- мониторинга элементов для
- Zabbix
- локальных фактов
Конфигурация
Сервер
Все переменные, которые можно переопределить, хранятся в файле defaults/main.yml, а также в таблице ниже. Для просмотра значений по умолчанию, обращайтесь к этому файлу.
Название | Описание |
---|---|
apache2__version |
Выберите версию apache2 для установки (как доступно в репозиториях ОС) Пример: 2.4.25-3+deb9u5 |
apache2__service_enabled |
Логическое значение, включающее или выключающее службу apache при запуске и во время работы |
apache2__service_restartable |
Если true, служба apache будет автоматически перезапущена при изменении конфигурации (в продакшене лучше установить false) |
apache2__server_tokens |
Настройте уровень детализации токена сервера на страницах ошибок |
apache2__server_signature |
Указывать или не указывать подпись сервера на страницах ошибок |
apache2__trace_enable |
Настройка метода HTTP TRACE |
apache2__ssl_ciphers |
Список доступных SSL шифров, по умолчанию только рекомендованный подмножество настроено |
apache2__ssl_protocols |
Список включенных SSL протоколов, по умолчанию все, кроме SSL 2/3 |
apache2__ssl_honorciphers |
Сообщает серверу предпочитать свой порядок шифрования вместо клиентского |
apache2__log_formats |
Словарь, содержащий все доступные форматы логов в apache. |
apache2__listen_http |
Список порт/хост:порт, на которых apache будет слушать http-запросы |
apache2__listen_https |
Список порт/хост:порт, на которых apache будет слушать https-запросы |
Замечание о apache2__listen_http(s)
: в данный момент эти директивы заполняются вручную, я планировал сгенерировать их автоматически, но это оказалось сложно, потому что виртуальные хосты можно определять с помощью include_role
.
Следующая переменная применяется к серверу и может быть переопределена в каждом виртуальном хосте:
Название | Описание |
---|---|
apache2__serveradmin |
Опциональный адрес электронной почты администратора |
apache2__allow_override_list |
Директива AllowOverrideList |
apache2__allow_override |
Директива AllowOverride |
apache2__options |
Директива Options |
Чтобы настроить, какие модули включены, нужно указать все названия модулей в одном из следующих трех списков:
apache2__modules_enabled_global
apache2__modules_enabled_group
apache2__modules_enabled_host
По умолчанию ни один модуль не включен, поэтому имейте в виду, что apache не запустится без включенного модуля mpm
.
Каждая запись в этих списках должна содержать имя модуля. Если у модуля есть файлы .conf
и .load
, они будут автоматически включены. Кроме того, если роль содержит файл шаблона в директории templates/modules.conf/(имя модуля)
, он заменит любой существующий файл конфигурации дистрибутива.
Виртуальные хосты
Каждый виртуальный хост должен быть объявлен с помощью блока vhost
. Вы можете поместить блок vhost
в любой из трех доступных списков:
apache2__virtual_hosts_global
apache2__virtual_hosts_group
apache2__virtual_hosts_host
По умолчанию каждый виртуальный хост слушает на '*' и на порту по умолчанию, определяемом согласно статусу HTTP(S). Если SSL Engine включен ('ON'), используется порт 443, в противном случае - 80.
Только подмножество директив и секций apache2 реализовано в ansible, доступные из них можно увидеть в файлах directives sections. Если вам нужна директива, которая не реализована, вы можете использовать элемент extra_parameters
. Однако, если секция отсутствует, вам нужно создать свою версию и реализовать ее в роли.
Каждый блок vhost
должен быть помещен в словарь, где ключ будет именем файла конфигурации vhost
. Затем каждый vhost
должен быть словарем, который может содержать следующие переменные:
Название | Тип | Описание |
---|---|---|
hosts | строка или массив строк/слов | список интерфейсов, на которых будет слушать виртуальный хост |
hosts[] | строка | если элемент списка hosts является строкой, он будет интерпретироваться как "IP:PORT" или "X.X.X.X:X" |
hosts[].ip | строка | если элемент списка hosts является словарем с ключом 'ip', он будет интерпретироваться как "IP" |
hosts[].port | целое число | если элемент списка hosts является словарем с ключом 'port', он будет использоваться как порт для прослушивания. Если этот ключ не установлен, он будет выведен из HTTP-протокола (см. выше) |
server_name | строка | хост виртуального хоста |
server_alias | строка | псевдоним имени хоста |
server_admin | строка | опциональный адрес электронной почты администратора |
document_root | строка | Путь к корневой папке документов. Эта папка будет автоматически создана, потому что Apache не запустится, если ее не будет. |
document_root_user | строка | Unix-владелец корневой папки документов. Это применяется только если переменная определена |
document_root_group | строка | Unix-группа корневой папки документов. Это применяется только если переменная определена |
document_root_mode | строка | Unix-режим корневой папки документов. Это применяется только если переменная определена. Убедитесь, что apache все еще имеет доступ к этой папке хотя бы в режиме только для чтения |
error_log | строка | Путь к файлу журнала ошибок. Файл журнала ошибок будет создан в этой директории, поэтому убедитесь, что у apache достаточно прав доступа |
error_log_user | строка | Unix-владелец директории журнала ошибок |
error_log_group | строка | Unix-группа директории журнала ошибок |
allow_override | строка | Директива AllowOverride |
allow_override_list | строка | Директива AllowOverrideList |
options | строка | Директива Options |
headers | массив | Массив директив заголовков |
files_match | массив словарей (см. ниже) | Содержит определения FileMatch, каждый из которых должен быть словарем с следующими ключами |
files_match[].regexp | строка | Регулярное выражение, которое вызывает совпадение файла |
files_match[].actions | массив строк | Список директив Apache для выполнения, когда совпадение файла сработает |
extra_parameters | массив строк | Любые дополнительные директивы Apache |
https | словарь | см. ниже для всех подключенных ключей |
https.enabled | boolean | Включен по умолчанию, может использоваться для отключения https и сохранения конфигурационных строк |
https.certificate_chain_file | строка | Путь к цепочке сертификатов |
https.verify_client | строка | Тип проверки сертификатов клиента, который нужно выполнить |
https.verify_client_depth | целое число | Максимальная глубина для проверки сертификатов клиента |
https.ca_certificate_path | строка | Путь к директории сертификатов CA |
https.ca_certificate_file | строка | Путь к файлу сертификата CA |
https.crl_path | строка | Путь к папке CRL |
https.crl_file | строка | Путь к файлу CRL |
Факты
По умолчанию локальные факты устанавливаются и показывают следующие переменные:
ansible_local.apache2.version_full
ansible_local.apache2.version_major
Пример
Плейбук
Используйте его в плейбуке следующим образом:
- hosts: all
roles:
- turgon37.apache2
Инвентарь
- Пример мануально загруженных модулей apache
apache2__modules_enabled_group:
- access_compat # поддержка устаревших директив Allow, Order
- alias # предоставляет Alias
# - auth_basic # предоставляет базовую HTTP-аутентификацию
- authn_core
# - authn_file # аутентификация на основе htpasswd
- authz_core
# - authz_host # аутентификация по ip/host
# - authz_user # аутентификация по имени пользователя
# - autoindex # отключен, индексация отключена
- deflate # предоставляет Gzip-сжатие
- dir # предоставляет DirectoryIndex
- env # предоставляет SetEnv
# - filter # предоставляет FilterChain
- headers # предоставляет RequestHeader
- mime
- mpm_prefork
- negotiation # обрабатывает тип контента
- php7.0
# - proxy
# - proxy_http
# - setenvif
- ssl # Обработка SSL
- socache_shmcb # требуется для mod_ssl
- Виртуальный хост по умолчанию для debian
apache2__host_virtual_hosts:
000-default:
server_name: www.example.com
server_admin: webmaster@localhost
document_root: /var/www/html
sections:
- type: directory
path: /var/www/html
directives:
- require: all granted
error_log: '{{ apache2__log_directory }}/error.log'
custom_log: '{{ apache2__log_directory }}/access.log combined'
- Простой постоянный редирект с HTTP на HTTPS
apache2__host_virtual_hosts:
web-redirect:
hosts:
- ip: "10.0.0.1"
server_name: www.example.net
server_alias: www2.example.net
extra_parameters:
- RedirectPermanent / https://www.example.net/
- Проксирование HTTPs на HTTP
apache2__host_virtual_hosts:
proxy-https:
hosts:
- ip: 10.0.0.1
- ip: 192.168.56.12
server_name: www.example.net
server_alias: www2.example.net
extra_parameters:
- 'ProxyRequests Off'
- 'ProxyPreserveHost On'
- 'ProxyPass / http://localhost:3001/'
- 'ProxyPassReverse / https://localhost:3001/'
https:
certificate_file: /etc/ssl/apache2/www.example.net.pem
certificate_key_file: /etc/ssl/apache2/www.example.net.key
- HTTP виртуальный хост с корневой папкой и PHP приложением (Jeedom)
apache2__host_virtual_hosts:
hosts:
- 10.0.0.1
- "127.0.0.1:443"
server_name: jeedom.example.net
document_root: /var/www/html
document_root: '{{ jeedom__install_directory }}'
document_root_user: '{{ apache2__service_user }}'
document_root_group: '{{ apache2__service_user }}'
error_log: '{{ jeedom__install_directory }}/log/http.error'
error_log_user: '{{ apache2__service_user }}'
error_log_group: '{{ apache2__service_user }}'
sections:
- type: directory
path: '{{ jeedom__install_directory }}'
directives:
- allow_override: All
- options: -Indexes -ExecCGI -FollowSymLinks
- require: all granted
- type: files_match
regex: '\.(appcache|atom|bbaw|bmp|crx|css|cur|eot|f4[abpv]|flv|geojson|gif|htc|ico|jpe?g|js|json(ld)?|m4[av]|manifest|map|mp4|oex|og[agv]|opus|otf|pdf|png|rdf|rss|safariextz|svgz?|swf|topojson|tt[cf]|txt|vcard|vcf|vtt|webapp|web[mp]|webmanifest|woff2?|xloc|xml|xpi)$'
directives:
- header:
- unset Content-Security-Policy
- unset X-Frame-Options
- unset X-XSS-Protection
directives:
- header:
# Политика безопасности содержимого (CSP)
#- set Content-Security-Policy "script-src 'self'; object-src 'self'"
# Снижение рисков безопасности типов MIME
- set X-Content-Type-Options "nosniff"
# Clickjacking
- set X-Frame-Options "DENY"
# Отраженные атаки XSS
- set X-XSS-Protection "1; mode=block"
- unset X-Powered-By
- HTTPS виртуальный хост с корневой папкой и PHP приложением (Jeedom)
apache2__host_virtual_hosts:
jeedom-https:
hosts:
- ip: 10.0.0.1
- ip: 127.0.0.1
port: 4343
server_name: jeedom.example.net
document_root: /var/www/html
allow_override: All
options: '-Indexes -ExecCGI -FollowSymLinks'
headers:
- set X-Content-Type-Options "nosniff"
- always set Strict-Transport-Security "max-age=16070400; includeSubDomains"
- set X-XSS-Protection "1; mode=block"
- unset X-Powered-By
files_match:
- regexp: '\.(appcache|atom|bbaw|bmp|crx|css|cur|eot|f4[abpv]|flv|geojson|gif|htc|ico|jpe?g|js|json(ld)?|m4[av]|manifest|map|mp4|oex|og[agv]|opus|otf|pdf|png|rdf|rss|safariextz|svgz?|swf|topojson|tt[cf]|txt|vcard|vcf|vtt|webapp|web[mp]|webmanifest|woff2?|xloc|xml|xpi)$'
actions:
- Header unset Content-Security-Policy
- Header unset X-Frame-Options
- Header unset X-XSS-Protection
https:
certificate_file: /etc/ssl/apache2/jeedom.www.example.net.pem
certificate_key_file: /etc/ssl/apache2/jeedom.www.example.net.key
ansible-galaxy install Turgon37/ansible-apache2