Installation d'un serveur de prod avec ansible - besoin d'aide

a marqué ce sujet comme résolu.

Bonjour, tout d’abord merci de rendre public et disponible votre travail titanesque. J’apprécie grandement ZDS et pour le fun, et aussi surtout pour apprendre, j’aimerais déployer un serveur de production identique au votre, avant de pouvoir le modifier par la suite.

Je loue un VPS chez Gandi et j’ai cloné 2 de vos dépôts github, zds-site et ansible-zestedesavoir. Pour ce dernier vous passez en paramètres "—vault-password-file=vault-secret". J’ai l’impression que dans ce fichier il y a, outre le mot de passe pour l’API Google, autre chose comme les login/pass de Mysql, correct ? Bref, pourriez vous expliquer comment vous générer ce fichier et ce qu’il contient exactement ? Comme ça je pourrais tester ansible sur mon serveur et m’amuser un peu :)

Merci beaucoup.

Salut,

Je suis une des personnes en charge en ce moment du serveur de production de Zeste de Savoir donc je vais essayer de t’expliquer un peu comment tout ça fonctionne !

Premièrement, tu n’as pas besoin de cloner les dépôts zds-site et ansible-zestedesavoir sur ton VPS et je te conseille même de les supprimer. Il faut que tu clones ansible-zestedesavoir sur ton ordinateur personnel et que tu installes Ansible à partir de leur site web.

Ensuite il va falloir modifier le fichier hosts comme ceci :

[vps]
vps.ton-nom-de-domaine.fr

[app:children]
vps

Il va aussi falloir créer une copie du dossier group_vars/test/ que tu nommeras group_vars/vps/, c’est ici que tu pourras mettre les variables qui concernent ton VPS. Normalement celles déjà présentes sont suffisantes pour lancer un serveur fonctionnel de Zeste de Savoir. Si tu regardes dans le dossier group_vars/production tu y verras deux fichiers : vars.yaml et vault.yaml, ce dernier étant chiffré avec la clé secrète vault-secret. Ce fichier contient des identifiants pour la base de données, la connexion OAuth avec les réseaux sociaux (Twitter, Google, Facebook), etc. Voici un aperçu des variables contenus dans ce fichier sans leur valeur :

sentry_dsn: ""
zmarkdown_sentry_dsn: ""

secrets:
  gandi: ""
  facebook:
    key: ""
    secret: ""
  twitter:
    key: ""
    secret: ""
  google:
    key: ""
    secret: ""
  google_analytics_api:
    project_id: ""
    private_key_id: ""
    private_key: ""
    client_email: ""
    client_id: ""
    client_x509_cert_url: ""

mysql:
  name: ""
  user: ""
  password: ""

Dernier prérequis : il faut que tu puisses te connecter en SSH sur ton VPS depuis ton ordinateur, mais j’imagine que c’est déjà la cas.

Normalement tu peux simplement lancer la commande ansible-playbook -l vps -t bootstrap -K playbook.yaml depuis la racine du dépôt et Ansible devrait installer Zeste de Savoir sur ton VPS.

À noter que tu peux installer une version de production de Zeste de Savoir sur ton ordinateur personnel très facilement avec Vagrant. Il te suffit d’avoir VirtualBox (ou équivalent), Vagrant et de suivre ces instructions.

Dernièrement, si tu souhaites contribuer au projet technique, le mieux est d’installer Zeste de Savoir en local sur ton ordinateur personnel en suivant ces instructions là.

N’hésites pas si tu as d’autres questions !

+4 -0

Salut, et merci beaucoup :D

Je me suis mal exprimé, les clones, je les ai mis sur mon PC et pas sur le serveur. J’ai installé ansible sur mon PC a partir des dépôts Ubuntu sans soucis.

J’ai rajouté l’option ansible_user=ansible à la suite du nom du serveur vps dans le fichier hosts, car sinon je ne sais pas quel login il va utiliser pour se connecter en ssh sur le vps. J’y ai bien sur déposé ma clé publique et je peux donc facilement me connecter.

Sur le vps j’avais créé un utilisateur ansible que j’ai rajouté dans le fichier /etc/sudoers. J’utilise la ligne de commande suivante pour lancer le tout:

ansible-playbook playbook.yml --limit=prod --tags=bootstrap --ask-become-pass --vault-password-file=vault-secret

Tout se déroule sans accros, jusqu’à cette erreur:

TASK [app : install frontend] ***********************************************************************************************************
fatal: []: FAILED! => {
    "changed": false
}

MSG:

Failed to find required executable npm in paths: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Apparemment il manque l’exécutable npm. Heureusement après un second run cette erreur disparaît. Ceci dit, par la suite j’ai d’autres soucis.

La prochaine erreur concerne latex:

TASK [latex : create ansible state if non-existant] *************************************************************************************************************
Error, could not touch target: [Errno 2] No such file or directory: '/opt/zds/texmf/ansible-state'

Cette erreur était facilement corrigeable en remplaçant /opt/zds par "{{ workdir }}" car j’avais changé le contenu de cette variable.

J’ai aussi réussi à corriger l’erreur suivante, mais bien que ça fonctionne je ne suis pas sur qu’il s’agisse de la bonne solution:

TASK [latex : install packages] *************************************************************************************************************
fatal: []: FAILED! => {}

MSG:

The conditional check 'installed_packages.content|b64decode|trim != latex_packages|join(" ")' failed. The error was: error while evaluating conditional (installed_packages.content|b64decode|trim != latex_packages|join(" ")): 'installed_packages' is undefined

