Требуемые условия завершения
Задание:
b) Реализуйте следующий функционал на инстансах Cloud-WEB01 и Cloud-WEB02:
- i. Установить Apache2;
- ii. Настроить веб-сервер для обслуживания веб-приложения, обеспечить поддержку PHP;
- iii. Настроить взаимодействие с базой данных;
- iv. Код простого (тестового) веб приложения и подключения к базе данных расположен в Приложении.
- v. В рамках подсети управления (Management-Net) при обращении в веб-браузере с инстанса Cloud-ADM по доменным именам cloud-web01.au.team и cloud-web02.au.team должно отрабатывать веб-приложение.
- vi. Веб-приложение должно быть доступно как по HTTP так и по HTTPS, в случае с HTTPS используйте самоподписанные сертификаты, но с инстанса Cloud-ADM должно быть корректное доверие сертификату.
Вариант реализации:
Cloud-ADM:
- Вся дальнейшая работа реализуется в контексте директории /home/altlinux/bin/ansible:
cd /home/altlinux/bin/ansible
- Создадим файл 'apache2_deploy_playbook.yml', в котором последовательно будем описывать всё что касается настройки веб-серверов Cloud-WEB01 и Cloud-WEB02 в контексте данного задания:
vim apache2_deploy_playbook.yml
-
- Добавляем следующее содержимое:
- см. комментарии в коде;
- Добавляем следующее содержимое:
---
- name: Configuring the Apache2 web server with PHP support
hosts: web
become: true
tasks:
# Установка пакета "apache2"
- name: Install Apache2
community.general.apt_rpm:
name: apache2
state: present
update_cache: true
# Удаление дефолтного файла "/var/www/html/index.html"
- name: Remove default file 'index.html'
ansible.builtin.file:
path: /var/www/html/index.html
state: absent
# Копирование директории с файлами веб приложения из текущей диретории files/web на удаленные веб-сервера в директорию /var/www/html/
- name: Copying files from ./files/web to /var/www/html/
ansible.builtin.copy:
src: files/web/
dest: /var/www/html/
notify:
- Restarted Apache2
# Копирование шаблона конфигурационного файла веб-сервера Apache2 на удалённые сервера
- name: Copy template default.conf for Apache2 to /etc/httpd2/conf/sites-available/default.conf
ansible.builtin.template:
src: templates/apache2_default.conf.j2
dest: /etc/httpd2/conf/sites-available/default.conf
notify:
- Restarted Apache2
# Установка пакета "apache2-mod_ssl" для работы с SSL
- name: Install Apache2 module SSL
community.general.apt_rpm:
name: apache2-mod_ssl
state: present
update_cache: true
# Включение модуля "ssl" в apache2
- name: Enable the Apache2 module ssl
community.general.apache2_module:
state: present
name: ssl
notify:
- Restarted Apache2
# Включение порта "https" в apache2
- name: Enable the Apache2 port https
ansible.builtin.command:
cmd: a2enport https
notify:
- Restarted Apache2
# Копирование шаблона конфигурационного файла веб-сервера Apache2 на удалённые сервера для доступа по HTTPS
- name: Copy template default_https.conf for Apache2 to /etc/httpd2/conf/sites-available/default_https.conf
ansible.builtin.template:
src: templates/apache2_default_https.conf.j2
dest: /etc/httpd2/conf/sites-available/default_https.conf
notify:
- Restarted Apache2
# Создание символьной ссылки на удалённых серверах из /etc/httpd2/conf/sites-available/ в /etc/httpd2/conf/sites-enabled
- name: Add symbolic link /etc/httpd2/conf/sites-available/default_https.conf on /etc/httpd2/conf/sites-enabled/default_https.conf
ansible.builtin.file:
src: /etc/httpd2/conf/sites-available/default_https.conf
dest: /etc/httpd2/conf/sites-enabled/default_https.conf
state: link
notify:
- Restarted Apache2
# Копирование корневого сертификата удостоверяющего центра
- name: Copy SSLCACertificateFile
ansible.builtin.copy:
src: files/ca.crt
dest: /var/lib/ssl/certs/ca.crt
# Копирование сертификатов для веб-приложения
- name: Copy SSLCertificateFile
ansible.builtin.copy:
src: "files/{{ ansible_hostname }}.crt"
dest: /var/lib/ssl/certs/
# Копирование ключей сертификатов для веб-приложения
- name: Copy SSLCertificateKeyFile
ansible.builtin.copy:
src: "files/{{ ansible_hostname }}.key"
dest: /var/lib/ssl/private/
# Копирование цепочки сертификатов для веб-приложения
- name: Copy SSLCertificateChainFile
ansible.builtin.copy:
src: "files/{{ ansible_hostname }}.ca-bundle"
dest: /var/lib/ssl/certs/
# Установка пакета "apache2-mod_php8.2"
- name: Install PHP module for Apache2
community.general.apt_rpm:
name: apache2-mod_php8.2
state: present
update_cache: true
# Установка соответствующих модулей PHP
- name: Install PHP standart modules
community.general.apt_rpm:
name:
- php8.2-mbstring
- php8.2-sockets
- php8.2-gd
- php8.2-xmlreader
- php8.2-pgsql
- php8.2-ldap
- php8.2-openssl
state: present
update_cache: true
# Запуск и добавление в автозагрузку веб-сервера Apache2
- name: Started and enabled Apache2
ansible.builtin.systemd:
name: httpd2
state: started
enabled: true
# Возможность перезапуска веб-сервера Apache2, если происходили какие-либо изменения ...
handlers:
- name: Restarted Apache2
ansible.builtin.systemd:
name: httpd2
state: restarted
- Создаём директорию files, для хранения необходимых файлов:
mkdir files
- В папке files должны быть расположены файлы веб-приложения в папкет web:
- Создаём директорию templates, для хранения шаблонов:
mkdir templates
- В директории templates создаём файл шаблона "apache2_default.conf.j2":
vim templates/apache2_default.conf.j2
-
- и указываем следующее содержимое:
<VirtualHost *>
ServerAdmin admin@au.team
ServerName {{ ansible_hostname }}.au.team:80
DocumentRoot "/var/www/html/"
<Directory />
Include conf/include/Directory_root_default.conf
</Directory>
<Directory "/var/www/html">
Include conf/include/Directory_html_default.conf
</Directory>
ErrorLog /var/log/httpd2/error_log
LogLevel warn
<IfModule log_config_module>
CustomLog /var/log/httpd2/access_log common
</IfModule>
<IfModule alias_module>
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
</IfModule>
<Directory "/var/www/cgi-bin">
Include conf/include/Directory_cgibin_default.conf
</Directory>
</VirtualHost>
- В директории templates создаём файл шаблона "apache2_default_https.conf.j2":
vim templates/apache2_default_https.conf.j2
-
- и указываем следующее содержимое:
<IfModule ssl_module>
<VirtualHost _default_:443>
ServerAdmin admin@au.team
ServerName {{ ansible_hostname }}.au.team:443
DocumentRoot "/var/www/html/"
ErrorLog "/var/log/httpd2/error_log"
TransferLog "/var/log/httpd2/access_log"
SSLEngine on
SSLProtocol all -SSLv2
SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5
SSLCertificateFile "/var/lib/ssl/certs/{{ ansible_hostname }}.crt"
SSLCertificateKeyFile "/var/lib/ssl/private/{{ ansible_hostname }}.key"
SSLCertificateChainFile "/var/lib/ssl/certs/{{ ansible_hostname }}.ca-bundle"
SSLCACertificateFile "/var/lib/ssl/certs/ca.crt"
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory "/var/www/cgi-bin">
SSLOptions +StdEnvVars
</Directory>
<IfModule setenvif_module>
BrowserMatch "MSIE [2-5]" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
</IfModule>
<IfModule log_config_module>
CustomLog "/var/log/httpd2/ssl_request_log" \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</IfModule>
</VirtualHost>
</IfModule>
- Средствами утилиты openssl разворачиваем свой Удостоверяющий Центр сертификатов:
openssl req -x509 -sha256 -days 3653 -newkey rsa:2048 -keyout ca.key -out ca.crt
-
- Результат:
- Добавляем корневой сертификат в хранилище на Cloud-ADM:
sudo cp ca.crt /etc/pki/ca-trust/source/anchors/ && sudo update-ca-trust
- Копируем сертификат в директорию files:
cp ca.crt files/
- Генерируем ключи, запросы и сертификаты для веб:
- ключи:
openssl genrsa -out files/cloud-web01.key 2048
openssl genrsa -out files/cloud-web02.key 2048
-
-
- Результат:
-
-
- запросы:
openssl req -key files/cloud-web01.key -new -out files/cloud-web01.csr
-
-
- Результат:
-
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [RU]:
State or Province Name (full name) []:.
Locality Name (eg, city) []:.
Organization Name (eg, company) []:AU_Team
Organizational Unit Name (eg, section) []:.
Common Name (e.g., your name or your server's hostname) []:cloud-web01.au.team
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
-
- запросы:
openssl req -key files/cloud-web02.key -new -out files/cloud-web02.csr
-
-
- Результат:
-
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [RU]:
State or Province Name (full name) []:.
Locality Name (eg, city) []:.
Organization Name (eg, company) []:AU_Team
Organizational Unit Name (eg, section) []:.
Common Name (e.g., your name or your server's hostname) []:cloud-web02.au.team
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
-
- сертификат для Cloud-WEB01:
cat <<EOF > files/cloud-web01.ext
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
subjectAltName=@alt_names
[alt_names]
DNS.1=cloud-web01.au.team
IP.1=192.168.10.67
EOF
openssl x509 -req -CA ca.crt -CAkey ca.key -in files/cloud-web01.csr -out files/cloud-web01.crt -days 365 -CAcreateserial -extfile files/cloud-web01.ext
-
-
- Результат:
-
-
- сертификат для Cloud-WEB02:
cat <<EOF > files/cloud-web02.ext
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
subjectAltName=@alt_names
[alt_names]
DNS.1=cloud-web02.au.team
IP.1=192.168.10.68
EOF
openssl x509 -req -CA ca.crt -CAkey ca.key -in files/cloud-web02.csr -out files/cloud-web02.crt -days 365 -CAcreateserial -extfile files/cloud-web02.ext
-
-
- Результат:
-
-
- цепочка сертификатов:
cat files/cloud-web01.crt ca.crt > files/cloud-web01.ca-bundle
cat files/cloud-web02.crt ca.crt > files/cloud-web02.ca-bundle
- Запускаем playbook для настройки веб-серверов:
ansible-playbook apache2_deploy_playbook.yml
-
- Результат:
- Проверяем доступ по IP-адресам как по HTTPS так и по HTTP:
- В файл /etc/hosts добавляем 2 записи на Cloud-ADM:
- Проверяем доступ по доменным именам как по HTTPS так и по HTTP:
Последнее изменение: вторник, 24 июня 2025, 12:57