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