3
votes

Mon playbook ne télécharge pas les images mises à jour avec le même nom de balise

J'utilise jenkins pour créer des images docker et les pousser vers Docker Hub avec la balise la plus récente à chaque fois. J'ai écrit un playbook ansible qui déploiera les images du docker en extrayant la dernière image du hub docker.Maintenant, le problème est que les nouvelles dernières images n'ont pas été extraites par ansible une fois qu'il a déployé sa version précédente avec le même tag.Pouvez-vous s'il vous plaît vérifier le playbook et faites-moi savoir quelle partie dois-je mettre à jour pour obtenir le travail souhaité.

Playbook:

---
- hosts: flask04
  tasks:
  - name: Pull Flask app  image
    docker_image:
      name: taybur/flaskapp_27032019
      tag: latest
      state: present 

  - name: remove flask app container
    docker_container:
     name: first_flaskapp
     image: taybur/flaskapp_27032019
     state: absent

  - name: Create flask app container
    docker_container:
     name: first_flaskapp
     image: taybur/flaskapp_27032019
     ports:
       - "5001:5001"
     state: started


0 commentaires

3 Réponses :


0
votes

Je supprime généralement l'ancienne image dans le cadre du nettoyage avant l'installation. Vous devez d'abord supprimer l'image, tout comme vous supprimez le conteneur. Cela obligera ansible à extraire la nouvelle version de l'image.

---
- hosts: flask04
  tasks:
  - name: Remove Flask app  image
    docker_image:
      name: taybur/flaskapp_27032019
      tag: latest
      force: true
      state: absent 

  - name: Pull Flask app  image
    docker_image:
      name: taybur/flaskapp_27032019
      tag: latest
      state: present 

  - name: remove flask app container
    docker_container:
     name: first_flaskapp
     image: taybur/flaskapp_27032019
     state: absent

  - name: Create flask app container
    docker_container:
     name: first_flaskapp
     image: taybur/flaskapp_27032019
     ports:
       - "5001:5001"
     state: started


1 commentaires

Vous pouvez faire tout cela en une seule tâche qui se chargera de mettre à jour l'image et de redémarrer le conteneur sur la nouvelle image uniquement lorsque cela est nécessaire. Voir ma réponse.



4
votes

Le module docker_image ne tirera pas automatiquement l'image si elle est déjà présente. Vous devez utiliser le paramètre force: yes pour forcer le tirage à chaque exécution.

De plus, docker_container peut extraire l'image pour vous si elle n'est pas présente. Et vous pouvez lui dire d'essayer de tirer à chaque exécution ( pull: true ) et de redémarrer le conteneur si nécessaire. Vous pouvez donc réduire votre ensemble de tâches à une seule dans ce cas:

  - name: Create/Update the flask app container if needed
    docker_container:
     name: first_flaskapp
     image: taybur/flaskapp_27032019
     pull: "{{ upgrade_flaskapp | default(false) | bool }}"
     restart_policy: always
     ports:
       - "5001:5001"
     state: started

Voir la documentation du module pour docker_container et docker_image

Pour aller plus loin :

  1. En l'état, votre conteneur ne redémarrera pas si vous redémarrez le serveur exécutant votre démon docker. Vous devez utiliser restart_policy: always si vous avez besoin de cette fonctionnalité.
  2. Bien que cet exemple fasse l'affaire, il n'est pas idempotent: un changement d'image induira un changement entre deux exécutions de playbook bien que rien n'ait été modifié dans votre playbook ou vos variables. Une façon de gérer cela est de rendre dynamique le paramètre pull avec une variable que vous utiliserez comme var supplémentaire sur la ligne de commande:
  - name: Create/Update the flask app container if needed
    docker_container:
     name: first_flaskapp
     image: taybur/flaskapp_27032019
     pull: true
     ports:
       - "5001:5001"
     state: started

Maintenant, si vous exécutez le playbook normalement, il:

  • tirez l'image si elle n'est pas présente et créez le conteneur s'il n'est pas déjà en cours d'exécution
  • ne rien faire et signaler ok si le conteneur est déjà en cours d'exécution

Si votre course avec ansible-playbook -i playbook.yml -e upgrade_flaskapp = true cela va:

  • Obtenez la nouvelle version de l'image si elle est disponible et redémarrez le conteneur avec une nouvelle image si nécessaire.
  • Ne rien faire si le conteneur est présent et qu'aucune nouvelle image n'est disponible.


0 commentaires

1
votes

Idéalement, nous devrions avoir nos tâches / rôles idempotents (ignorer le travail en double s'il est exécuté à plusieurs reprises). Donc, je pense qu'il est plus simple de baliser vos builds avec les numéros de version et d'utiliser le numéro de version dans votre déploiement au lieu du dernier.


0 commentaires