--- # Ubuntu/Debian LEMP WordPress installation - name: Install LEMP stack with WordPress (Ubuntu/Debian) hosts: all become: yes pre_tasks: - name: Gather OS facts setup: gather_subset: - '!all' - '!min' - 'distribution' - 'distribution_version' - 'os_family' - name: Load Debian family variables include_vars: "../vars/debian-family.yml" - name: Debug OS information debug: msg: | OS Family: {{ ansible_os_family }} Distribution: {{ ansible_distribution }} Version: {{ ansible_distribution_version }} Supported: Ubuntu/Debian family systems - name: Verify supported OS fail: msg: "This playbook only supports Ubuntu/Debian systems. Detected: {{ ansible_os_family }}" when: ansible_os_family != "Debian" vars: # WordPress Configuration wordpress_path: "{{ web_root }}" wordpress_url: "http://{{ ansible_default_ipv4.address | default('localhost') }}" # Database Configuration mysql_root_password: "{{ mysql_root_password | default('secure_root_password_' + ansible_date_time.epoch) }}" wordpress_db_name: "{{ wordpress_db_name | default('wordpress_db') }}" wordpress_db_user: "{{ wordpress_db_user | default('wordpress_user') }}" wordpress_db_password: "{{ wordpress_db_password | default('secure_wp_password_' + ansible_date_time.epoch) }}" # WordPress Admin wp_admin_user: "{{ wp_admin_user | default('admin') }}" wp_admin_password: "{{ wp_admin_password | default('secure_admin_password_' + ansible_date_time.epoch) }}" wp_admin_email: "{{ wp_admin_email | default('admin@localhost') }}" wp_site_title: "{{ wp_site_title | default('My WordPress Site') }}" tasks: # Package Installation - name: Update package cache apt: update_cache: yes cache_valid_time: 3600 tags: packages - name: Install all required packages package: name: "{{ packages }}" state: present tags: packages # Service Management - name: Start and enable Nginx service: name: "{{ nginx_service }}" state: started enabled: yes tags: nginx - name: Start and enable MySQL/MariaDB service: name: "{{ mysql_service }}" state: started enabled: yes tags: mysql - name: Start and enable PHP-FPM service: name: "{{ php_fpm_service }}" state: started enabled: yes tags: php # Firewall Configuration - name: Configure firewall (UFW) ufw: rule: allow port: "{{ item }}" proto: tcp loop: - "22" - "80" - "443" tags: firewall # MySQL Security - name: Set MySQL root password mysql_user: name: root password: "{{ mysql_root_password }}" login_unix_socket: /var/run/mysqld/mysqld.sock state: present tags: mysql - name: Create MySQL configuration for root template: src: ../templates/my.cnf.j2 dest: /root/.my.cnf mode: '0600' tags: mysql - name: Remove anonymous MySQL users mysql_user: name: "" host_all: yes state: absent tags: mysql - name: Remove MySQL test database mysql_db: name: test state: absent tags: mysql # WordPress Database Setup - name: Create WordPress database mysql_db: name: "{{ wordpress_db_name }}" state: present tags: mysql - name: Create WordPress database user mysql_user: name: "{{ wordpress_db_user }}" password: "{{ wordpress_db_password }}" priv: "{{ wordpress_db_name }}.*:ALL" host: localhost state: present tags: mysql # WordPress Installation - name: Create web root directory file: path: "{{ wordpress_path }}" state: directory owner: www-data group: www-data mode: '0755' tags: wordpress - name: Download WordPress get_url: url: https://wordpress.org/latest.tar.gz dest: /tmp/wordpress.tar.gz mode: '0644' tags: wordpress - name: Extract WordPress unarchive: src: /tmp/wordpress.tar.gz dest: /tmp/ remote_src: yes tags: wordpress - name: Copy WordPress files command: "cp -r /tmp/wordpress/* {{ wordpress_path }}/" args: creates: "{{ wordpress_path }}/wp-config-sample.php" tags: wordpress - name: Set WordPress file permissions file: path: "{{ wordpress_path }}" owner: "{{ nginx_user }}" group: "{{ nginx_user }}" recurse: yes tags: wordpress # Nginx Configuration - name: Configure Nginx for WordPress template: src: ../templates/wordpress.nginx.j2 dest: "{{ nginx_sites_available }}/wordpress" notify: restart nginx tags: nginx - name: Enable WordPress site file: src: "{{ nginx_sites_available }}/wordpress" dest: "{{ nginx_sites_enabled }}/wordpress" state: link notify: restart nginx tags: nginx - name: Remove default Nginx site file: path: "{{ nginx_sites_enabled }}/default" state: absent notify: restart nginx tags: nginx # PHP Configuration - name: Configure PHP-FPM pool template: src: ../templates/www.conf.j2 dest: "{{ php_fpm_pool_path }}/www.conf" backup: yes notify: restart php-fpm tags: php - name: Configure PHP settings lineinfile: path: "{{ php_cli_config_path }}/php.ini" regexp: "{{ item.regexp }}" line: "{{ item.line }}" backup: yes loop: - { regexp: '^upload_max_filesize', line: 'upload_max_filesize = 64M' } - { regexp: '^post_max_size', line: 'post_max_size = 64M' } - { regexp: '^memory_limit', line: 'memory_limit = 256M' } - { regexp: '^max_execution_time', line: 'max_execution_time = 300' } notify: restart php-fpm tags: php # WordPress Configuration - name: Configure WordPress template: src: ../templates/wp-config.php.j2 dest: "{{ wordpress_path }}/wp-config.php" owner: www-data group: www-data mode: '0600' tags: wordpress # WP-CLI Installation - name: Download WP-CLI get_url: url: https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar dest: /usr/local/bin/wp mode: '0755' tags: wp-cli - name: Verify WP-CLI installation command: wp --info become_user: www-data environment: HOME: "{{ wordpress_path }}" register: wp_cli_info tags: wp-cli - name: Display WP-CLI info debug: var: wp_cli_info.stdout_lines tags: wp-cli handlers: - name: restart nginx service: name: "{{ nginx_service }}" state: restarted - name: restart php-fpm service: name: "{{ php_fpm_service }}" state: restarted - name: restart mysql service: name: "{{ mysql_service }}" state: restarted