The error appears to be in 'roles/latex/tasks/packages.yml': line 22, column 3, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:


- name: install packages
  ^ here

Pour la corriger donc, j’ai rajouté les 2 lignes suivantes dans le fichier packages.yml juste après register: installed_packages:

  tags:
    - bootstrap

J’ai ensuite eu plein d’erreurs 404 lors du téléchargement des polices de caractères:

"response": "HTTP Error 404: Not Found",
    "status_code": 404,
    "url": "https://raw.githubusercontent.com/adobe-fonts/source-sans-pro/release/OTF/SourceSansPro-Black.otf"

J’ai donc du modifier le fichier main.yml de vars pour retirer les 3 lignes qui font mentions aux polices SourceSansPro. Je ne connais pas les conséquences de ce retrait, mais l’idée c’est d’arriver à finir l’installation jusqu’à la fin.

C’est maintenant que ça se corse, car je n’arrive pas à corriger cette erreur:

TASK [zmd : install zmarkdown] *************************************************************************************************************
fatal: []: FAILED! => {
    "changed": false
}

MSG:

Failed to find required executable npm in paths: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Bien que l’erreur semble similaire à la première, relancer le tout plusieurs fois de suite n’y change rien.

Une idée ?

Merci.

PS: Voici le récap de la tentative d’installation:

PLAY RECAP *************************************************************************************************************
      : ok=54   changed=2    unreachable=0    failed=1    skipped=5    rescued=0    ignored=0
+0 -0

J’ai oublié de précisé une chose : on utilise Debian 10 sur nos serveurs donc si tu as un autre OS ça peut poser soucis.

Je n’ai jamais eu les erreurs que tu as concernant npm. Elle sont assez étonnantes d’ailleurs car normalement npm est installé en même temps que nodejs. As-tu vérifié si npm est bien installé sur ton OS ? Peut-être que c’est simplement une erreur de chemin vers le binaire.

La première erreur qui concerne LaTeX me rappelle qu’il y a quelques chemins écrits en dur qu’il faut que je remplace par des variables, merci ! Pour la deuxième erreur, je pense que tu as trouvé la bonne solution, encore un oubli ! :D

Les erreurs 404 pour le téléchargement des polices de caractères sont récentes et dues à un renommage de fichiers sur le dépôt Github adobe-fonts/source-sans-pro, je m’occuperai de le corriger prochainement. Ces polices de caractères sont utilisées pour les exports PDF des contenus mais ne sont pas nécessaires pour le site web en lui même.

Merci pour ton retour !

+0 -0

Oui pas de soucis, j’ai bien pris soin de choisir une Debian 10 pour mon vps, comme c’est marqué quelque part dans la doc.

Après vérifications il s’avère bien que nodejs n’était pas installé, ni même ses dépôts. Comprendre la manière dont nodejs est installé par ansible n’a pas été évident pour moi.

Si j’ai bien compris, le rôle app fait un include_tasks frontend.yml when app.changed. Et, dans ce frontend.yml on lance l’installation de nodejs en appelant la task nodejs qui se trouve dans le rôle common. Je trouve ça trop compliqué, d’autant plus que dans le rôle zmd on installe une nouvelle fois nodejs.

Bref, pour simplifier tout ça, j’ai créer un nouveau rôle nodejs en recopiant le fichier nodejs.yml en tant que main.yml de ce nouveau rôle. Puis, je l’ai rajouté dans le playbook.yml. Mais j’ai aussi enlevé l’inclusion de la task nodejs de frontend.yml du rôle app, ainsi que du rôle zmd.

Voici à quoi ressemble mon fichier playbook.yml maintenant:

- hosts: app
  become: true
  roles:
    - role: common
      tags: bootstrap
    - role: elasticsearch
      tags: bootstrap
    - role: mysql
      tags: bootstrap
    - role: web
      tags: bootstrap
    - role: nodejs
      tags: bootstrap
    - app
    - latex
    - zmd

Tout se fini sans erreurs, et je précise que j’ai pris l’option "prod" et non pas "dev". Malheureusement rien ne s’affiche et je pense même que le serveur web ne tourne pas. Il faut que je creuse encore un peu :)

+0 -0

Le serveur nginx était à l’arrêt. Ceci était du au fait que les variables pour les logs nginx étaient positionnées en dur dans le fichier de template de la prod roles/web/templates/nginx/sites-available/prod-redirect.j2

J’ai donc modifié les lignes 19 & 20 en utilisant la variable {{ logdir }}:

server {
        listen 80;
        listen [::]:80;
{% if certificate is defined and cert.stat.exists %}
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
{% endif %}
        server_name
                www.tuxmania.net
                ftp.tuxmania.net
                gandi.tuxmania.net
                postfix.tuxmania.net
                smtp.tuxmania.net
                uploads.tuxmania.net
                tribunes.tuxmania.net
                scaleway.tuxmania.net
        ;

        access_log {{ logdir }}/nginx-redirect-access.log;
        error_log {{ logdir }}/nginx-redirect-error.log;

        server_tokens off;
{% if certificate is defined and cert.stat.exists %}
        ssl_certificate {{ certificate.cert }};
        ssl_certificate_key {{ certificate.key }};
{% endif %}


        root /var/www/html/;

        location ~ /.well-known {
                allow all;
        }
        rewrite ^(.*) $scheme://tuxmania.net$1 permanent;
}

Maintenant j’ai une erreur 400, bad request

Bad Request (400)

Je continue de creuser :)

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte