Ansible Playbook
Сохраните следующий код в файл, например, install_httpd_php.yml:
---
- 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):
all:
hosts:
target_server:
ansible_host: <IP_сервера>
ansible_user: <ваш_пользователь>
ansible_ssh_private_key_file: ~/.ssh/id_rsa # Если используется SSH-ключ
3. Запустите playbook:
ansible-playbook -i inventory.yml install_httpd_php.yml
Проверка
После выполнения playbook:
- Откройте в браузере
http://<IP_сервера>/info.php` и убедитесь, что отображается страница PHP 8.0. - Проверьте версию PHP:
ssh <ваш_пользователь>@<IP_сервера> 'php -v'
Ожидаемый вывод:
PHP 8.0.x (cli) ...
Дополнительно
- Удаление тестового файла: После проверки вы можете добавить задачу в playbook для удаления
/var/www/html/info.php:
- name: Remove test PHP file
file:
path: /var/www/html/info.php
state: absent
Добавьте эту задачу в конец списка задач, если хотите автоматизировать удаление.
- Логи: Если что-то не работает, проверьте логи:
sudo tail -f /var/log/httpd/error_log
sudo tail -f /var/log/php-fpm/error.log
Если у вас есть дополнительные требования (например, установка других расширений PHP или специфические настройки), дайте знать, и я доработаю playbook!
[file-name 000155_2025-06-15_08-20-02.txt]