From 0c5bcc242fcc8e9cfa0c2e1f2cb66690365309b5 Mon Sep 17 00:00:00 2001 From: Robin Sonnabend <robin@fsmpi.rwth-aachen.de> Date: Wed, 15 Jul 2020 16:30:21 +0200 Subject: [PATCH] Create common role for the generic phpwebapp It does: - create a directory, user and group - install required packages - create a mysql database - download and unpack the program (if source is given) - check for updates (daily, if configured) It doesn't: - create a configuration file. There's no common format. Would need a template and destination per software - create db schema - configure fpm or nginx --- framadate/defaults/main.yml | 3 - framadate/tasks/main.yml | 52 --------- phpwebapps/defaults/main.yml | 10 ++ phpwebapps/files/check-phpwebapp-update.sh | 28 +++++ phpwebapps/tasks/main.yml | 120 +++++++++++++++++++++ phpwebapps/templates/crontab.j2 | 3 + 6 files changed, 161 insertions(+), 55 deletions(-) delete mode 100644 framadate/defaults/main.yml delete mode 100644 framadate/tasks/main.yml create mode 100644 phpwebapps/defaults/main.yml create mode 100644 phpwebapps/files/check-phpwebapp-update.sh create mode 100644 phpwebapps/tasks/main.yml create mode 100644 phpwebapps/templates/crontab.j2 diff --git a/framadate/defaults/main.yml b/framadate/defaults/main.yml deleted file mode 100644 index 0a87288..0000000 --- a/framadate/defaults/main.yml +++ /dev/null @@ -1,3 +0,0 @@ ---- - -framadate_name: "framadate" diff --git a/framadate/tasks/main.yml b/framadate/tasks/main.yml deleted file mode 100644 index 7603adb..0000000 --- a/framadate/tasks/main.yml +++ /dev/null @@ -1,52 +0,0 @@ ---- - -- name: install packages - apt: - name: - - php - - php-mbstring - - php-mysql - - php-intl - - composer - -- name: ensure a group for framadate exist - group: - name: "{{framadate_name}}" - state: present - system: true - -- name: ensure a user for framadate exist - user: - name: "{{framadate_name}}" - group: "{{framadate_name}}" - state: present - system: true - shell: /usr/bin/nologin - home: "/var/www/{{framadate_name}}" - createhome: false - -- name: ensure the directory for framadate exist - file: - path: "/var/www/{{framadate_name}}" - state: directory - owner: "{{framadate_name}}" - group: "{{framadate_name}}" - mode: '0755' - -- name: create the mysql database - mysql_db: - name: "{{framadate_name}}" - state: present - login_user: root - login_password: "{{lookup('passwordstore', 'db/{{ansible_hostname}}-mysql')}}" - no_log: true - -- name: create mysql db user - mysql_user: - name: "{{framadate_name}}" - password: "{{lookup('passwordstore', 'db/{{ansible_hostname}}-mysql-{{framadate_name}} create=true length=20')}}" - state: present - login_user: root - login_password: "{{lookup('passwordstore', 'db/{{ansible_hostname}}-mysql')}}" - priv: "{{framadate_name}}.*:ALL" - no_log: true diff --git a/phpwebapps/defaults/main.yml b/phpwebapps/defaults/main.yml new file mode 100644 index 0000000..23ed466 --- /dev/null +++ b/phpwebapps/defaults/main.yml @@ -0,0 +1,10 @@ +--- + +phpwebapps: [] + +# phpwebapps: +# - name: termine +# directory: /var/www/termine (default) +# packages: ["php-mbstring", "php-intl"] +# url: "https://example.com/download/genericphpsoftware.zip +# checksum: "sha256:abc123…" diff --git a/phpwebapps/files/check-phpwebapp-update.sh b/phpwebapps/files/check-phpwebapp-update.sh new file mode 100644 index 0000000..eb49d8e --- /dev/null +++ b/phpwebapps/files/check-phpwebapp-update.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +if [ "$#" -ne 4 ]; then + echo "Usage: $0 Name URL pattern version" >&2 + exit 1 +fi + +software=$1 +url=$2 +pattern=$3 +version=$4 + +page=$(curl "$url" 2>/dev/null) +if [[ $? -ne 0 ]]; then + echo "Querying ${url} (for ${software}) failed." + exit 1 +fi +match=$(echo $page | grep -Po "${pattern}") +if [[ $? -ne 0 ]]; then + echo "Version pattern '${pattern}' not found in ${url} (for ${software})." + exit 1 +fi +echo $match | grep -qF $version +if [[ $? -ne 0 ]]; then + echo "${software} requires update: \"${version}\" does not match \"${match}\"." + exit 0 +fi +exit 0 diff --git a/phpwebapps/tasks/main.yml b/phpwebapps/tasks/main.yml new file mode 100644 index 0000000..d884ebb --- /dev/null +++ b/phpwebapps/tasks/main.yml @@ -0,0 +1,120 @@ +--- + +- name: install packages + apt: + name: + - php + - php-mbstring + - php-mysql + - php-intl + - composer + +- name: install additional packages for the php sites + apt: + name: "{{item.packages}}" + loop: "{{phpwebapps}}" + when: item.packages is defined + loop_control: + label: "{{item.name}}" + +- name: ensure groups for the php sites exist + group: + name: "{{item.name}}" + state: present + system: true + loop: "{{phpwebapps}}" + loop_control: + label: "{{item.name}}" + +- name: ensure groups for the php sites exist + user: + name: "{{item.name}}" + group: "{{item.name}}" + state: present + system: true + shell: /usr/bin/nologin + home: "{{item.directory|default('/var/www/' + item.name)}}" + createhome: false + loop: "{{phpwebapps}}" + +- name: ensure directories for the php sites exist + file: + path: "{{item.directory|default('/var/www/' + item.name)}}" + state: directory + owner: "{{item.name}}" + group: "{{item.name}}" + mode: '0755' + loop: "{{phpwebapps}}" + loop_control: + label: "{{item.name}}" + +- name: create the mysql database + mysql_db: + name: "{{item.name}}" + state: present + login_user: root + login_password: "{{lookup('passwordstore', 'db/{{ansible_hostname}}-mysql')}}" + no_log: true + loop: "{{phpwebapps}}" + loop_control: + label: "{{item.name}}" + +- name: create mysql db user + mysql_user: + name: "{{item.name}}" + password: "{{lookup('passwordstore', 'db/{{ansible_hostname}}-mysql-{{item.name}} create=true length=20')}}" + state: present + login_user: root + login_password: "{{lookup('passwordstore', 'db/{{ansible_hostname}}-mysql')}}" + priv: "{{item.name}}.*:ALL" + no_log: true + loop: "{{phpwebapps}}" + loop_control: + label: "{{item.name}}" + +- name: download the software + get_url: + url: "{{item.url}}" + dest: "/tmp/{{item.name}}{{item.url|splitext|last}}" + checksum: "{{item.checksum}}" + loop: "{{phpwebapps}}" + when: item.url is defined and item.checksum is defined + loop_control: + label: "{{item.name}}" + +- name: unpack the software + unarchive: + src: "/tmp/{{item.name}}{{item.url|splitext|last}}" + dest: "{{item.directory|default('/var/www/' + item.name)}}" + remote_src: true + owner: "{{item.name}}" + group: "www-data" + mode: '0755' + loop: "{{phpwebapps}}" + when: item.url is defined and item.checksum is defined + loop_control: + label: "{{item.name}}" + +- name: install update-check-script + copy: + src: check-phpwebapp-update.sh + dest: /usr/local/bin/ + owner: root + group: root + mode: '0755' + loop: "{{phpwebapps}}" + when: item.update_check is defined + loop_control: + label: "{{item.name}}" + +- name: regularly check for updates + template: + src: crontab.j2 + dest: "/etc/cron.daily/phpwebapp-{{item.name}}" + owner: root + group: root + mode: '0755' + loop: "{{phpwebapps}}" + when: item.update_check is defined + loop_control: + label: "{{item.name}}" diff --git a/phpwebapps/templates/crontab.j2 b/phpwebapps/templates/crontab.j2 new file mode 100644 index 0000000..f266bf1 --- /dev/null +++ b/phpwebapps/templates/crontab.j2 @@ -0,0 +1,3 @@ +#!/bin/sh + +/usr/local/bin/check-phpwebapp-update.sh '{{item.name}}' '{{item.update_check.url}}' '{{item.update_check.pattern}}' '{{item.update_check.current_version}}' -- GitLab