Ansible

Ansible

Polycrate bietet eine spezielle Integration mit Ansible. Der Workspace-Snapshot, der im YAML-Format exportiert und zum Polycrate-Container hinzugefügt wird, wird von Ansible automatisch verarbeitet. Als Ergebnis ist der Snapshot direkt als Top-Level-Variablen in Ansible verfügbar und kann in Playbooks und Vorlagen verwendet werden.

Das folgende Beispiel zeigt:

  • die Standardkonfiguration (block.poly) eines Blocks namens traefik
  • die vom Benutzer bereitgestellte Konfiguration für den Block in workspace.poly
  • das Ansible-Playbook, das die freigegebenen Variablen verwendet (block.config…)
  • eine Ansible-Vorlage, die die freigegebenen Variablen verwendet (templates/docker-compose.yml.j2)
  • die resultierende Datei /polycrate/docker-compose.yml, die auf einen Remote-Host übertragen wird

Hinweis

Beachte, dass im block.poly das konfigurierte Image traefik:2.6 ist, aber in workspace.poly traefik:2.7.

In der daraus resultierenden docker-compose.yml ist das Image traefik:2.7, da die Standardwerte in block.poly durch die benutzerdefinierte Konfiguration in workspace.poly überschrieben werden.

Die Blockvariable enthält die Konfiguration des aktuellen Blocks, der durch

polycrate run traefik install

aufgerufen wird. Zusätzlich gibt es eine Variable namens workspace, die den vollständig kompilierten Arbeitsbereich einschließlich zusätzlicher Blöcke enthält, die im Workspace verfügbar sind.

Polycrate verwendet ein spezielles Ansible-Vars Plugin, um den Yaml-Snapshot einzulesen und ihn als Top-Level-Variable den Ansible-Fakten zur Verfügung zu stellen.

# block.poly
name: traefik
config:
  image: "traefik:v2.6"
  letsencrypt:
    email: ""
    resolver: letsencrypt
actions:
  - name: install
    script:
      - ansible-playbook install.yml
  - name: uninstall
    script:
      - ansible-playbook uninstall.yml
  - name: prune
    script:
      - ansible-playbook prune.yml
# workspace.poly
```yaml
name: ansible-traefik-demo
blocks:
  - name: traefik
    inventory:
      from: inventory-block
    config:
      letsencrypt:
        email: info@example.com
      image: traefik:2.7
# install.yml
- name: "install"
  hosts: all
  gather_facts: yes
  tasks:
    - name: Create remote block directory
      ansible.builtin.file:
        path: "{{ item }}"
        state: directory
        mode: '0755'
      with_items:
        - "/polycrate/{{ block.name }}"

    - name: Copy compose file
      ansible.builtin.template:
        src: docker-compose.yml.j2
        dest: "/polycrate/{{ block.name }}/docker-compose.yml"

    - name: Deploy compose stack
      docker_compose:
        project_src: "/polycrate/{{ block.name }}"
        remove_orphans: true
        files:
          - docker-compose.yml
# templates/docker-compose.yml.j2
version: "3.9"

services:
  traefik:
    image: "{{ block.config.image }}"
    container_name: "traefik"
    command:
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.websecure.address=:443"
      - "--certificatesresolvers.{{ block.config.letsencrypt.resolver }}.acme.email={{ block.config.letsencrypt.email }}"
      - "--certificatesresolvers.{{ block.config.letsencrypt.resolver }}.acme.storage=/letsencrypt/acme.json"
      - "--certificatesresolvers.{{ block.config.letsencrypt.resolver }}.acme.tlschallenge=true"
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
      - "traefik-letsencrypt:/letsencrypt"
    networks:
      - traefik

networks:
  traefik:
    name: traefik
  
volumes:
  traefik-letsencrypt:
# /polycrate/traefik/docker-compose.ym
version: "3.9"

services:
  traefik:
    image: "traefik:2.7"
    container_name: "traefik"
    command:
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.websecure.address=:443"
      - "--certificatesresolvers.letsencrypt.acme.email=info@example.com"
      - "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
      - "--certificatesresolvers.letsencrypt.acme.tlschallenge=true"
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
      - "traefik-letsencrypt:/letsencrypt"
    networks:
      - traefik

networks:
  traefik:
    name: traefik
  
volumes:
  traefik-letsencrypt:

Ansible Inventory

Polycrate kann YAML-formatierte Ansible-Inventorydateien im Artifacts-Verzeichnis eines Blocks verarbeiten. Polycrate sucht standardmäßig nach einer Datei namens inventory.yml (diese kann jedoc mit der inventory.filename-Stanza in der Blockkonfiguration überschrieben werden.

Eine Inventory-Datei kann automatisch von einem Block erstellt oder manuell bereitgestellt werden (nützlich für bereits bestehende Infrastruktur).

Die Inventories können vom besitzenden Block selbst oder von anderen Blöcken mit der Inventory-Strophe in der Blockkonfiguration verarbeitet werden:

workspace.poly

blocks:
  - name: block-a
    inventory:
      from: block-b
      filename: inventory.yml # Standardmäßig auf inventory.yml gesetzt

Dies fügt eine Umgebungsvariable (ANSIBLE_INVENTORY=Pfad/zum/Inventar/von/block-b) zum Container hinzu, die Ansible auf das richtige Inventar verweist, mit dem gearbeitet werden soll.

Das Inventar von block-b könnte so aussehen:

all:
  hosts:
    host-1:
      ansible_host: 1.2.3.4
      ansible_ssh_port: 22
      ansible_python_interpreter: "/usr/bin/python3"
      ansible_user: root
  children:
    master:
      hosts:
        host-1

Kontaktieren Sie uns

Unsere Cloud-Experten beraten Sie gerne und individuell.

Wir antworten in der Regel innerhalb weniger Stunden auf Ihre Nachricht.

Zu Gen-Z für E-Mail? Einfach mal Discord versuchen. Unter +49 800 000 3706 können Sie unter Angabe Ihrer Kontaktdaten auch einen Rückruf vereinbaren. Bitte beachten Sie, dass es keine Möglichkeit gibt, uns telefonisch direkt zu erreichen. Bitte gar nicht erst versuchen. Sollten Sie dennoch Interesse an synchroner Verfügbarkeit via Telefon haben, empfehlen wir Ihnen unseren Priority Support.