2025-06-15 08:20:02
Ниже представлен Ansible playbook для установки и настройки Apache (httpd) с PHP-FPM 8.0 из репозитория Remi на Red Hat Enterprise Linux 8 (RHEL 8). Playbook автоматизирует все шаги из предыдущей инструкции, включая обновление системы, установку пакетов, настройку Apache и PHP-FPM, а также настройку SELinux и брандмауэра. PHP будет доступен как команда `php`, так как вы не используете параллельные версии PHP.
### Ansible Playbook
Сохраните следующий код в файл, например, `install_httpd_php.yml`:
```yaml
---
- name: Install and configure Apache with PHP-FPM 8.0 on RHEL 8
hosts: all
become: yes
tasks:
- name: Update all packages
dnf:
name: '*'
state: latest
register: update_result
retries: 3
delay: 5
until: update_result is success
- name: Install EPEL repository
dnf:
name: epel-release
state: present
- name: Install Remi repository
dnf:
name: https://rpms.remirepo.net/enterprise/remi-release-8.rpm
state: present
disable_gpg_check: yes # GPG check disabled for simplicity; consider enabling in production
- name: Reset PHP module
command: dnf module reset php -y
args:
warn: no # Suppress warning about using command module
- name: Enable PHP 8.0 module from Remi
command: dnf module enable php:remi-8.0 -y
args:
warn: no
- name: Install Apache and PHP packages
dnf:
name:
- httpd
- php
- php-fpm
- php-mysqlnd
- php-gd
- php-xml
- php-mbstring
- php-json
state: present
- name: Start and enable httpd service
systemd:
name: httpd
state: started
enabled: yes
- name: Start and enable php-fpm service
systemd:
name: php-fpm
state: started
enabled: yes
- name: Configure Apache to use PHP-FPM
copy:
content: |
<IfModule mod_proxy_fcgi.c>
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost"
</FilesMatch>
</IfModule>
dest: /etc/httpd/conf.d/php-fpm.conf
mode: '0644'
notify: Restart httpd
- name: Ensure PHP-FPM uses socket
lineinfile:
path: /etc/php-fpm.d/www.conf
regexp: '^listen ='
line: 'listen = /run/php-fpm/www.sock'
state: present
notify: Restart php-fpm
- name: Create test PHP file
copy:
content: |
<?php
phpinfo();
?>
dest: /var/www/html/info.php
mode: '0644'
- name: Set SELinux booleans
seboolean:
name: "{{ item }}"
state: yes
persistent: yes
loop:
- httpd_execmem
- httpd_can_network_connect
when: ansible_selinux.status is defined and ansible_selinux.status == "enabled"
- name: Set SELinux context for /var/www/html
command: chcon -R -t httpd_sys_content_t /var/www/html/
args:
warn: no
when: ansible_selinux.status is defined and ansible_selinux.status == "enabled"
- name: Open HTTP port in firewalld
firewalld:
service: http
permanent: yes
state: enabled
immediate: yes
when: ansible_distribution == "RedHat" and ansible_service_mgr == "systemd"
handlers:
- name: Restart httpd
systemd:
name: httpd
state: restarted
- name: Restart php-fpm
systemd:
name: php-fpm
state: restarted
```
### Объяснение playbook
1. **Обновление системы**: Обновляет все пакеты с помощью `dnf`.
2. **Установка репозиториев**: Устанавливает EPEL и Remi для доступа к PHP 8.0.
3. **Активация модуля PHP**: Сбрасывает существующий модуль PHP и активирует `php:remi-8.0`.
4. **Установка пакетов**: Устанавливает Apache (`httpd`), PHP 8.0, PHP-FPM и необходимые расширения.
5. **Запуск служб**: Запускает и включает автозапуск `httpd` и `php-fpm`.
6. **Настройка Apache**: Создаёт файл `/etc/httpd/conf.d/php-fpm.conf` для интеграции с PHP-FPM через сокет.
7. **Настройка PHP-FPM**: Проверяет, что PHP-FPM использует сокет `/run/php-fpm/www.sock`.
8. **Тестовый файл**: Создаёт файл `info.php` для проверки.
9. **SELinux**: Настраивает SELinux (если включен) для корректной работы Apache.
10. **Брандмауэр**: Открывает порт HTTP в firewalld (если используется).
11. **Handlers**: Перезапускают службы `httpd` и `php-fpm` при необходимости.
### Предварительные требования
- Ansible установлен на управляющей машине.
- Целевая машина — RHEL 8 с доступом к интернету.
- Учетная запись с правами `sudo` (playbook использует `become: yes`).
- SSH-доступ к целевой машине настроен в вашем inventory-файле.
### Запуск playbook
1. Сохраните playbook в файл, например, `install_httpd_php.yml`.
2. Создайте inventory-файл (например, `inventory.yml`):
```yaml
all:
hosts:
target_server:
ansible_host: <IP_сервера>
ansible_user: <ваш_пользователь>
ansible_ssh_private_key_file: ~/.ssh/id_rsa # Если используется SSH-ключ
```
3. Запустите playbook:
```bash
ansible-playbook -i inventory.yml install_httpd_php.yml
```
### Проверка
После выполнения playbook:
- Откройте в браузере `http://<IP_сервера>/info.php` и убедитесь, что отображается страница PHP 8.0.
- Проверьте версию PHP:
```bash
ssh <ваш_пользователь>@<IP_сервера> 'php -v'
```
Ожидаемый вывод:
```
PHP 8.0.x (cli) ...
```
### Дополнительно
- **Удаление тестового файла**: После проверки вы можете добавить задачу в playbook для удаления `/var/www/html/info.php`:
```yaml
- name: Remove test PHP file
file:
path: /var/www/html/info.php
state: absent
```
Добавьте эту задачу в конец списка задач, если хотите автоматизировать удаление.
- **Логи**: Если что-то не работает, проверьте логи:
```bash
sudo tail -f /var/log/httpd/error_log
sudo tail -f /var/log/php-fpm/error.log
```
Если у вас есть дополнительные требования (например, установка других расширений PHP или специфические настройки), дайте знать, и я доработаю playbook!
Back to list