Задание:

 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