This guide provides a full Ansible playbook to deploy Eclipse GlassFish with a dedicated service user, runtime dependencies, extracted GlassFish files, and a managed systemd unit.
It covers Debian 10 to latest stable, Ubuntu LTS releases, and RHEL 9+ compatible systems.
- name: Install Eclipse GlassFish
hosts: glassfish
become: true
vars:
glassfish_user: glassfish
glassfish_group: glassfish
glassfish_home: /opt/glassfish
glassfish_version: 8.0.0 # as of 2026-02-12; update before production rollout
glassfish_archive_url: "https://download.eclipse.org/ee4j/glassfish/glassfish-{{ glassfish_version }}.zip"
glassfish_archive_dest: "/tmp/glassfish-{{ glassfish_version }}.zip"
glassfish_service_name: glassfish
java_home_debian: /usr/lib/jvm/java-21-openjdk-amd64
java_home_redhat: /usr/lib/jvm/java-21-openjdk
glassfish_java_home: "{{ java_home_debian if ansible_os_family == 'Debian' else java_home_redhat }}"
glassfish_http_port: 8080
tasks:
- name: Install runtime dependencies on Debian/Ubuntu
apt:
name:
- openjdk-21-jdk
- curl
- unzip
state: present
update_cache: true
when: ansible_os_family == "Debian"
- name: Install runtime dependencies on RHEL family
dnf:
name:
- java-21-openjdk-devel
- curl
- unzip
state: present
when: ansible_os_family == "RedHat"
- name: Create GlassFish group
group:
name: "{{ glassfish_group }}"
state: present
- name: Create GlassFish user
user:
name: "{{ glassfish_user }}"
group: "{{ glassfish_group }}"
home: "{{ glassfish_home }}"
shell: /usr/sbin/nologin
create_home: false
system: true
- name: Create GlassFish home directory
file:
path: "{{ glassfish_home }}"
state: directory
owner: "{{ glassfish_user }}"
group: "{{ glassfish_group }}"
mode: "0755"
- name: Download GlassFish archive
get_url:
url: "{{ glassfish_archive_url }}"
dest: "{{ glassfish_archive_dest }}"
mode: "0644"
- name: Extract GlassFish archive
unarchive:
src: "{{ glassfish_archive_dest }}"
dest: /opt
remote_src: true
creates: /opt/glassfish8/glassfish/bin/asadmin
- name: Locate extracted GlassFish directory
find:
paths: /opt
file_type: directory
patterns: "glassfish*"
register: glassfish_extract_dirs
- name: Select extracted directory
set_fact:
glassfish_extracted_dir: "{{ (glassfish_extract_dirs.files | map(attribute='path') | reject('equalto', glassfish_home) | list | first) }}"
- name: Move extracted files into target directory
shell: "mv {{ glassfish_extracted_dir }}/* {{ glassfish_home }}/"
args:
creates: "{{ glassfish_home }}/glassfish/bin/asadmin"
- name: Ensure ownership of GlassFish files
file:
path: "{{ glassfish_home }}"
state: directory
owner: "{{ glassfish_user }}"
group: "{{ glassfish_group }}"
recurse: true
- name: Configure HTTP listener port in domain.xml
replace:
path: "{{ glassfish_home }}/glassfish/domains/domain1/config/domain.xml"
regexp: 'port="8080"'
replace: 'port="{{ glassfish_http_port }}"'
- name: Create GlassFish systemd unit
copy:
dest: "/etc/systemd/system/{{ glassfish_service_name }}.service"
mode: "0644"
content: |
[Unit]
Description=Eclipse GlassFish
After=network.target
[Service]
Type=forking
User={{ glassfish_user }}
Group={{ glassfish_group }}
Environment=JAVA_HOME={{ glassfish_java_home }}
Environment=GLASSFISH_HOME={{ glassfish_home }}/glassfish
WorkingDirectory={{ glassfish_home }}/glassfish
ExecStart={{ glassfish_home }}/glassfish/bin/asadmin start-domain domain1
ExecStop={{ glassfish_home }}/glassfish/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: "{{ glassfish_service_name }}"
state: started
enabled: true
glassfish_version to the latest stable release before applying in production.Any questions?
Feel free to contact us. Find all contact information on our contact page.