# Salt States

Sates sind fertige "Rezepte", die Sie in Form von Dateien auf dem Master anlegen. Einzelne oder alle States werden auf Minions ausgerollt und sorgen dafür, dass der Minion einen definierten Zustand erreicht.

### States verwenden

Die aktuellen Versionen von Salt verwenden das Verzeichnis `/srv/salt` als Root-Ordner für States.&#x20;

Legen Sie das Verzeichnis `/srv/salt` an und speichern Sie die folgende Datei:

{% code title="/srv/salt/test.sls" %}

```yaml
date>/tmp/salt.date:
  cmd.run:
    - runas: root
```

{% endcode %}

Starten die den ersten Rollout&#x20;

```bash
salt '*' state.apply test
```

#### File-Root ändern

{% hint style="info" %}
**Schützen sie das States Verzeichnis maximal.** Wem es gelingt eine Datei im States-Root-Verzeichnis abzulegen, kann die volle Kontrolle über alle Minions übernehmen.

Aus diesem Grund sollte der Salt-Master auf einem dedizierten Host installiert werden, auf dem nur Salt-Administratoren Zugang haben.
{% endhint %}

States bedürfen keiner speziellen Aktivierung. Die Standard-Installation hat States bereits aktiviert.

Falls Sie müssen nicht das Standard-Verzeichnis verwenden möchten, geben sie dem Salt-Master  bekannt geben, in welchem Verzeichnis Sie die State-Definitionen speichern möchten. Dazu erstellen Sie die Datei `/etc/salt/master.d/file_roots.conf` und tragen folgendes ein:

{% code title="/etc/salt/master.d/file\_roots.conf" %}

```
file_roots: 
  base:
    - /srv/salt
```

{% endcode %}

Legen Sie das Verzeichnis an und starten Sie den Master neu.

```bash
mkdir /srv/salt
systemctl restart salt-master
```

### States anwenden

#### Push: Vom Master zu den Minions

Die in einer State-Datei definierten Zustände werden wie folgt angewenden bzw. ausgerollt:

```
root@salt-master:~# salt '*' state.apply <STATE>
root@salt-master:~# salt '*' state.apply <DIR>.<STATE>
```

Die Endung `.sls` wird nicht mit angegeben. Ordner-Hierarchien werden mit `.` und nicht mit `/` angeben. `salt '*' state.apply webserver.apache` rollt die State-Datei `/srv/salt/webserver/apache.sls` oder die Datei `/srv/salt/webserver/apache/init.sls` aus.<br>

🙋 Befindet sich in einem Ordner eine Datei `init.sls` kann `state.apply` "auf den Ordner"  angewendet werden und `init.sls` wird als Einstieg verwendet.

#### Pull: Minions "ziehen" vom Master

Das Ausrollen eines States kann auch vom Minion veranlasst werden.

```
root@minion:~# salt-call state.apply <STATE>
root@minion:~# salt-call state.apply <DIR>.<STATE>
```

#### Gesprächigkeit

Wenn Sie weniger oder mehr Output möchten, verwenden Sie die folgenden Optionen:

```
root@salt-master:~# salt '*' state.apply <STATE> -l quiet --state-verbose=false
root@salt-master:~# salt '*' state.apply <STATE> --state-output=changes
root@salt-master:~# salt '*' state.apply test --out=table
root@minion:~# salt-call -l debug state.apply <STATE>
```

{% hint style="info" %}
Wenn Sie den Fehler in einer SLS-Datei nicht finden können, oder wenn Sie genau sehen möchten, in welche System-Kommandos ein Minion einen State übersetzt, nutzen Sie `salt-call -l debug` auf einem Minion. An diese Debug-Informationen kommt nur der Minion dran und diese werden nicht zum Master übertragen.&#x20;
{% endhint %}
