Деплой на Docker Image на Dokku с помощта на Ansible

Деплой на Docker Image на Dokku с помощта на Ansible

Преамбула

Наскоро научих за "портативната" PaaS, подобна на Heroku, с доста очевидното име – Dokku. Много ми хареса възможността за лесно добавяне на сертификат към приложението и vhost от самото начало, затова реших да преместя своите Docker образи на Dokku. Обаче бях разочарован, че в Dokku няма команди, подобни на тези в Heroku.

dokku container:push
dokku container:release
// Беше много удобно, но все още го няма :(

Съществува команда tags която позволява деплой на образи, но самият образ трябва да бъде вече на хоста в този момент. С други думи, за да изтеглите току-що направения локален image, първо трябва да го копирате на хоста.

tags:create                          # Добавя таг към последния работещ образ на приложението
tags:deploy                          # Деплоира тагнатия образ на приложението
tags:destroy                         # Премахва тага на образа на приложението

Запознат съм с Ansible и дори съм създавал с негова помощ прости пайплайни за доставка на бекенд, така че изборът беше лесен. Можеше разбира се да напиша плъгин за dokku, но не, не сега.

Playbook

Този playbook архивира определен локален образ, копира го на хоста, възстановява го и го деплоирa в dokku. Поставих го в Gitlab репозиторий. Все още има много възможности за подобрения.

push-image.dokku.yml

push-image.dokku.yml

---
  - name: "DEPLOY APP '{{ appname }}' TO DOKKU"
    hosts: dokku_hosts
    remote_user: root
    gather_facts: false
    vars:
      tarname: "{{ appname }}__{{ image }}.tar"
      upload_dir: "/usr/local/src"
      upload_path: "{{ upload_dir }}/{{ tarname }}"
      apptag: "{{ upload_tag | default('latest') }}"
      dokku_image: "dokku/{{ appname }}:{{ apptag }}"

    tasks:
      - name: "Архивиране на '{{ image }}' за качване"
        register: env
        delegate_to: localhost
        shell: 
          cmd: docker image save -o "./{{ tarname }}" {{ image }}

      - name: "Качване на образ '{{ image }}' в dokku на '{{ inventory_hostname }}'"
        register: upload
        copy:
          src: "./{{ tarname }}"
          dest: "{{ upload_path }}"

      - name: "Лог - Резултат от качването"
        debug:
          var: upload.dest

      - name: "Възстановяване на качения Docker образ"
        register: restore
        shell:
          cmd: docker image load -i "{{ upload_path }}"

      - name: "Лог - Възстановяване на образа"
        debug:
          var: restore.stdout_lines

      - name: "Преобозначаване на образа на '{{ dokku_image }}'"
        shell:
          cmd: docker tag "{{ image }}" "{{ dokku_image }}"

      - name: "Създаване на dokku таг за '{{ dokku_image }}'"
        shell:
          cmd: dokku tags:create "{{ appname }}" "{{ apptag }}"

      - name: "Публикуване на '{{ appname }}'"
        register: release
        shell:
          cmd: dokku tags:deploy "{{ appname }}" "{{ apptag }}"

      - name: "Лог - Публикуване"
        debug:
          var: release.stdout_lines  

Предполага се, че Ansible на локалната машина и dokku на хоста вече са инсталирани.

Използвайте така

ansible-playbook push-image.dokku.yml -i some_inventory -e "appname=DOKKU_APP_NAME image=DOCKER_IMAGE"

some_inventory

[dokku_hosts]
your.domain.example

Източник: habr.com

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster