Saltstackの柱から依存関係を構築する


7

Saltでダミー状態を作成して、柱から派生したリストから依存関係をプルしようとしています。

私のtop.slsファイルには、次のものが含まれています。

base:
  '*':
    - components

次に、でcomponents.sls私は持っています:

{% 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 %}

柱の内容を確認すると、次のことがわかります。

$ salt my-minion-id pillar.items

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

しかし、一連の状態を表示しようとすると、次のようになります。

$ salt my-minion-id state.show_sls components

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

...以上です。

私の究極の目標は、ここでは、私は役割ではなく、私の中の役割の割り当ての柱のうち詳細プルしようとしていますので、敵対的として手先を治療することであるfile_rootのをtop.sls。すべてのミニオンがfile_rootのコンテンツに完全にアクセスできることは私の理解です。敵対的なミニオンが特定のファイアウォールや無関係なノードのサービスを知りたくないのです。

編集:

リストを使用していたため、私のピラー構造がピラーのマージをサポートしていないことを発見したので、値のないディクテーションを使用するピラー構造に切り替えました。

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

1
ソルトスタックに関するかなり高度な質問、Chefユーザーからの真の質問:ソルトはプッシュモデルとして理解していましたが、ノード(ミニオン?)はどうやってそれ自体を登録できますか?(それは好奇心の外にあります)
Tensibai

それを別の質問として尋ねてください。NDAに反発することなく満足のいく答えをまとめられるかどうかを確認します。
Michael Mol

十分に公平ですが、ソルトスタックの最後の検査は私の要件(特にWindowsボックス)を満たしていなかったため、公平なものを作成できるかどうか、そして本当に時間があるかどうかを確認します。私が明らかな何かを見逃した場合に備えて、コメントとして試みました:)
Tensibai

チャットの担当者がまだいないので、これで十分です。しかし、簡単に言うと、ノードで実行されているソルトミニオンは、DNSを使用してソルトマスターがどこにあるかを見つけ、マスターに到達します。マスターは、誰かがそれを受け入れるまで、ミニオンのキーを保留キューにダンプします。
Michael Mol 2017

1
これまで私はチャットのための協会のボーナス作品を知っているように、あなたはこれまで20の上に持っている、これは動作するはずのためになるようDevOpsチームチャットポインタの手下のために:)おかげで自分自身を登録する依頼することができ、私はこのアプローチを逃していた
Tensibai

回答:


4

このテンプレート化されたSLSファイルは素晴らしい働きをします:

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

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

{% endif %}

ただし、私の柱のキー構造を変更する必要があります。元の質問から、構造は次のようになります。

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

代わりに、次のようにする必要があります。

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

これa-dependency-nameはdictであり、単一のキー/値を持っていることに注意してくださいNone。したがって、ピラーSLSファイルは、

components:
  - a-dependency-name

components:
  a-dependency-name: ~

値のない辞書を使用せずに(したがって.keys()、テンプレートからを取り除く)代わりにリストを使用できますが、その場合components、複数の異なる柱からをマージすることはできません。ソルトが適用する各ピラーcomponentsは、以前のキーを上書きし、最後に読み取られたピラーが優先されます。あなたは(私たちは柱をマージしたい場合はされているここでは、ロールベースの割り当てについて話)、これは必要な構造であるように思われます。

それで、出力salt my-minion-id state.show_sls componentsは正しいです:

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

pillar.items()Jinjaでは、テンプレートはとまったく同じではありませんsalt.pillar.items()pillar.ls()たとえば、を使用しようとすると、次のエラーが表示される場合があります。

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

それがsalt.、Jinjaが提供する暗黙のプレフィックスショートカットを避けるべきか、代わりに{% if pillar['components'] is defined %}(助言として@brouschに感謝)のような構成を使用するべきかどうか、私には言えません。


3

次のようにすることもできます:

{% 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 %}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.