Konstruieren von Abhängigkeiten von einer Säule in Saltstack

7

Ich versuche, einen Dummy-Status in Salt zu erstellen, um Abhängigkeiten aus einer Liste abzurufen, die von einer Säule abgeleitet wurde.

In meiner top.slsDatei habe ich:

base:
  '*':
    - components

Dann habe components.slsich:

{% if 'components' in pillar.items() %}
include:
{% for component in pillar.get('components',[]) %}
  - {{ component }}
{% endfor %}
{% endif %}

{% if 'components' in pillar.items() %}
components:
  require:
{% for component in pillar.get('components',[]) %}
    - {{ component }}
{% endfor %}
{% endif %}

Wenn ich den Inhalt der Säule überprüfe, sehe ich:

$ salt my-minion-id pillar.items

my-minion-id:
    ----------
    components:
        - a-dependency-name

Aber wenn ich versuche, die Menge der Zustände zu sehen, sehe ich:

$ salt my-minion-id state.show_sls components

my-minion-id:
    ----------

...und das ist es.

Mein ultimatives Ziel hier ist es, den Diener als feindlich zu behandeln, also versuche ich, Rollendetails aus den Säulen zu ziehen, anstatt Rollen in meinen file_rootzuzuweisen top.sls. Nach meinem Verständnis hat jeder Minion vollen Zugriff auf den Inhalt von file_root, und ich möchte nicht, dass ein feindlicher Minion die spezifische Firewall oder die Dienste eines nicht verwandten Knotens kennt.

Bearbeiten:

Ich stellte fest, dass meine Säulenstruktur das Zusammenführen von Säulen nicht unterstützte, da Listen verwendet wurden, und wechselte daher zu einer Säulenstruktur, die keine Wertvorgaben verwendete:

my-minion-id:
    ----------
    components:
        ----------
        a-dependency-name:
            None
Michael Mol
quelle
1
Ziemlich fortgeschrittene Frage zum Salzstapel, echte Frage eines Chefkochbenutzers: Ich hatte Salz als Push-Modell verstanden. Wie konnte sich ein Knoten (Minion?) Registrieren? (Das ist nur aus Neugier)
Tensibai
Stellen Sie das als separate Frage, und ich werde sehen, ob ich eine zufriedenstellende Antwort zusammenstellen kann, ohne gegen meine NDA zu stoßen.
Michael Mol
Fair genug, aber meine letzte Inspektion des Salzstapels entsprach nicht meinen Anforderungen (insbesondere an Windows-Boxen), sodass ich sehen werde, ob ich etwas unvoreingenommenes machen kann und ob ich wirklich Zeit dazu habe. Versucht als Kommentar nur für den Fall, dass ich etwas Offensichtliches verpasst habe :)
Tensibai
Ich habe noch nicht genug Repräsentanten für den Chat, also muss das reichen. Aber kurz gesagt: Ein Salt Minion, der auf einem Knoten ausgeführt wird, verwendet DNS, um herauszufinden, wo sich sein Salt Master befindet, und erreicht den Master. Der Meister wird den Schlüssel des Dieners in eine ausstehende Warteschlange werfen, bis jemand ihn akzeptiert.
Michael Mol
1
Soweit ich weiß, funktioniert der Assoziationsbonus für den Chat, Sie haben weit über 20, also sollte dies für den DevOps-Chat funktionieren :) Vielen Dank für den Hinweis, dass Schergen sich selbst registrieren lassen können. Ich hatte diesen Ansatz verpasst
Tensibai

Antworten:

4

Diese SLS-Vorlagendatei funktioniert hervorragend:

{% if 'components' in salt.pillar.items() %}

include:
{% for component in salt.pillar.get('components').keys() %}
  - {{ component }}
{% endfor %}

{% endif %}

Es erfordert jedoch eine Änderung meiner Säulenschlüsselstruktur. Aus der ursprünglichen Frage geht hervor, dass die Struktur wie folgt aussieht:

my-minion-id:
    ----------
    components:
        - a-dependency-name

Stattdessen muss es sein:

my-minion-id:
    ----------
    components:
        ----------
        a-dependency-name:
            None

Beachten Sie, dass dies a-dependency-namejetzt ein Diktat ist und einen einzelnen Schlüssel / Wert hat None. Daher muss die Säule SLS-Datei von ändern

components:
  - a-dependency-name

zu

components:
  a-dependency-name: ~

Sie können zwar keine wertlosen Wörterbücher verwenden (und damit die .keys()in der Vorlage enthaltenen Wörterbücher entfernen ) und stattdessen Listen verwenden. Wenn Sie dies jedoch tun, können Sie die Wörterbücher nicht componentsaus mehreren verschiedenen Säulen zusammenführen. Jede Säule, die Salt anwendet, überschreibt den componentsSchlüssel der vorherigen und die zuletzt gelesene Säule gewinnt. Wenn Sie Säulen zusammenführen möchten (wir sind im Gespräch über rollenbasierte Zuordnung, hier), scheint dies das notwendige Konstrukt zu sein.

Damit ist die Ausgabe von salt my-minion-id state.show_sls componentsdann korrekt:

$ salt my-minion-id state.show_sls components
my-minion-id:
    ----------
    a-dependency-name:
      ----------
      ...

pillar.items()in Jinja stellt sich heraus, dass Vorlagen nicht ganz gleichwertig sind mit salt.pillar.items(); Wenn Sie beispielsweise versuchen pillar.ls(), Folgendes zu verwenden, wird möglicherweise der folgende Fehler angezeigt:

Rendering SLS 'base:components' failed: Jinja variable 'salt.pillar object' has no attribute 'ls'

Ob dies bedeutet, dass man die implizite salt.Präfixverknüpfung, die Jinja bereitstellt, vermeiden oder stattdessen ein Konstrukt wie {% if pillar['components'] is defined %}(danke, @brousch, für den Rat) verwenden sollte, kann ich nicht sagen.

Michael Mol
quelle
3

Sie können es auch so machen:

{% if pillar['components'] is defined %}
include:
{% for component in pillar['components'] %}
 - {{ component }}
{% endfor %}
{% endif %}

{% if pillar['components'] is defined %}
components:
  require:
{% for component in pillar['components'] %}
 - {{ component }}
{% endfor %}
{% endif %}
brousch
quelle