LogNotes

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!
← Previous Next →
Back to list