{"id":15284186,"url":"https://github.com/voxpupuli/puppet-wildfly","last_synced_at":"2025-12-11T21:45:28.951Z","repository":{"id":53020954,"uuid":"21079559","full_name":"voxpupuli/puppet-wildfly","owner":"voxpupuli","description":"Puppet module to install, configure and manage Wildfly (8/9/10+), JBoss EAP (6.1+/7.0+) and some Wildfly based products like apiman, Keycloak and Infinispan.","archived":false,"fork":false,"pushed_at":"2025-03-19T19:59:20.000Z","size":979,"stargazers_count":29,"open_issues_count":46,"forks_count":79,"subscribers_count":45,"default_branch":"master","last_synced_at":"2025-04-12T22:18:45.901Z","etag":null,"topics":["jboss","jboss-cli","jboss-wildfly","puppet","puppet-forge","puppet-module","wildfly"],"latest_commit_sha":null,"homepage":"","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/voxpupuli.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":".github/CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"open_collective":"vox-pupuli","github":"voxpupuli"}},"created_at":"2014-06-21T21:46:22.000Z","updated_at":"2025-03-19T19:59:22.000Z","dependencies_parsed_at":"2023-12-19T12:33:09.174Z","dependency_job_id":"41944c2b-794e-4dc1-8153-c232cdaa4dc6","html_url":"https://github.com/voxpupuli/puppet-wildfly","commit_stats":{"total_commits":693,"total_committers":61,"mean_commits":"11.360655737704919","dds":0.5512265512265513,"last_synced_commit":"c269b9e28f631c891ef6be32e38a83b8a5d80053"},"previous_names":["biemond/biemond-wildfly"],"tags_count":57,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/voxpupuli%2Fpuppet-wildfly","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/voxpupuli%2Fpuppet-wildfly/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/voxpupuli%2Fpuppet-wildfly/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/voxpupuli%2Fpuppet-wildfly/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/voxpupuli","download_url":"https://codeload.github.com/voxpupuli/puppet-wildfly/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248638099,"owners_count":21137603,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["jboss","jboss-cli","jboss-wildfly","puppet","puppet-forge","puppet-module","wildfly"],"created_at":"2024-09-30T14:50:32.009Z","updated_at":"2025-12-11T21:45:28.925Z","avatar_url":"https://github.com/voxpupuli.png","language":"Ruby","funding_links":["https://opencollective.com/vox-pupuli","https://github.com/sponsors/voxpupuli"],"categories":[],"sub_categories":[],"readme":"# wildfly\n\n[![License](https://img.shields.io/github/license/voxpupuli/puppet-wildfly.svg)](https://github.com/voxpupuli/puppet-wildfly/blob/master/LICENSE)\n[![puppetmodule.info docs](https://www.puppetmodule.info/images/badge.svg)](https://www.puppetmodule.info/m/puppet-wildfly)\n[![CI](https://github.com/voxpupuli/puppet-wildfly/actions/workflows/ci.yml/badge.svg)](https://github.com/voxpupuli/puppet-wildfly/actions/workflows/ci.yml)\n[![Donated by biemond](https://img.shields.io/badge/donated%20by-biemond-fb7047.svg)](#transfer-notice)\n\n[![Puppet Forge Endorsement](https://img.shields.io/puppetforge/e/puppet/wildfly.svg)](https://forge.puppetlabs.com/puppet/wildfly)\n[![Puppet Forge Version](https://img.shields.io/puppetforge/v/puppet/wildfly.svg)](https://forge.puppetlabs.com/puppet/wildfly)\n[![Puppet Forge Score](https://img.shields.io/puppetforge/f/puppet/wildfly.svg)](https://forge.puppetlabs.com/puppet/wildfly)\n[![Puppet Forge Downloads](https://img.shields.io/puppetforge/dt/puppet/wildfly.svg)](https://forge.puppetlabs.com/puppet/wildfly)\n\n## Table of Contents\n\n1. [Overview](#overview)\n2. [Module Description - What the module does and why it is useful](#module-description)\n3. [Setup - The basics of getting started with wildfly](#setup)\n    * [What wildfly affects](#what-wildfly-affects)\n    * [Setup requirements](#setup-requirements)\n4. [Upgrade](#upgrade)\n    * [to 1.2.0](#to-120)\n    * [to 2.0.0](#to-200)\n    * [to 2.1.0](#to-210)\n5. [Usage - Configuration options and additional functionality](#usage)\n    * [Wildfly 25.0.0](#wildfly-2500)\n    * [Wildfly 23.0.2](#wildfly-2302)\n    * [Wildfly 10.1.0](#wildfly-1010)\n    * [Wildfly 9.0.2](#wildfly-902)\n    * [Wildfly 8.2.1](#wildfly-821)\n    * [JBoss EAP 6.x (with hiera)](#jboss-eap-6x-with-hiera)\n    * [JBoss EAP 7.0](#jboss-eap-70)\n    * [Keycloak](#keycloak)\n    * [apiman](#apiman)\n    * [Infinispan Server](#infinispan-server)\n    * [Wildfly's Configuration Management](#wildflys-configuration-management)\n    * [Patch management](#patch-management)\n    * [Unmanaged installation](#unmanaged-installation)\n    * [Domain Mode](#domain-mode)\n    * [Java Virtual Machine options](#java-virtual-machine-options)\n    * [Deployment](#deployment)\n    * [User management](#user-management)\n    * [Module installation](#module-installation)\n    * [Datasources](#datasources)\n    * [HTTPS/SSL](#httpsssl)\n    * [Management over HTTPS/SSL](#mgmtssl)\n    * [Server reload](#server-reload)\n    * [Messaging](#messaging)\n    * [Logging](#logging)\n    * [Modcluster](#modcluster)\n    * [JGroups](#jgroups)\n6. [Limitations - OS compatibility, etc.](#limitations)\n7. [Development - Guide for contributing to the module](#development)\n8. [Documentation](#documentation)\n\n## Overview\n\nOriginally created by Edwin Biemond email biemond at gmail dot com\n[biemond.blogspot.com](http://biemond.blogspot.com)\n\nInstall, configures and manages Wildfly.\n\nShould work on every Redhat or Debian family member, tested with Wildfly 10.1, 10.0, 9.0, 8.2, 8.1 \u0026 8.0 and with JBoss EAP (tested on 6.1/6.2/6.3/6.4 and 7.0). Some defines may work only in certain versions.\n\n[Vagrant Fedora 21, Puppet 4.2.1 example](https://github.com/biemond/vagrant-fedora20-puppet) with Wildfly 8.2, Apache AJP and PostgreSQL.\n\n[Vagrant CentOS Standalone HA + Gossip Router example](https://github.com/jairojunior/wildfly-ha-tcpgossip-vagrant-puppet) with two nodes, a gossip router and a load balancer (httpd + mod_cluster).\n\n[Vagrant CentOS 7.2 Domain Mode](https://github.com/jairojunior/wildfly-domain-vagrant-puppet) with two nodes (Domain master and slave) and a load balancer.\n\n## Module Description\n\nThe wildfly module can install, configure and manage - through its HTTP Management API - Wildfly (8/9/10+) and JBoss EAP (6.1+/7.0+).\n\n## Setup\n\n### What wildfly affects\n\n* Manage Wildfly user, group and directory.\n\n* Creates a wildfly service using bundled scripts and manages its installation and resources (using [Management API](https://docs.jboss.org/author/display/WFLY10/Management+API+reference))\n\n* Installs requisite libaio and wget packages\n\n### Setup Requirements\n\nThis module requires a JVM ( should already be there ). Just need to be extracted somewhere, no need to update-alternatives, set PATH or anything else, but it also works if you choose to do so.\n\nThree gems are bundled with this module: `treetop` (parsing JBoss-CLI commands), `polyglot` (treetop's requirement) and `net-http-digest_auth` (Management API authentication).\n\nAcceptance tests works with **puppetlabs/java** in both CentOS and Debian.\n\nThis module requires `puppetlabs-stdlib`.\n\nIt should work on every modern Linux. TO see a list of all tested OSes, please check the metadata.json.\n\n## Upgrade\n\n## to 1.2.0\n\n### wildfly class\n\nThe main changes in `wildfly` class are below:\n\n```puppet\nclass { 'wildfly':\n  distribution     =\u003e 'jboss-eap|wildfly',\n  properties       =\u003e {\n    'jboss.bind.address'            =\u003e $public_bind,\n    'jboss.bind.address.management' =\u003e $mgmt_bind,\n    'jboss.management.http.port'    =\u003e $mgmt_http_port,\n    'jboss.management.https.port'   =\u003e $mgmt_https_port,\n    'jboss.http.port'               =\u003e $public_http_port,\n    'jboss.https.port'              =\u003e $public_https_port,\n    'jboss.ajp.port'                =\u003e $ajp_port,\n  },\n  jboss_opts       =\u003e '-Dproperty=value'\n  mgmt_user        =\u003e { username  =\u003e $management_user, password  =\u003e $management_password },\n}\n```\n\n`distribution` was introduced to provide out of the box support for JBoss EAP and `properties` to replace fine-grained parameters for address/port binding like `public_bind`, `mgmt_bind` and `public_http_port`. (*Reason*: It's easier - and more reliable - to manage a properties file than Wildfly's XML through augeas)\n\n`users_mgmt` was replaced by `mgmt_user`, and additional users should be managed by `wildfly::config::mgtm_user` defined type. The hash format and default value also changed.\n\n### New dependency\n\n`jethrocarr/initfact` module.\n\n### Defined types\n\nAll resources from `wildfly::util` were moved to `wildfly`, hence you need to search and replace them, I suggest you execute these commands in your environment:\n\n`find . -name '*.pp' -type f -exec sed -i 's/wildfly::util::exec_cli/wildfly::cli/g' {} +`\n\n`find . -name '*.pp' -type f -exec sed -i 's/wildfly::util/wildfly/g' {} +`\n\n## to 2.0.0\n\nThis version requires Puppet 4.4+ and heavily uses Puppet 4 new features: data types, epp templates and Ruby 2.1+, but there is no breaking change per se. Meaning that if you're using 1.x version with Puppet 4 you should be able to migrate without any problems.\n\nIf you're still using Puppet 3.x with Ruby 1.8.7+ check version 1.2.x (**unsupported**).\n\n## to 2.1.0\n\nThis version will no longer stringify values for `wildfly_resource`'s state or sort arrays values. In other words, you'll have to declare attributes using a type that matches Wildfly's Management Model type and in the same order returned by the API (in case of an array/LIST).\n\n## Usage\n\n```puppet\nclass { 'wildfly': }\n```\n\n### Wildfly 25.0.0\n\n```puppet\nclass { 'wildfly':\n  version           =\u003e '25.0.0',\n  install_source    =\u003e 'https://github.com/wildfly/wildfly/releases/download/25.0.0.Final/wildfly-25.0.0.Final.tar.gz',\n  install_cache_dir =\u003e '/tmp',\n  java_home         =\u003e '/usr/lib/jvm/java-17-openjdk-amd64',\n}\n```\n\n### Wildfly 23.0.2\n\n```puppet\nclass { 'wildfly':\n  version           =\u003e '23.0.2',\n  install_source    =\u003e 'https://download.jboss.org/wildfly/23.0.2.Final/wildfly-23.0.2.Final.tar.gz',\n  install_cache_dir =\u003e '/tmp',\n  java_home         =\u003e '/usr/lib/jvm/java-17-openjdk-amd64',\n}\n```\n\n### Wildfly 10.1.0\n\n```puppet\nclass { 'wildfly':\n  version        =\u003e '10.1.0',\n  install_source =\u003e 'http://download.jboss.org/wildfly/10.1.0.Final/wildfly-10.1.0.Final.tar.gz',\n}\n```\n\n### Wildfly 9.0.2\n\n```puppet\nclass { 'wildfly':\n  version        =\u003e '9.0.2',\n  install_source =\u003e 'http://download.jboss.org/wildfly/9.0.2.Final/wildfly-9.0.2.Final.tar.gz',\n}\n```\n\n### Wildfly 8.2.1\n\n```puppet\nclass { 'wildfly':\n  version        =\u003e '8.2.1',\n  install_source =\u003e 'http://download.jboss.org/wildfly/8.2.1.Final/wildfly-8.2.1.Final.tar.gz',\n}\n```\n\n### JBoss EAP 6.x (with hiera)\n\n```puppet\ninclude wildfly\n```\n\n```yaml\nwildfly::distribution: 'jboss-eap'\nwildfly::version: '6.4'\nwildfly::install_source: 'http://mywebserver/jboss-eap-6.4.tar.gz'\nwildfly::user: 'jboss-as'\nwildfly::group: 'jboss-as'\nwildfly::dirname: '/opt/jboss-as'\nwildfly::console_log: '/var/log/jboss-as/console.log'\n```\n\n### JBoss EAP 7.0\n\n```puppet\nclass { 'wildfly':\n  version        =\u003e '7.0',\n  distribution   =\u003e 'jboss-eap',\n  install_source =\u003e 'http:/mywebserver/jboss-eap-7.0.tar.gz',\n  user           =\u003e 'jboss-eap',\n  group          =\u003e 'jboss-eap',\n  dirname        =\u003e '/opt/jboss-eap',\n  console_log    =\u003e '/var/log/jboss-eap/console.log',\n}\n```\n\n\n### Keycloak\n\n[Keycloak](http://www.keycloak.org/) is an open source Identity and Access Management built on top of Wildfly/JBoss platform, therefore you should be able to use this module to install and config it.\n\n```puppet\nclass { 'wildfly':\n  version        =\u003e '10.1.0',\n  distribution   =\u003e 'wildfly',\n  install_source =\u003e 'https://downloads.jboss.org/keycloak/2.5.0.Final/keycloak-2.5.0.Final.tar.gz',\n}\n```\n\u003e **NOTE:** Just make sure to point to the right version/distribution it was built upon.\n\nSome Keycloak configuration can be managed in the same way as a regular Wildfly/Jboss configuration:\n\n```puppet\nwildfly::datasources::datasource { 'KeycloakDS':\n  config =\u003e {\n    'driver-name'    =\u003e 'postgresql',\n    'password'       =\u003e 'keycloak',\n    'user-name'      =\u003e 'keycloak',\n    'jndi-name'      =\u003e 'java:jboss/datasources/KeycloakDS',\n    'connection-url' =\u003e \"jdbc:postgresql://192.168.33.20:5432/keycloak\",\n    'background-validation' =\u003e true,\n    'background-validation-millis' =\u003e 60000,\n    'check-valid-connection-sql' =\u003e 'SELECT 1',\n    'flush-strategy' =\u003e 'IdleConnections',\n  }\n}\n```\n\n### apiman\n\n[apiman](http://www.apiman.io) is an API Manager built on top of Wildfly/JBoss, therefore you should be able to use this module to install and config it.\n\nCurrently there aren't no prebuilt packages, but [download page](http://www.apiman.io/latest/download.html) provides instruction to build it for Wildfly 10, 9 and EAP 7.\n\n\n#### Example\n\n```sh\nwget http://download.jboss.org/wildfly/10.1.0.Final/wildfly-10.1.0.Final.zip\nwget http://downloads.jboss.org/apiman/1.2.9.Final/apiman-distro-wildfly10-1.2.9.Final-overlay.zip\nunzip wildfly-10.1.0.Final.zip\nunzip -o apiman-distro-wildfly10-1.2.9.Final-overlay.zip -d wildfly-10.1.0.Final\ntar czvf apiman-wildfly-10.1.0.Final.tar.gz wildfly-10.1.0.Final\n```\n\n```puppet\nclass { 'wildfly':\n  version        =\u003e '10.1.0',\n  distribution   =\u003e 'wildfly',\n  config         =\u003e 'standalone-apiman.xml',\n  install_source =\u003e 'http://10.0.2.2:9090/apiman-wildfly-10.1.0.Final.tar.gz',\n}\n```\n\n\u003e **NOTE:** Just make sure to point to the right version/distribution it was built upon.\n\n### Infinispan Server\n\nInfinispan Server (or JBoss Data Grid) also work with this module but requires more tweaks.\n\nFrom Infinispan Server 7 to 9 (including JDG 7.0) you will only need to change `install_source` to match the desired version:\n\n```puppet\nclass { 'wildfly':\n  install_source =\u003e 'http://10.0.2.2:9090/infinispan-server-8.2.5.Final.tar.gz',\n  conf_file      =\u003e '/etc/infinispan-server/infinispan-server.conf',\n  conf_template  =\u003e 'wildfly/infinispan-server.conf.erb',\n  service_file   =\u003e 'bin/init.d/infinispan-server.sh',\n  service_name   =\u003e 'infinispan-server',\n}\n```\n\n\u003e **Limitation:** You need to repackage it to a tar.gz file and Infinispan Server 6 and JDG 6.x are not working.\n\n### Wildfly's Configuration Management\n\nWildfly has a [Management Model](https://docs.jboss.org/author/display/WFLY8/Description+of+the+Management+Model) that describes its configuration and there are three main elements that you need to understand in order to use this module: `path`, `attributes` and `operations`\n\nThis module provides a few defined types built around these concepts using `wildfly_resource` and `wildfly_cli` (`wildfly::messaging::*`, `wildfly:datasources::datasource`, `wildfly:datasources::driver`) to ease management of most used resources, but they are not guaranteed to work across all versions of JBoss/Wildfly and they represent only a tiny subset of the Management Model.\n\nIn order to manage virtually any configuration in the [Model Reference](https://wildscribe.github.io/) (i.e. datasources, https, queues, modcluster) with `wildfly::resource` or `wildfly::cli` you must understand how declared resources are converted to Management API requests using `paths`, `attributes` and `operations`.\n\n**Path/Addresss:** The resource address in `/node-type=node-name (/node-type=node-name)*` format. (e.g. `/subsystem=datasources/datasource=DatasourceName`)\n\n**Attributes:** key-value pairs that describes the resource. (e.g. `driver-name=postgresql`, `connection-url=jdbc:postgresql://localhost/postgres`)\n\n**Operations:** An operation to be performed in a resource. (e.g. `read`, `write-attribute`, `remove`)\n\nWith `wildfly::cli` you have more control, but you should only use it when you can't manage the resource with `wildfly_resource` (e.g. you can't manage `enabled` attribute as it is only changed as a result of `enable` and `disable` **operations**.):\n\n```puppet\nwildfly::cli { \"Enable ADatasource\":\n  command =\u003e \"/subsystem=datasources/data-source=ADatasource:enable\",\n  unless  =\u003e \"(result == true) of /subsystem=datasources/data-source=ADatasource:read-attribute(name=enabled)\",\n}\n```\n\nFor all other scenarios, `wildfly::resource` will be your best friend, from the most simple resource:\n\n```puppet\nwildfly::resource { \"/system-property=myproperty\":\n  content =\u003e {\n    'value' =\u003e '1234'\n  },\n}\n```\n\nTo the most complex:\n\n```puppet\nwildfly::resource { '/subsystem=modcluster/mod-cluster-config=configuration':\n  recursive =\u003e true,\n  content   =\u003e {\n        'advertise'             =\u003e true,\n        'connector'             =\u003e 'ajp',\n        'excluded-contexts'     =\u003e 'ROOT,invoker,jbossws,juddi,console',\n        'proxy-url'             =\u003e '/',\n        'sticky-session'        =\u003e true,\n        'proxies'               =\u003e ['192.168.1.1:6666', '192.168.1.2::6666']\n        'balancer'              =\u003e 'mybalancer',\n        'load-balancing-group'  =\u003e 'mygroup',\n        'dynamic-load-provider' =\u003e {'configuration' =\u003e {\n            'load-metric' =\u003e {'busyness' =\u003e {\n                'type' =\u003e 'busyness',\n            }}\n        }},\n    }\n}\n```\n\nThe first thing to note about `wildfly::resource` is the absence of an **operation**, as you will only need to set `ensure` with either present or absent, using the first will result in the creation or update of the resource with the declared state/content, whereas the other will remove the resource with all its children.\n\nA resource attribute behaviors like a Puppet resource property. Therefore, **unmanaged attributes** behavior like **unmanaged properties** in puppet resources, meaning: *if you don't declare, you don't care*.\n\n\u003e **NOTE:** Be careful with the type of declared attribute's value as it should match Management Model type. Valid Management Model types include: `STRING`, `INT`, `BOOLEAN`, `LIST` (i.e. arrays []) and `OBJECT` (i.e. hashes {}).\n\n### Patch management\n\nWildfly/JBoss allows you to apply patches to existing installation in order to update it. I suggest you use `puppet-archive` or any other `archive` module to download patches from remote sources, just be aware that you need to extract patch zip file in order to apply patches to Wildfly, but you'll be able to apply the zip file directly when you're using EAP.\n\n\u003e **NOTE:** Wildfly from versions 8.0.0 to 9.0.1 has a bug in `jboss-cli.sh` [WFCORE-160](https://issues.jboss.org/browse/WFCORE-160) that makes it report that a patch hasn't been successfuly applied (exit code 2) even when it was. If you're using one of theses versions you better update this file or live with a bad report.\n\n#### Offline\n\nOffline patching requires the server to be down, but don't leave the server in a `restart-required` state.\n\n##### EAP/Offline example\n\n```puppet\nclass { 'wildfly':\n  distribution   =\u003e 'jboss-eap',\n  version        =\u003e '6.4',\n}\n\narchive { '/opt/wildfly/jboss-eap-6.4.8-patch.zip':\n  ensure =\u003e present,\n  source =\u003e 'http://10.0.2.2:9090/jboss-eap-6.4.8-patch.zip',\n}\n-\u003e\nwildfly::patch::offline { '6.4.8':\n  source =\u003e '/opt/wildfly/jboss-eap-6.4.8-patch.zip',\n}\n```\n\n#### Online\n\nOnline patching requires the server to be up and requires a restart after being applied.\n\n##### Wildfly/Online example\n\n```puppet\nclass { 'wildfly':\n  version        =\u003e '10.0.0',\n  install_source =\u003e 'http://download.jboss.org/wildfly/10.0.0.Final/wildfly-10.0.0.Final.tar.gz',\n}\n\narchive { '/opt/wildfly/wildfly-10.1.0.Final-update.zip':\n  ensure       =\u003e present,\n  extract      =\u003e true,\n  extract_path =\u003e '/opt/wildfly',\n  creates      =\u003e '/opt/wildfly/wildfly-10.1.0.Final.patch',\n  source       =\u003e 'http://download.jboss.org/wildfly/10.1.0.Final/wildfly-10.1.0.Final-update.zip',\n  user         =\u003e 'wildfly',\n  group        =\u003e 'wildfly',\n  require      =\u003e [File['/opt/wildfly'],Package['unzip']],\n}\n-\u003e\nwildfly::patch::online { '10.1.0':\n  source       =\u003e '/opt/wildfly/wildfly-10.1.0.Final.patch',\n  override_all =\u003e true,\n}\n```\n\n### Unmanaged installation\n\nIf you don't want to use this module to manage your Wildfly/JBoss installation or you don't want to manage your installation with Puppet at all. You still can use this module to manage your configuration using `wildfly_resource`, `wildfly_cli`, `wildfly_deployment` and `wildfly_restart`.\n\nExample:\n\n```puppet\nwildfly_resource { \"/subsystem=datasources/data-source=MyDS\":\n  ensure            =\u003e 'present',\n  username          =\u003e 'admin',\n  password          =\u003e 'password',\n  host              =\u003e '192.168.33.10',\n  port              =\u003e '9990',\n  state             =\u003e {\n    'driver-name'    =\u003e 'postgresql',\n    'connection-url' =\u003e 'jdbc:postgresql://localhost/postgres',\n    'jndi-name'      =\u003e 'java:jboss/datasources/MyDS',\n    'user-name'      =\u003e 'postgres',\n    'password'       =\u003e 'postgres',\n  },\n}\n```\n\n### Domain Mode\n\n#### Master (Domain Controller)\n\n```puppet\nclass { 'wildfly':\n  mode        =\u003e 'domain',\n  host_config =\u003e 'host-master.xml',\n  properties  =\u003e {\n    'jboss.bind.address.management' =\u003e '172.17.0.2',\n  },\n}\n\nwildfly::config::mgmt_user { 'slave1':\n  password =\u003e 'wildfly',\n}\n```\n\n\u003e **NOTE:** Don't forget to set `target_profile` while managing your domain resources.\n\n#### Slave (Host Controller)\n\n```puppet\nclass { 'wildfly':\n    mode         =\u003e 'domain',\n    host_config  =\u003e 'host-slave.xml',\n    properties   =\u003e {\n      'jboss.domain.master.address' =\u003e '172.17.0.2',\n    },\n    secret_value =\u003e 'd2lsZGZseQ==', #base64('wildfly'),\n}\n```\n\n\u003e**NOTE:** Host Controller name has to match a mgmt user name in Domain Controller, since, by default, HC uses it own name as the username for connecting with DC. You can always set a different one by overriding `remote_username` parameter.\n\n#### Domain Management\n\nMake sure you remove default resources (server-groups and server-config) if you're not going to use it.\n\nDomain controller:\n\n```puppet\nwildfly::domain::server_group { ['main-server-group', 'other-server-group']:\n  ensure =\u003e absent,\n}\n```\n\nHost controller:\n\n```puppet\nwildfly::host::server_config { ['server-one', 'server-two']:\n ensure   =\u003e absent,\n hostname =\u003e $hostname,\n username =\u003e $username,\n password =\u003e $password,\n before   =\u003e Class['wildfly::setup'],\n}\n```\n\nYou can also use a `overlay_class` instead of use `before`.\n\nHost controller:\n\n```puppet\nclass { 'wildfly':\n  # ...\n  overlay_class =\u003e 'app::cleanup'\n}\n\nclass app::cleanup {\n  wildfly::host::server_config { ['server-one', 'server-two']:\n   ensure   =\u003e absent,\n   hostname =\u003e $hostname,\n   username =\u003e $username,\n   password =\u003e $password,\n  }\n}\n```\n\n`Username` and `password` are the credentials used to connect to domain controller and make the desired changes. In the first provision this resource will be applied with augeas and will not need that, but in the other these parameters will be required to guarantee that the server-configs no longer exists.\n\nAfter that, start managing your own `server-groups` and `server-config` with `wildfly::domain::server-group` and `wildfly::host::server_config`:\n\nDomain controller:\n\n```puppet\nwildfly::domain::server_group { 'app-server-group':\n  profile              =\u003e 'full-ha',\n  socket_binding_group =\u003e 'full-ha-sockets',\n}\n```\n\nHost controller:\n\n```puppet\nwildfly::host::server_config { 'app':\n  server_group       =\u003e 'app-server-group',\n  hostname           =\u003e $hostname,\n  username           =\u003e $username,\n  password           =\u003e $password,\n}\n```\n\nPlease note that you'll need to enable external facts (`wildfly::external_facts`) since `wildfly::host::server_config` relies on `wildfly_is_running` fact to know if it should use augeas or connect to the domain controller to remove a server-config.\n\n#### Custom Java options\n\nDomain controller:\n\n```puppet\nclass { 'wildfly':\n  ...,\n  java_opts                    =\u003e ['\u003cjava_opt_1\u003e', '\u003cjava_opt_2\u003e']\n  process_controller_java_opts =\u003e ['\u003ccontroller_opt_1\u003e', '\u003ccontroller_opt_2\u003e']\n}\n```\n\nResults in a `domain.conf` with:\n\n```shell\nif [ \"x$JAVA_OPTS\" = \"x\" ]; then\n    JAVA_OPTS=...\n    JAVA_OPTS=\"$JAVA_OPTS \u003cjava_opt_1\u003e \u003cjava_opt_2\u003e\"\n    ...\nfi\n...\nif [ \"x$PROCESS_CONTROLLER_JAVA_OPTS\" = \"x\" ]; then\n    PROCESS_CONTROLLER_JAVA_OPTS=\"$JAVA_OPTS \u003ccontroller_opt_1\u003e, \u003ccontroller_opt_2\u003e\"\nfi\n```\n\nHost controller:\n\n```puppet\nclass { 'wildfly':\n  ...,\n  java_opts                 =\u003e ['\u003cjava_opt_1\u003e', '\u003cjava_opt_2\u003e']\n  host_controller_java_opts =\u003e ['\u003cmanaged_opt_1\u003e', '\u003cmanaged_opt_2\u003e']\n}\n```\n\nResults in a `domain.conf` with:\n\n```shell\nif [ \"x$JAVA_OPTS\" = \"x\" ]; then\n    JAVA_OPTS=...\n    JAVA_OPTS=\"$JAVA_OPTS \u003cjava_opt_1\u003e \u003cjava_opt_2\u003e\"\n    ...\nfi\n...\nif [ \"x$HOST_CONTROLLER_JAVA_OPTS\" = \"x\" ]; then\n    HOST_CONTROLLER_JAVA_OPTS=\"$JAVA_OPTS \u003cmanaged_opt_1\u003e \u003cmanaged_opt_2\u003e\"\nfi\n```\n\n### Java Virtual Machine options\n\nTo adjust [JVM heap memory settings](https://www.baeldung.com/jvm-parameters#explicit-heap-memory---xms-and-xmx-options), use `wildfly` class `java_xmx`, `java_xms` and/or `java_maxmetaspace_size` parameters:\n\n```puppet\nclass { 'wildfly':\n  # ...\n  java_xms               =\u003e '\u003cMinimum heap size\u003e',\n  java_xmx               =\u003e '\u003cMaximum heap size\u003e',\n  java_maxmetaspace_size =\u003e '\u003cMaximum Metaspace size\u003e',\n}\n```\n\n### Deployment\n\n#### From a local or remote source\n\nSource supports these protocols: `http://`, `ftp://`, `puppet://`, `file://`\n\n```puppet\nwildfly::deployment { 'hawtio.war':\n source =\u003e 'http://central.maven.org/maven2/io/hawt/hawtio-web/1.4.48/hawtio-web-1.4.48.war',\n}\n```\n\n```puppet\nwildfly::deployment { 'hawtio.war':\n source =\u003e 'puppet:///modules/profile/wildfly/hawtio-web-1.4.48.war',\n}\n```\n\n```puppet\nwildfly::deployment { 'hawtio.war':\n source =\u003e 'file://var/tmp/hawtio-web-1.4.48.war',\n}\n```\n\n#### To a target server-group (domain mode)\n\n```puppet\nwildfly::deployment { 'hawtio.war':\n source       =\u003e 'http://central.maven.org/maven2/io/hawt/hawtio-web/1.4.48/hawtio-web-1.4.48.war',\n server_group =\u003e 'main-server-group',\n}\n```\n\n#### From nexus\n\n\u003e **NOTE:** This feature was removed to avoid 'archive' name collision, but you can still use [archive::nexus](https://github.com/voxpupuli/puppet-archive/#archivenexus) to download an artifact and use as an input for `wildfly::deployment`\n\n```puppet\narchive::nexus { '/tmp/hawtio.war':\n  url        =\u003e 'https://oss.sonatype.org',\n  gav        =\u003e 'io.hawt:hawtio-web:1.4.66',\n  repository =\u003e 'releases',\n  packaging  =\u003e 'war',\n}\n~\u003e\nwildfly::deployment { 'hawtio.war':\n  source =\u003e '/tmp/hawtio.war'\n}\n```\n\n### User management\n\nYou can add App and Management users (requires server restart).\n\n```puppet\nwildfly::config::mgmt_user { 'mgmtuser':\n  password =\u003e 'mgmtuser'\n}\n```\n\n```puppet\nwildfly::config::app_user { 'appuser':\n  password =\u003e 'appuser'\n}\n```\n\nAnd associate groups or roles to them (requires server restart)\n\n```puppet\nwildfly::config::user_groups { 'mgmtuser':\n  groups =\u003e 'admin,mygroup'\n}\n```\n\n```puppet\nwildfly::config::user_roles { 'appuser':\n  roles =\u003e 'guest,ejb'\n}\n```\n\n### Module installation\n\nInstall a JAR module from a remote file system, puppet file server or local file system.\n\n```puppet\nwildfly::config::module { 'org.postgresql':\n  source       =\u003e 'http://central.maven.org/maven2/org/postgresql/postgresql/9.3-1103-jdbc4/postgresql-9.3-1103-jdbc4.jar',\n  dependencies =\u003e ['javax.api', 'javax.transaction.api']\n}\n```\n\n```puppet\nwildfly::config::module { 'org.postgresql':\n  source       =\u003e 'puppet:///modules/profiles/wildfly/postgresql-9.3-1103-jdbc4.jar',\n  dependencies =\u003e ['javax.api', 'javax.transaction.api']\n}\n```\n\n```puppet\nwildfly::config::module { 'org.postgresql':\n  source       =\u003e 'file:///var/tmp/postgresql-9.3-1103-jdbc4.jar',\n  dependencies =\u003e ['javax.api', 'javax.transaction.api']\n}\n```\n\n### Datasources\n\nSetup a driver and a datasource (for domain mode you need to set `target_profile` parameter):\n\n```puppet\nwildfly::datasources::driver { 'Driver postgresql':\n  driver_name                     =\u003e 'postgresql',\n  driver_module_name              =\u003e 'org.postgresql',\n  driver_xa_datasource_class_name =\u003e 'org.postgresql.xa.PGXADataSource'\n}\n-\u003e\nwildfly::datasources::datasource { 'DemoDS':\n  config         =\u003e {\n    'driver-name'    =\u003e 'postgresql',\n    'connection-url' =\u003e 'jdbc:postgresql://localhost/postgres',\n    'jndi-name'      =\u003e 'java:jboss/datasources/DemoDS',\n    'user-name'      =\u003e 'postgres',\n    'password'       =\u003e 'postgres'\n  }\n}\n```\n\nAlternatively, you can install a JDBC driver and module using deployment if your driver is JDBC4 compliant:\n\n```puppet\nwildfly::deployment { 'postgresql-9.3-1103-jdbc4.jar':\n  source =\u003e 'http://central.maven.org/maven2/org/postgresql/postgresql/9.3-1103-jdbc4/postgresql-9.3-1103-jdbc4.jar'\n}\n-\u003e\nwildfly::datasources::datasource { 'DemoDS':\n  config         =\u003e {\n    'driver-name'    =\u003e 'postgresql-9.3-1103-jdbc4.jar',\n    'connection-url' =\u003e 'jdbc:postgresql://localhost/postgres',\n    'jndi-name'      =\u003e 'java:jboss/datasources/DemoDS',\n    'user-name'      =\u003e 'postgres',\n    'password'       =\u003e 'postgres'\n  }\n}\n```\n\nA postgresql normal \u0026 XA datasource example\n\n```puppet\nwildfly::config::module { 'org.postgresql':\n  source       =\u003e 'http://central.maven.org/maven2/org/postgresql/postgresql/9.3-1103-jdbc4/postgresql-9.3-1103-jdbc4.jar',\n  dependencies =\u003e ['javax.api', 'javax.transaction.api'],\n  require      =\u003e Class['wildfly'],\n}\n-\u003e\nwildfly::datasources::driver { 'Driver postgresql':\n  driver_name                     =\u003e 'postgresql',\n  driver_module_name              =\u003e 'org.postgresql',\n  driver_xa_datasource_class_name =\u003e 'org.postgresql.xa.PGXADataSource'\n}\n-\u003e\nwildfly::datasources::datasource { 'petshop datasource':\n  name           =\u003e 'petshopDS',\n  config         =\u003e { 'driver-name'    =\u003e 'postgresql',\n                      'connection-url' =\u003e 'jdbc:postgresql://10.10.10.10/petshop',\n                      'jndi-name'      =\u003e 'java:jboss/datasources/petshopDS',\n                      'user-name'      =\u003e 'petshop',\n                      'password'       =\u003e 'password'\n                    }\n}\n-\u003e\nwildfly::datasources::xa_datasource { 'petshopDSXa':\n  config          =\u003e {  'driver-name'              =\u003e 'postgresql',\n                        'jndi-name'                =\u003e 'java:jboss/datasources/petshopDSXa',\n                        'user-name'                =\u003e 'petshop',\n                        'password'                 =\u003e 'password',\n                        'xa-datasource-class'      =\u003e 'org.postgresql.xa.PGXADataSource',\n                        'xa-datasource-properties' =\u003e {\n                              'url' =\u003e {'value' =\u003e 'jdbc:postgresql://10.10.10.10/petshop'}\n                        },\n  }\n}\n```\n\nDatasource configuration uses a hash with elements that match [JBoss-CLI datasource add elements name](https://docs.jboss.org/author/display/WFLY8/DataSource+configuration).\n\nConfigure Database Property, only works for normal datasources\n\n```puppet\nwildfly::datasources::db_property { 'DemoDbProperty':\n value    =\u003e 'demovalue',\n database =\u003e 'ExampleDS',\n}\n```\n\n### HTTPS/SSL\n\n#### Wildfly 8+\n\n```puppet\nwildfly::undertow::https { 'https':\n  socket_binding    =\u003e 'https',\n  keystore_path     =\u003e '/vagrant/identitystore.jks',\n  keystore_password =\u003e 'changeit',\n  key_alias         =\u003e 'demo',\n  key_password      =\u003e 'changeit'\n}\n```\n\n#### JBoss AS7/EAP 6\n\n```puppet\nwildfly::web::connector { 'https':\n  scheme         =\u003e 'https',\n  protocol       =\u003e 'HTTP/1.1',\n  socket_binding =\u003e 'https',\n  enable_lookups =\u003e false,\n  secure         =\u003e true,\n}\n-\u003e\nwildfly::web::ssl { 'ssl':\n  connector            =\u003e 'https',\n  protocol             =\u003e 'TLSv1,TLSv1.1,TLSv1.2',\n  password             =\u003e 'changeit',\n  key_alias            =\u003e 'demo',\n  certificate_key_file =\u003e '/opt/identitykeystore.jks',\n  cipher_suite         =\u003e 'TLS_RSA_WITH_AES_128_CBC_SHA,SSL_RSA_WITH_3DES_EDE_CBC_SHA',\n}\n```\n\n#### Sample identity store configuration with `puppetlabs-java_ks`\n\n```puppet\njava_ks { 'demo:/opt/identitystore.jks':\n  ensure      =\u003e latest,\n  certificate =\u003e '/opt/demo.pub.crt',\n  private_key =\u003e '/opt/demo.private.pem',\n  path        =\u003e '/usr/java/jdk1.7.0_75/bin/',\n  password    =\u003e 'changeit',\n}\n```\n\n### Management over HTTPS/SSL\n\nThis feature is currently implemented for standalone mode only.  The default http management console and API can be changed to run over HTTPS/TLS.\n\n#### Basic use with a self signed certificate\nThis will generate and use a basic self signed certificate for the Management interface.  Requires the puppetlabs/java_ks module:\n\n```puppet\nclass { 'wildfly':\n\tsecure_mgmt_api =\u003e true,\n}\n```\n\n#### Providing your own certificate\nThe module will create the approprate keystores, truststores, and configuration if given paths to the private key and certificate.  Use your favorite method to ensure the key and certificate exist on the endpoint.  Requires the puppetlabs/java_ks module:\n\n```puppet\nclass { 'wildfly':\n\tsecure_mgmt_api =\u003e true,\n\tmgmt_ssl_key =\u003e '/etc/pki/tls/private/key.pem',\n\tmgmt_ssl_cert =\u003e '/etc/pki/tls/certs/cert.pem',\n}\n```\n\n#### Unmanaged keystores\nIf preferred, the management API can be configured to use keystores/truststores managed outside this module.  These will need to exist before running the wildfly class.\n\nBe aware of the following:\n- The existing keystore needs to be readable by the wildfly user.\n- Truststores need to exist in the home directories for the wildfly user and the root user.\n\n```puppet\nclass { 'wildfly':\n\tsecure_mgmt_api =\u003e true,\n    mgmt_create_keystores =\u003e false,\n    mgmt_keystore =\u003e '/etc/pki/keystores/wf_ks.jks',\n\tmgmt_keystore_pass =\u003e 'password',\n\tmgmt_keystore_alias =\u003e 'wfmgmt',\n}\n```\n\n### Server Reload\n\nSome configurations like SSL and modcluster requires a server reload (i.e. `server-state = reload-required`), and it can be achieved with the following snippet:\n\n```puppet\n## a_resource_that_requires_reload_when_changed {}\n~\u003e\nwildfly::reload { 'Reload if necessary':\n  retries =\u003e 2,\n  wait    =\u003e 15,\n}\n```\n\nOr\n\n```puppet\nwildfly::cli { 'Reload if necessary':\n  command =\u003e ':reload',\n  onlyif  =\u003e '(result == reload-required) of :read-attribute(name=server-state)'\n}\n```\n\nEven [operation-headers](https://docs.jboss.org/author/display/WFLY9/Admin+Guide#AdminGuide-OperationHeaders) can do the trick in some cases:\n\n```puppet\nwildfly::resource { '/some=resource':\n  operation_headers =\u003e {\n    'allow-resource-service-restart' =\u003e true,\n  }\n}\n```\n\n### Messaging\n\n\u003e **NOTE:** `full` profiles only\n\n```puppet\nwildfly::messaging::queue { 'DemoQueue':\n  durable  =\u003e true,\n  entries  =\u003e ['java:/jms/queue/DemoQueue'],\n  selector =\u003e \"MessageType = 'AddRequest'\"\n}\n\nwildfly::messaging::topic { 'DemoTopic':\n  entries =\u003e ['java:/jms/topic/DemoTopic']\n}\n```\n\nWildfly 10/EAP 7+ replaced HornetQ with ActiveMQ and queue/topic management is slightly different:\n\n```puppet\nwildfly::messaging::activemq::queue { 'DemoQueue':\n  durable  =\u003e true,\n  entries  =\u003e ['java:/jms/queue/DemoQueue'],\n  selector =\u003e \"MessageType = 'AddRequest'\"\n}\n\nwildfly::messaging::activemq::topic { 'DemoTopic':\n  entries =\u003e ['java:/jms/topic/DemoTopic']\n}\n```\n\n### Logging\n\n```puppet\nwildfly::logging::category { 'DemoCategory':\n  level               =\u003e 'DEBUG',\n  use_parent_handlers =\u003e false,\n  handlers            =\u003e  ['DemoHandler']\n}\n```\n\n### System Property\n\n```puppet\nwildfly::system::property { 'DemoSysProperty':\n value =\u003e 'demovalue'\n}\n```\n\n### Modcluster\n\n\u003e **NOTE:**`full` and `ha` profiles only\n\n```puppet\nwildfly::modcluster::config { \"Modcluster mybalancer\":\n  balancer             =\u003e 'mybalancer',\n  load_balancing_group =\u003e 'demolb',\n  proxy_url            =\u003e '/',\n  proxy_list           =\u003e '127.0.0.1:6666'\n}\n```\n\n\u003e **NOTE:** For apache/httpd mod_cluster configuration check [::apache::mod::cluster](https://github.com/puppetlabs/puppetlabs-apache#class-apachemodcluster)\n\n### JGroups\n\n\u003e **NOTE:** `ha` profiles only\n\n```puppet\nwildfly::jgroups::stack::tcpgossip { 'TCPGOSSIP':\n  initial_hosts       =\u003e '172.28.128.1[12001]',\n  num_initial_members =\u003e 2\n}\n```\n\n```puppet\nwildfly::jgroups::stack::tcpping { 'TCPPING':\n  initial_hosts       =\u003e '172.28.128.10[7600],17228.128.20[7600]',\n  num_initial_members =\u003e 2\n}\n```\n\n## Limitations\n\nSome of this module public defined types  (`widfly::datasources`, `wildfly::messaging`, `wildfly::undertow`, etc) were built for Wildfly 8.x and may not work with other versions. When there is a proven alternative for a different version, examples might be provided, otherwise you'll need to build your own abstraction using `wildfly_resource` or `wildfly::resource`.\n\nOne discussed approach would be to generate defined types based on Wildfly's configuration schemas (`$WILDFLY_HOME/docs/schema`) or DMR (See [Issue 174](https://github.com/voxpupuli/puppet-wildfly/issues/174)).\n\nJBoss EAP only works with RHEL-based OS's unless you provide custom scripts.\n\n[This bug](https://bugzilla.redhat.com/show_bug.cgi?id=1224170) might also be a problem for `standalone-full-ha` users of JBoss EAP \u003c 7.\n\n## Development\n\n### Testing\n\nThis module uses puppet-lint, rubocop, rspec-puppet, beaker and travis-ci. We hope you use them before submitting your PR.\n\nHopefully, you'll need rvm to get the correct gems installed (and not messing with your computer's Ruby setup). Pls follow [official installation instructions](https://rvm.io/rvm/install), plus:\n\n```Shell\nsudo usermod -aG rvm $USER\necho 'source \"/etc/profile.d/rvm.sh\"' \u003e\u003e ~/.bashrc\n```\n\nReboot for all changes to take effect, then install Ruby 2.7:\n\n```shell\n# Didn't work for installing Ruby 2.7, but looks wise:\nrvm autolibs enable\n# Ruby 2.7 dependency\nrvm pkg install openssl\nBeware, 'rvm pkg ...' is deprecated, read about the new autolibs feature: 'rvm help autolibs'.\n# Inside this project's root directory:\nrvm install ruby-2.7 --with-openssl-dir=/usr/share/rvm/usr\nrvm use ruby-2.7\n# Validate\nruby -v\nruby 2.7.x (20XX-YY-ZZ revision \u0026lt;Hash\u0026gt;) [x86_64-linux]\n```\n\n```shell\ngem install bundler --no-document\nbundle config set --local without 'development'\nbundle install\n\nbundle exec rake syntax\nbundle exec rake lint\nbundle exec rubocop\nbundle exec rake spec\n```\n\nAcceptance tests (Beaker) can be executed using `./acceptance.sh`. There is a 4x6 matrix (Wildfly 8/8.2/9/10 X Centos 6/7, Debian 7/8, Ubuntu 12.04/14.04).\n\nI suggest you create a `~/.vagrant.d/Vagrantfile` file and install `vagrant-cachier` plugin with the following content to speed up the execution:\n\n```ruby\nVagrant.configure(2) do |config|\n  if Vagrant.has_plugin?('vagrant-cachier')\n    config.cache.scope = :box\n    config.cache.enable :yum\n    config.cache.enable :apt\n    config.cache.enable :generic, 'wget' =\u003e { cache_dir: '/var/cache/wget' }\n  end\nend\n```\n\nIt takes ~3 minutes per test.\n\n### New features\n\nJBoss/Wildfly configuration management is based on three custom types, `wildfly_resource`, `wildfly_cli` and `wildfly_deployment`. And you can do virtually any configuration that is possible through JBoss-CLI or XML configuration using them.\n\nSo, before build your awesome definition to manage a new resource or introduce a new configuration in an existing resource, check `wildfly::*` (`wildfly::deployment`, `wildfly::datasources::*`, `wildfly::undertow::*`, `wildfly::messaging::*`) for guidance.\n\nIf you can't figure out how to achieve your configuration, feel free to open an issue.\n\n## Author/Contributors\n\n- Edwin Biemond (biemond at gmail dot com)\n- Jairo Junior (junior.jairo1 at gmail dot com)\n- [More](https://github.com/voxpupuli/puppet-wildfly/graphs/contributors)\n\n## Documentation\n\nsee [REFERENCE.md](REFERENCE.md)\n\nTransfer Notice\n---------------\n\nThis project was originally authored by [biemond](http://github.com/biemond).\nThe maintainer preferred that Vox Pupuli take ownership of the project for future improvement and maintenance.\nExisting pull requests and issues were transferred over, please fork and continue to contribute here instead of biemond-wildlfy.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvoxpupuli%2Fpuppet-wildfly","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvoxpupuli%2Fpuppet-wildfly","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvoxpupuli%2Fpuppet-wildfly/lists"}