diff --git a/defaults/main.yml b/defaults/main.yml index 0a28ef6..cd9d3a8 100644 --- a/defaults/main.yml +++ b/defaults/main.yml @@ -1,6 +1,7 @@ --- # https://shinyproxy.io/ -shinyproxy_install: False +shinyproxy_install: True +shinyproxy_as_docker_service: False shinyproxy_major_ver: 2 shinyproxy_minor_ver: 3 shinyproxy_patch_ver: 1 @@ -17,6 +18,11 @@ shinyproxy_http_port: 8080 # For logrotate. In days shinyproxy_log_retention: 10 shinyproxy_default_apps: True +# Shinyproxy as docker service +shinyproxy_as_docker_src_dir: /srv/shinyproxy_service +shinyproxy_as_docker_service_name: 'shinyproxy' +shinyproxy_docker_network: 'shinyproxy' +# Shinyproxy configuration # docker, docker-swarm, kubernetes shinyproxy_container_backend: 'docker' shinyproxy_docker_port: 2375 diff --git a/meta/main.yml b/meta/main.yml index aecc003..3e71b78 100644 --- a/meta/main.yml +++ b/meta/main.yml @@ -17,6 +17,10 @@ galaxy_info: versions: - trusty - bionic + - name: EL + versions: + - 7 + - 8 galaxy_tags: - R diff --git a/tasks/main.yml b/tasks/main.yml index 1366d97..78102d5 100644 --- a/tasks/main.yml +++ b/tasks/main.yml @@ -1,74 +1,5 @@ --- -- block: - - name: Create the shinyproxy user - user: name={{ shinyproxy_user }} home={{ shinyproxy_install_dir }} createhome=yes system=yes shell=/usr/sbin/nologin - - - name: Download the shinyproxy jar - become: True - become_user: '{{ shinyproxy_user }}' - get_url: url={{ shinyproxy_url }} dest={{ shinyproxy_install_dir }} - - - name: Set up a symlink to an unversioned app name - become: True - become_user: '{{ shinyproxy_user }}' - file: src={{ shinyproxy_install_dir }}/{{ shinyproxy_file_name }} dest={{ shinyproxy_install_dir }}/{{ shinyproxy_app_name }} state=link - - - name: Install the shinyproxy configuration file when using version 2.x - template: src=shinyproxy-2-conf.yml.j2 dest={{ shinyproxy_install_dir }}/application.yml owner=root group={{ shinyproxy_user }} mode=0640 - notify: Restart shinyproxy - when: shinyproxy_major_ver == 2 - tags: [ 'shinyproxy', 'shinyproxy_conf', 'shinyproxy_images' ] - - - name: Install the shinyproxy logrotate configuration - template: src=shinyproxy-logrotate.j2 dest=/etc/logrotate.d/shinyproxy owner=root group=root mode=0444 - tags: [ 'shinyproxy', 'shinyproxy_conf' ] - - - name: Install the upstart init file - template: src=upstart-shinyproxy.conf.j2 dest=/etc/init/shinyproxy.conf owner=root group=root mode=0644 - when: ansible_service_mgr != 'systemd' - - when: - - ansible_distribution_major_version < '16' - - shinyproxy_install | bool - tags: shinyproxy - -- block: - - name: Install the shinyproxy deb package - apt: - deb: "https://www.shinyproxy.io/downloads/shinyproxy_{{ shinyproxy_version }}_amd64.deb" - state: present - - - name: Install the shinyproxy configuration file when using version 2.x - template: src=shinyproxy-2-conf.yml.j2 dest=/etc/shinyproxy/application.yml owner=root group={{ shinyproxy_user }} mode=0640 - notify: Restart shinyproxy - when: shinyproxy_major_ver == 2 - tags: [ 'shinyproxy', 'shinyproxy_conf', 'shinyproxy_images' ] - - when: - - ansible_distribution_file_variety == "Debian" - - ansible_distribution_major_version >= '16' - - shinyproxy_install | bool - tags: shinyproxy - -- block: - - name: Ensure that the shinyproxy service is enabled and running - service: name=shinyproxy state=started enabled=yes - - - name: Create the directory where to install the custom templates, if we want to use them - file: dest={{ shinyproxy_template_path }} state=directory - when: shinyproxy_custom_template | bool - - - name: Create shinyproxy log directory - file: dest={{ shinyproxy_log_dir }} state=directory owner=shinyproxy mode=0750 - - - name: Pull the Docker images for the Shiny apps, when using Docker standalone - docker_image: name={{ item.docker_image }} pull=yes state={{ item.image_state | default('present') }} force=yes - with_items: '{{ shinyproxy_apps }}' - when: - - shinyproxy_apps is defined - - shinyproxy_container_backend == 'docker' - tags: [ 'shinyproxy', 'shinyproxy_images' ] - - when: shinyproxy_install | bool - tags: shinyproxy - +- import_tasks: shinyproxy_vm.yml + when: not shinyproxy_as_docker_service +- import_tasks: shinyproxy_docker_service.yml + when: shinyproxy_as_docker_service diff --git a/tasks/shinyproxy_docker_service.yml b/tasks/shinyproxy_docker_service.yml new file mode 100644 index 0000000..7b169e7 --- /dev/null +++ b/tasks/shinyproxy_docker_service.yml @@ -0,0 +1,27 @@ +--- +- name: Manage the composition of shinyproxy as a docker swarm service + block: + - name: Create the directory where the dockerfile and the configuration file will be copied to + file: dest={{ shinyproxy_as_docker_src_dir }} state=directory + + - name: Install the shinyproxy configuration file when using version 2.x + template: src=shinyproxy-2-conf.yml.j2 dest={{ shinyproxy_as_docker_src_dir }}/application.yml owner=root group=root mode=0400 + + - name: Install the shinyproxy docker file + template: src=Dockerfile.j2 dest={{ shinyproxy_as_docker_src_dir }}/Dockerfile owner=root group=root mode=0444 + + - name: Create the docker network used by shinyproxy + docker_network: + name: '{{ shinyproxy_docker_network }}' + driver: overlay + state: present + + - name: Install the docker compose file + template: src=shinyproxy-docker-compose.yml.j2 dest={{ shinyproxy_as_docker_src_dir }}/docker-compose.yml + + - name: Run the docker compose file to start the service + docker_compose: + project_src: '{{ shinyproxy_as_docker_src_dir }}' + build: yes + + tags: [ 'shinyproxy', 'shinyproxy_docker', 'docker' ] diff --git a/tasks/shinyproxy_vm.yml b/tasks/shinyproxy_vm.yml new file mode 100644 index 0000000..8eae34c --- /dev/null +++ b/tasks/shinyproxy_vm.yml @@ -0,0 +1,91 @@ +--- +- block: + - name: Create the shinyproxy user + user: name={{ shinyproxy_user }} home={{ shinyproxy_install_dir }} createhome=yes system=yes shell=/usr/sbin/nologin + + - name: Download the shinyproxy jar + become: True + become_user: '{{ shinyproxy_user }}' + get_url: url={{ shinyproxy_url }} dest={{ shinyproxy_install_dir }} + + - name: Set up a symlink to an unversioned app name + become: True + become_user: '{{ shinyproxy_user }}' + file: src={{ shinyproxy_install_dir }}/{{ shinyproxy_file_name }} dest={{ shinyproxy_install_dir }}/{{ shinyproxy_app_name }} state=link + + - name: Install the shinyproxy configuration file when using version 2.x + template: src=shinyproxy-2-conf.yml.j2 dest={{ shinyproxy_install_dir }}/application.yml owner=root group={{ shinyproxy_user }} mode=0640 + notify: Restart shinyproxy + when: shinyproxy_major_ver == 2 + tags: [ 'shinyproxy', 'shinyproxy_conf', 'shinyproxy_images' ] + + - name: Install the shinyproxy logrotate configuration + template: src=shinyproxy-logrotate.j2 dest=/etc/logrotate.d/shinyproxy owner=root group=root mode=0444 + tags: [ 'shinyproxy', 'shinyproxy_conf' ] + + - name: Install the upstart init file + template: src=upstart-shinyproxy.conf.j2 dest=/etc/init/shinyproxy.conf owner=root group=root mode=0644 + when: ansible_service_mgr != 'systemd' + + when: + - ansible_distribution_file_variety == "Debian" + - ansible_distribution_major_version < '16' + - shinyproxy_install | bool + tags: shinyproxy + +- block: + - name: Install the shinyproxy deb package + apt: + deb: "https://www.shinyproxy.io/downloads/shinyproxy_{{ shinyproxy_version }}_amd64.deb" + state: present + + when: + - ansible_distribution_file_variety == "Debian" + - ansible_distribution_major_version >= '16' + - shinyproxy_install | bool + tags: shinyproxy + +- block: + - name: Install the shinyproxy EL package + yum: + pkg: "https://www.shinyproxy.io/downloads/shinyproxy_{{ shinyproxy_version }}_x86_64.rpm" + state: present + + when: + - ansible_distribution_file_variety == "RedHat" + - shinyproxy_install | bool + tags: shinyproxy + +- name: Shinyproxy configuration when using the package + block: + - name: Install the shinyproxy configuration file when using version 2.x + template: src=shinyproxy-2-conf.yml.j2 dest=/etc/shinyproxy/application.yml owner=root group={{ shinyproxy_user }} mode=0640 + notify: Restart shinyproxy + when: shinyproxy_major_ver == 2 + + when: + - ansible_distribution_major_version >= '16' or ansible_distribution_file_variety == "RedHat" + - shinyproxy_install | bool + tags: [ 'shinyproxy', 'shinyproxy_conf', 'shinyproxy_images' ] + +- block: + - name: Ensure that the shinyproxy service is enabled and running + service: name=shinyproxy state=started enabled=yes + + - name: Create the directory where to install the custom templates, if we want to use them + file: dest={{ shinyproxy_template_path }} state=directory + when: shinyproxy_custom_template | bool + + - name: Create shinyproxy log directory + file: dest={{ shinyproxy_log_dir }} state=directory owner=shinyproxy mode=0750 + + - name: Pull the Docker images for the Shiny apps, when using Docker standalone + docker_image: name={{ item.docker_image }} pull=yes state={{ item.image_state | default('present') }} force=yes + with_items: '{{ shinyproxy_apps }}' + when: + - shinyproxy_apps is defined + - shinyproxy_container_backend == 'docker' + tags: [ 'shinyproxy', 'shinyproxy_images' ] + + when: shinyproxy_install | bool + tags: shinyproxy diff --git a/templates/Dockerfile.j2 b/templates/Dockerfile.j2 new file mode 100644 index 0000000..ee17ddc --- /dev/null +++ b/templates/Dockerfile.j2 @@ -0,0 +1,8 @@ +FROM openjdk:8-jre + +RUN mkdir -p {{ shinyproxy_install_dir }} +RUN wget {{ shinyproxy_url }} -O {{ shinyproxy_install_dir }}/shinyproxy.jar +COPY application.yml {{ shinyproxy_install_dir }}/application.yml + +WORKDIR {{ shinyproxy_install_dir }} +CMD ["java", "-jar", "{{ shinyproxy_install_dir }}/shinyproxy.jar"] diff --git a/templates/shinyproxy-2-conf.yml.j2 b/templates/shinyproxy-2-conf.yml.j2 index 03afa38..9b58958 100644 --- a/templates/shinyproxy-2-conf.yml.j2 +++ b/templates/shinyproxy-2-conf.yml.j2 @@ -32,6 +32,7 @@ proxy: manager-dn: {{ shinyproxy_ldap_admin }} manager-password: {{ shinyproxy_ldap_admin_pwd }} {% endif %} +{% if shinyproxy_container_backend == 'docker' or shinyproxy_container_backend == 'docker-swarm' } docker: container-memory-request: {{ shinyproxy_docker_memory_request }} container-memory-limit: {{ shinyproxy_docker_memory_limit }} @@ -40,7 +41,12 @@ proxy: url: {{ shinyproxy_docker_url }} container-protocol: {{ shinyproxy_docker_protocol }} port-range-start: {{ shinyproxy_docker_port_range_start }} +{% if shinyproxy_as_docker_service %} + internal-networking: true +{% else %} internal-networking: {{ shinyproxy_docker_internal_networking }} +{% endif %} +{% endif %} specs: {% if shinyproxy_default_apps %} - id: 01_hello @@ -60,6 +66,9 @@ proxy: container-cmd: ["R", "-e {{ app.cmd }}"] container-image: {{ app.docker_image }} container-memory: {{ app.docker_memory | default('2g') }} + {% if shinyproxy_as_docker_service %} + container-network: {{ shinyproxy_docker_network }} + {% endif %} {% if app.groups is defined %} groups: {{ app.groups }} {% endif %} diff --git a/templates/shinyproxy-docker-compose.yml.j2 b/templates/shinyproxy-docker-compose.yml.j2 new file mode 100644 index 0000000..70760e1 --- /dev/null +++ b/templates/shinyproxy-docker-compose.yml.j2 @@ -0,0 +1,26 @@ +version: '3.8' + +services: + shinyproxy: + build: . + volumes: + - /var/run/docker.sock:/var/run/docker.sock + ports: + - '{{ shinyproxy_http_port }}':'{{ shinyproxy_http_port }}' + networks: + - '{{ shinyproxy_docker_network }}' + deploy: + mode: replicated + replicas: 1 + placement: + constraints: [node.role == manager] + restart_policy: + condition: on-failure + delay: 5s + max_attempts: 3 + window: 120s + +networks: + '{{ shinyproxy_docker_network }}': + driver: overlay + attachable: true \ No newline at end of file