This guide provides a full Ansible playbook to deploy Payara Server with a dedicated service user, runtime dependencies, extracted files, and a managed systemd unit.
It covers Debian 10 to latest stable, Ubuntu LTS releases, and RHEL 9+ compatible systems.
- name: Install Payara Server
hosts: payara
become: true
vars:
payara_user: payara
payara_group: payara
payara_home: /opt/payara
payara_version: 7.2026.1 # as of 2026-02-12; update before production rollout
payara_archive_url: "https://repo1.maven.org/maven2/fish/payara/distributions/payara/{{ payara_version }}/payara-{{ payara_version }}.zip"
payara_archive_dest: "/tmp/payara-{{ payara_version }}.zip"
payara_service_name: payara
payara_http_port: 8080
java_home_debian: /usr/lib/jvm/java-17-openjdk-amd64
java_home_redhat: /usr/lib/jvm/java-17-openjdk
payara_java_home: "{{ java_home_debian if ansible_os_family == 'Debian' else java_home_redhat }}"
tasks:
- name: Install runtime dependencies on Debian/Ubuntu
apt:
name:
- openjdk-17-jdk
- curl
- unzip
state: present
update_cache: true
when: ansible_os_family == "Debian"
- name: Install runtime dependencies on RHEL family
dnf:
name:
- java-17-openjdk-devel
- curl
- unzip
state: present
when: ansible_os_family == "RedHat"
- name: Create Payara group
group:
name: "{{ payara_group }}"
state: present
- name: Create Payara user
user:
name: "{{ payara_user }}"
group: "{{ payara_group }}"
home: "{{ payara_home }}"
shell: /usr/sbin/nologin
create_home: false
system: true
- name: Create Payara home directory
file:
path: "{{ payara_home }}"
state: directory
owner: "{{ payara_user }}"
group: "{{ payara_group }}"
mode: "0755"
- name: Download Payara archive
get_url:
url: "{{ payara_archive_url }}"
dest: "{{ payara_archive_dest }}"
mode: "0644"
- name: Extract Payara archive
unarchive:
src: "{{ payara_archive_dest }}"
dest: /opt
remote_src: true
creates: /opt/payara7/bin/asadmin
- name: Locate extracted Payara directory
find:
paths: /opt
file_type: directory
patterns: "payara*"
register: payara_extract_dirs
- name: Select extracted directory
set_fact:
payara_extracted_dir: "{{ (payara_extract_dirs.files | map(attribute='path') | reject('equalto', payara_home) | list | first) }}"
- name: Move extracted files into target directory
shell: "mv {{ payara_extracted_dir }}/* {{ payara_home }}/"
args:
creates: "{{ payara_home }}/bin/asadmin"
- name: Ensure ownership of Payara files
file:
path: "{{ payara_home }}"
state: directory
owner: "{{ payara_user }}"
group: "{{ payara_group }}"
recurse: true
- name: Configure HTTP listener port in domain.xml
replace:
path: "{{ payara_home }}/glassfish/domains/domain1/config/domain.xml"
regexp: 'port="8080"'
replace: 'port="{{ payara_http_port }}"'
- name: Create Payara systemd unit
copy:
dest: "/etc/systemd/system/{{ payara_service_name }}.service"
mode: "0644"
content: |
[Unit]
Description=Payara Server
After=network.target
[Service]
Type=forking
User={{ payara_user }}
Group={{ payara_group }}
Environment=JAVA_HOME={{ payara_java_home }}
Environment=PAYARA_HOME={{ payara_home }}
WorkingDirectory={{ payara_home }}
ExecStart={{ payara_home }}/bin/asadmin start-domain domain1
ExecStop={{ payara_home }}/bin/asadmin stop-domain domain1
Restart=on-failure
[Install]
WantedBy=multi-user.target
- name: Reload systemd
systemd:
daemon_reload: true
- name: Enable and start application service
service:
name: "{{ payara_service_name }}"
state: started
enabled: true
payara_version to the latest stable release before production rollout.Any questions?
Feel free to contact us. Find all contact information on our contact page.