diff --git a/README.md b/README.md index ceaf76f..e851191 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,102 @@ # role_hugo -Rôle d'installation de gohugo.io \ No newline at end of file +Rôle de déploiement de gohugo.io + +## Fonctionnement + +Ce rôle prends en charge le serveur intégré ou l'utilisation de nginx pour servir le site.
+Afin de ne pas utiliser le serveur intégré, mettre la variable `hugo_nginx_enabled` à `true`. + +## Variables + +### hugo_os + +Nécessaire pour télécharger le bon paquet depuis github.com. + +Valeur par défaut: `linux` + + +### hugo_architecture + +Nécessaire pour télécharger le bon paquet depuis github.com.
+Les architectures disponbiles sont *amd64* et *arm64*. + +Valeur par défaut: `arm64` + +### hugo_latest_url + +URL pointant vers l'API de github.com fournissant le lien de téléchargement du paquet. + +Valeur par défaut: `https://api.github.com/repos/gohugoio/hugo/releases/latest` + +### hugo_version + +Version qui sera installée. + +Valeur par défaut: `latest` + +### hugo_installation_type + +Type d'installation souhaitée (`deb` ou `archive`). + +Valeur par défaut: `archive` + +### hugo_binary_path + +Emplacement où sera déployer le binaire. + +Valeur par défaut: `/opt/hugo` + +### hugo_install_command + +Ajouter la commande `hugo` dans le PATH. + +Valeur par défaut: `false` + +### hugo_data_path + +Emplacement où seront stockées les données. + +Valeur par défaut: `/srv/hugo` + +### hugo_timer_enabled + +Activer la génération automatique régulière des fichiers statiques. + +Valeur par défaut: `true` + +### hugo_base_url + +URL utilisée dans la génération des fichiers statiques. + +Valeur par défaut: aucune + +### hugo_server_listen + +Adresse IP d'écoute du serveur intégré. + +Valeur par défaut: `0.0.0.0` + +### hugo_server_port + +Port d'écoute du serveur intégré. + +Valeur par défaut: `8080` + +### hugo_timer_enabled + +Activer la génération automatique tous les jours (`daily`). + +Valeur par défaut: `true` + +### hugo_nginx_enabled + +Ne pas utiliser le serveur intégré pour servir les fichiers statiques. + +Valeur par défaut: `false` + +### hugo_nginx_docroot + +Emplacement où les fichiers statiques seront générés pour nginx. + +Valeur par défaut: `/var/www/hugo` diff --git a/defaults/main.yml b/defaults/main.yml new file mode 100644 index 0000000..30101f4 --- /dev/null +++ b/defaults/main.yml @@ -0,0 +1,20 @@ +--- +# defaults file for hugo + +hugo_os: linux +hugo_architecture: arm64 +hugo_latest_url: https://api.github.com/repos/gohugoio/hugo/releases/latest +hugo_version: latest + +hugo_binary_path: /opt/hugo +hugo_install_command: false + +hugo_data_path: /srv/hugo +hugo_base_url: "" + +hugo_server_listen: 0.0.0.0 +hugo_server_port: 8080 +hugo_timer_enabled: true + +hugo_nginx_enabled: false +hugo_nginx_docroot: /var/www/hugo diff --git a/handlers/main.yml b/handlers/main.yml new file mode 100644 index 0000000..35181a3 --- /dev/null +++ b/handlers/main.yml @@ -0,0 +1,23 @@ +--- +# handlers file for hugo + +- name: Installer la commande + ansible.builtin.command: + cmd: install -t /usr/local/bin /opt/hugo/hugo + become: true + +- name: Redémarrer le service + ansible.builtin.systemd: + enabled: false + daemon_reload: true + state: restarted + name: hugo.service + become: true + +- name: Activer et exécuter la planification + ansible.builtin.systemd: + enabled: "{{ hugo_timer_enabled }}" + daemon_reload: true + state: started + name: hugo.timer + become: true diff --git a/meta/main.yml b/meta/main.yml new file mode 100644 index 0000000..79fdaff --- /dev/null +++ b/meta/main.yml @@ -0,0 +1,19 @@ +galaxy_info: + author: pulsar89.5 + description: Rôle de déploiement de gohugo.io + + license: GPL-3.0-or-later + + min_ansible_version: 2.1 + + platforms: + - name: Debian (LXD) + versions: + - 11 + + galaxy_tags: + - gohugo.io + - hugo + - web + +dependencies: [] diff --git a/tasks/configuration.yml b/tasks/configuration.yml new file mode 100644 index 0000000..952263b --- /dev/null +++ b/tasks/configuration.yml @@ -0,0 +1,48 @@ +--- +# tasks file for hugo + +- name: Récupérer les informations sur le dossier des données + ansible.builtin.stat: + path: "{{ hugo_data_path }}" + become: true + register: data_path_infos + +- name: Créer l'emplacement des données + ansible.builtin.file: + state: directory + path: "{{ hugo_data_path }}" + owner: root + group: root + mode: u=rw,g=r,o= + when: not data_path_infos.stat.exists + become: true + +- name: Déployer le service + ansible.builtin.template: + owner: root + group: root + mode: u=rw,g=r,o=r + src: hugo.service.j2 + dest: /etc/systemd/system/hugo.service + become: true + notify: Redémarrer le service + +- name: Activer le service + ansible.builtin.systemd: + enabled: true + daemon_reload: true + state: restarted + name: hugo.service + when: hugo_timer_enabled + become: true + +- name: Déployer la planification + ansible.builtin.template: + owner: root + group: root + mode: u=rw,g=r,o=r + src: hugo.timer.j2 + dest: /etc/systemd/system/hugo.timer + when: hugo_timer_enabled + become: true + notify: Activer et exécuter la planification diff --git a/tasks/installation.yml b/tasks/installation.yml new file mode 100644 index 0000000..7a4a4d2 --- /dev/null +++ b/tasks/installation.yml @@ -0,0 +1,49 @@ +--- +# tasks file for hugo + +- name: Créer l'emplacement de stockage du binaire + ansible.builtin.file: + state: directory + path: "{{ hugo_binary_path }}" + mode: u=rwX,g=rX,o=rX + become: true + +- name: Modifier l'URL pour pointer vers la version souhaitée + ansible.builtin.set_fact: + hugo_latest_url: "{{ hugo_latest_url | replace('latest', version) }}" + when: hugo_version != "latest" + vars: + version: "tags/v{{ hugo_version }}" + +- name: Récupérer le contenu du fichier de version + ansible.builtin.uri: + url: "{{ hugo_latest_url }}" + return_content: true + follow_redirects: all + register: releases + +- name: Extraire l'URL du paquet + ansible.builtin.set_fact: + browser_download_url: > + {{ + releases.json.assets | + selectattr('browser_download_url', 'search', '.tar.gz') | + selectattr('browser_download_url', 'search', hugo_os) | + selectattr('browser_download_url', 'search', hugo_architecture) | + map(attribute='browser_download_url') + }} + +- name: Extraire l'archive + ansible.builtin.unarchive: + src: "{{ browser_download_url | first }}" + dest: "{{ hugo_binary_path }}" + remote_src: true + list_files: true + mode: u=rwX,g=rX,o=rX + become: true + +- name: Installer la commande + ansible.builtin.command: + cmd: install -t /usr/local/bin /opt/hugo/hugo + when: hugo_install_command + become: true diff --git a/tasks/main.yml b/tasks/main.yml new file mode 100644 index 0000000..eaa2f7b --- /dev/null +++ b/tasks/main.yml @@ -0,0 +1,9 @@ +--- +# tasks file for hugo + +- name: Importer les tâches d'installation + ansible.builtin.import_tasks: installation.yml + +- name: Importer les tâches de configuration + ansible.builtin.import_tasks: configuration.yml + when: hugo_install_command diff --git a/templates/hugo.service.j2 b/templates/hugo.service.j2 new file mode 100644 index 0000000..39e8946 --- /dev/null +++ b/templates/hugo.service.j2 @@ -0,0 +1,24 @@ +# {{ ansible_managed }} + +[Unit] +Description=HuGO project {{ hugo_base_url }} +After=syslog.target +After=network.target +ConditionFileNotEmpty={{ hugo_data_path }}/config.yaml + +[Service] +User=root +WorkingDirectory={{ hugo_data_path }} +{% if hugo_nginx_enabled %} +Type=oneshot +ExecStart=/usr/local/bin/hugo --cleanDestinationDir --baseURL {{ hugo_base_url }} +ExecStartPost=/usr/bin/rsync --delete-after --recursive --partial {{ hugo_data_path }}/public/ {{ hugo_nginx_docroot }}/ +{% else %} +Type=simple +ExecStart=/usr/local/bin/hugo server --cleanDestinationDir --appendPort=false --bind={{ hugo_server_listen }} --port={{ hugo_server_port }} --baseURL={{ hugo_base_url }} +Restart=always +RestartSec=2s +{% endif %} + +[Install] +WantedBy=multi-user.target diff --git a/templates/hugo.timer.j2 b/templates/hugo.timer.j2 new file mode 100644 index 0000000..6c1b128 --- /dev/null +++ b/templates/hugo.timer.j2 @@ -0,0 +1,12 @@ +# {{ ansible_managed }} + +[Unit] +Description=HuGO to reload {{ hugo_base_url }} +ConditionFileNotEmpty={{ hugo_data_path }}/config.yaml + +[Timer] +OnCalendar=daily +Persistent=true + +[Install] +WantedBy=timers.target