# GIT

{% hint style="warning" %}
Die Git-Integration von Salt war und ist eine **"wackelige" Sache**. Die Installation der benötigten Python-Module ist äußerst fragil. Auf einigen Distributionen, wie z.B. Ubuntu 24.04 gelingt die Installation nicht. Die [offizielle Dokumentation](https://docs.saltproject.io/en/latest/topics/tutorials/gitfs.html) ist veraltet. Diese bezieht sich auf eine Salt Version älter 3006 als Salt noch Python aus dem Betriebssystem verwendete.
{% endhint %}

### Pygit installieren

```
apt install libgit2-dev
salt-pip install pygit2==1.6.1 --no-deps
```

Seit Version 3006 verwendet Salt nicht mehr die Pytoninstallation des Betriebssystems. Im Ordner `/opt/saltstack/salt/lib/` verwaltet Salt seine [eigene Pythonversion](https://docs.saltproject.io/salt/install-guide/en/latest/topics/upgrade-to-onedir.html). Deshalb müssen Sie die für den Salt-Master benötigte Python-Erweiterung mit dem Kommando `salt-pip` installieren.

### Schlüssel erzeugen

```
mkdir /etc/salt/git.keys.d 
ssh-keygen -N "" -t ecdsa -C "master@salt" \
-f /etc/salt/git.keys.d/master
chmod 0600 /etc/salt/git.keys.d/master
```

{% hint style="info" %}
Verwenden Sie **edsa**-Keys und nicht ed25519.
{% endhint %}

### Master mit Git verbinden

{% code title="/etc/salt/master.d/git.conf" %}

```yaml
fileserver_backend:
  - gitfs

gitfs_remotes:
  - git@(bitbucket.org|github.com):<USERNAME>/<REPO>.git:
    - privkey: /etc/salt/git.keys.d/master
    - pubkey: /etc/salt/git.keys.d/master.pub 
    - root: states     # use subfolder
    - base: <BRANCH>   # set the branch
```

{% endcode %}

Hinterlegen Sie den Public Key im Git-Server, wenn möglich, als Read-only -Zugang.&#x20;

Bei **Bitbucket** werden Read-only Zugänge über Access-Keys pro Repository verwaltet.&#x20;

In **GitHub** hinterlegen Sie den öffentlichen Schlüssel als sogenannten `Deploy Key`. Dazu klicken Sie innerhalb des Repositorys auf `Settings`, und dann auf der linken Seite auf `Deploy Keys`. Oben rechts finden Sie dann den Knopf `Add Deploy Key`. Fügen Sie per Copy & Paste den Inhalt von `/etc/salt/git.keys.d/master.pub` ein.

<div><img src="/files/Azw1K6xXPN8NiT3B0XoW" alt="Bitbucket Read-Only-Zugang"> <figure><img src="/files/hiIVczmVDNKfZsG2gF0Q" alt=""><figcaption><p>Deploy Keys bei GitHub</p></figcaption></figure></div>

Mit dem Kommando `salt-run fileserver.file_list` kontrollieren Sie, ob die States aus dem Git-Repository verfügbar sind.

{% hint style="info" %}
**Warten bitte!** Änderungen stehen erst einige Sekunden nach einem Commit auf dem Salt-Master zur Verfügung. Ungeduldige können mit `salt-run fileserver.update` ein Update erzwingen.
{% endhint %}

Sollten die in Git gespeicherten States im Salt-Master nicht verfügbar sein, prüfen Sie, ob die SSH-Keys korrekt funktionieren.

```bash
cd /tmp
GIT_SSH_COMMAND='ssh -i /etc/salt/git.keys.d/master -o IdentitiesOnly=yes' \
git clone <YOUR-GIT-URL>
```

### Pillars per Git

Ergänzen Sie die ggf. schon existierende Konfiguration der sogenannten `ext_pillar`.&#x20;

{% code title="/etc/salt/master.d/ext\_pillar.conf" %}

```yaml
ext_pillar:
  - git:
    - git@(bitbucket.org|github.com):<USERNAME>/<REPO>.git:
      - privkey: /etc/salt/git.keys.d/master
      - pubkey: /etc/salt/git.keys.d/master.pub 
      - root: pillar

```

{% endcode %}

{% hint style="info" %}
ext\_pillar sind immer eine Ergänzung zu den Standard-Pillars. Wenn Pillars per Git verwaltet werden, sind Pillar im lokalen Dateisystem des Master ebenfalls aktiv. Wenn Sie Pillars ausschließlich per Git verwalten möchten, löschen Sie den Ordner `/srv/pillar`.
{% endhint %}

Pillars, welche in einem Git-Repository liegen, brauchen ebenfalls eine `top.sls` über die alle Pillar-Dateien inkludiert und Minions zugewiesen werden.

Pillars vom Type `file_tree` können[ (noch) nicht](https://github.com/saltstack/salt/issues/19263) in Git speichert werden.&#x20;

### Workflow <a href="#workflow" id="workflow"></a>

Nutzen Sie z.B. Forks oder Branches, damit jeder Mitarbeiter sein eigenes Repository mit States und Pillars zur Verfügung hat, um neue Konfigurationen zu erarbeiten und zu testen.

Jeder Mitarbeiter sollte über seinen eigenen lokalen Salt-Master verfügen, der an seinem persönlichen Fork "hängt". Nachdem neue States oder Pillars auf einem Fork getestet wurden, stellt der Mitarbeiter einen Pull-Request, damit die Änderungen in das produktive Master-Repository übernommen werden.

![](https://thorstenkramm.gitbooks.io/saltstack/content/assets/git-workflow.png)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://thorstenkramm.gitbook.io/saltstack/git.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
