This guide provides a complete Ansible playbook to install PHP Server Monitor from source with proper configuration for web-based server and website monitoring.
Current PHP Server Monitor version: 3.6.0
Create a file named phpservermonitor.yml:
---
- name: Install and Configure PHP Server Monitor
hosts: phpservermonitor
become: true
vars:
psm_version: "3.6.0"
psm_port: 80
psm_dir: "/var/www/phpservermonitor"
mysql_root_password: "mysql_root_secure_password"
psm_db_password: "psm_db_password"
psm_admin_password: "admin_123" # Change this!
tasks:
- name: Install prerequisites (Debian/Ubuntu)
apt:
name:
- mariadb-server
- mariadb-client
- python3-pymysql
- php
- php-mysql
- php-curl
- php-gd
- php-mbstring
- php-xml
- php-zip
- nginx
- git
- unzip
state: present
update_cache: true
when: ansible_os_family == "Debian"
- name: Install prerequisites (RHEL/CentOS)
yum:
name:
- mariadb-server
- mariadb
- python3-PyMySQL
- php
- php-mysqlnd
- php-curl
- php-gd
- php-mbstring
- php-xml
- php-zip
- nginx
- git
- unzip
state: present
when: ansible_os_family == "RedHat"
- name: Enable and start MariaDB/MySQL
systemd:
name: "{{ 'mariadb' if ansible_os_family == 'Debian' else 'mysqld' }}"
enabled: true
state: started
- name: Set MySQL root password
mysql_user:
name: root
password: "{{ mysql_root_password }}"
login_unix_socket: /var/run/mysqld/mysqld.sock
state: present
when: ansible_os_family == "Debian"
- name: Create PSM database
mysql_db:
name: phpservermonitor
state: present
login_unix_socket: /var/run/mysqld/mysqld.sock
login_user: root
login_password: "{{ mysql_root_password }}"
- name: Create PSM database user
mysql_user:
name: psm
password: "{{ psm_db_password }}"
priv: "phpservermonitor.*:ALL"
host: localhost
state: present
login_unix_socket: /var/run/mysqld/mysqld.sock
login_user: root
login_password: "{{ mysql_root_password }}"
- name: Create PSM directory
file:
path: "{{ psm_dir }}"
state: directory
owner: www-data
group: www-data
mode: '0755'
- name: Download PHP Server Monitor
get_url:
url: "https://github.com/phpservermonitor/phpservermonitor/archive/refs/tags/v{{ psm_version }}.tar.gz"
dest: "/tmp/psm.tar.gz"
mode: '0644'
- name: Extract PHP Server Monitor
unarchive:
src: /tmp/psm.tar.gz
dest: /tmp
remote_src: true
creates: "/tmp/phpservermonitor-{{ psm_version }}"
- name: Copy PSM files to web directory
copy:
src: "/tmp/phpservermonitor-{{ psm_version }}/"
dest: "{{ psm_dir }}/"
remote_src: true
owner: www-data
group: www-data
- name: Set proper permissions
file:
path: "{{ psm_dir }}"
owner: www-data
group: www-data
mode: '0755'
recurse: true
- name: Create PSM configuration
copy:
dest: "{{ psm_dir }}/config.php"
owner: www-data
group: www-data
mode: '0644'
content: |
<?php
// PHP Server Monitor Configuration
define('PSM_DB_HOST', 'localhost');
define('PSM_DB_PORT', '3306');
define('PSM_DB_USER', 'psm');
define('PSM_DB_PASS', '{{ psm_db_password }}');
define('PSM_DB_NAME', 'phpservermonitor');
define('PSM_DB_PREFIX', 'psm_');
define('PSM_BASE_URL', 'http://{{ ansible_default_ipv4.address | default(ansible_host) }}/');
define('PSM_LANGUAGE', 'en_US');
define('PSM_EMAIL_SMTP_HOST', 'smtp.example.com');
define('PSM_EMAIL_SMTP_PORT', '587');
define('PSM_EMAIL_SMTP_USERNAME', 'psm@example.com');
define('PSM_EMAIL_SMTP_PASSWORD', 'smtp_password');
define('PSM_EMAIL_FROM_EMAIL', 'psm@example.com');
define('PSM_EMAIL_FROM_NAME', 'PHP Server Monitor');
- name: Configure Nginx for PSM
copy:
dest: /etc/nginx/sites-available/phpservermonitor
owner: root
group: root
mode: '0644'
content: |
server {
listen {{ psm_port }};
server_name {{ ansible_fqdn | default(ansible_hostname) }};
root {{ psm_dir }}/public;
index index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.ht {
deny all;
}
}
when: ansible_os_family == "Debian"
- name: Enable PSM site (Debian/Ubuntu)
file:
src: /etc/nginx/sites-available/phpservermonitor
dest: /etc/nginx/sites-enabled/phpservermonitor
state: link
when: ansible_os_family == "Debian"
- name: Restart Nginx
systemd:
name: nginx
enabled: true
state: restarted
- name: Configure firewall (UFW)
ufw:
rule: allow
port: "{{ psm_port }}"
proto: tcp
comment: "PHP Server Monitor web interface"
when: ansible_os_family == "Debian"
failed_when: false
- name: Run PSM installer
uri:
url: "http://localhost/install/"
method: GET
status_code: 200
register: install_check
failed_when: false
- name: Display PSM status
debug:
msg: |
PHP Server Monitor {{ psm_version }} installed successfully!
Web Interface: http://{{ ansible_default_ipv4.address | default(ansible_host) }}/
Installation directory: {{ psm_dir }}
Database: phpservermonitor@localhost
IMPORTANT: Complete installation via web interface and change default password!
---
phpservermonitor:
hosts:
psm-server:
ansible_host: 192.168.1.127
ansible_user: ansible
ansible_become: true
# Test connectivity
ansible all -i inventory.yml -m ping
# Run the PSM playbook
ansible-playbook -i inventory.yml phpservermonitor.yml
# Access web installer
# http://psm-server/install/
# Follow web installation wizard
# Create admin account
# Configure monitoring targets
# Test database connection
mysql -u psm -ppsm_db_password -e "SELECT 1"
# Check database exists
mysql -u psm -p -D phpservermonitor -e "SHOW TABLES"
# Check Nginx logs
sudo tail -f /var/log/nginx/error.log
# Check PHP errors
sudo tail -f /var/log/php_errors.log
# Verify permissions
sudo ls -la /var/www/phpservermonitor/
Beyond this playbook, we offer:
Contact our automation team: office@linux-server-admin.com