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:

  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]