我正在尝试在Salt中创建一个虚拟状态,以从衍生自支柱的列表中提取依赖项。

在我的top.sls文件中,我有: >
然后在components.sls中,我有:

base:
  '*':
    - components


检查支柱内容时,看到: br />
但是当我尝试查看状态集时,我会看到:

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


...就是这样。

在这里,我的最终目标是将奴才视为敌对对象,因此我试图从角色中提取角色细节,而不是在file_roottop.sls中分配角色。据我了解,每个小兵都可以完全访问file_root的内容,我不希望敌对的小兵知道任何无关节点的特定防火墙或服务。

编辑:

我发现我的支柱结构不支持支柱合并,因为它使用列表,所以我切换到使用无值字典的支柱结构:

$ salt my-minion-id pillar.items

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


评论

关于盐堆栈的相当高级的问题,是来自Chef用户的真实问题:我已经将盐理解为推送模型,节点(minion)如何注册自己? (这只是出于好奇)

将其作为一个单独的问题提出,我将看看是否能在不违背我的NDA的前提下提出满意的答案。

足够公平,但是我上次检查盐堆的方法不符合我的要求(特别是在Windows盒子上),所以我将看看我是否可以使事情变得公正,是否真的有时间。尝试作为评论,以防万一我错过了明显的东西:)

我没有足够的代表可以聊天,所以必须这样做。但简单来说:在节点上运行的盐小仆将使用DNS来查找其盐主服务器所在的位置,并将与该主服务器联系。主人会将小仆的钥匙转储到待处理的队列中,直到有人接受为止。

据我所知,关联奖励适用于聊天,您已经超过了20个,因此它应该适用于DevOps聊天:)感谢小兵可以要求自己注册,我错过了这种方法

#1 楼

这个模板化的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现在是字典,并且具有单个键/值None。因此,支柱SLS文件需要从

components:
  - a-dependency-name


更改为

components:
  a-dependency-name: ~


不使用无值字典(从而摆脱模板中的.keys()),而是使用列表,如果这样做,则无法合并来自多个不同支柱的components; Salt应用的每个支柱将覆盖前一个的components键,最后一个支柱将获胜。如果您想合并支柱(我们在这里讨论基于角色的分配),则这似乎是必要的构造。 >
$ salt my-minion-id state.show_sls components
my-minion-id:
    ----------
    a-dependency-name:
      ----------
      ...


Jinja模板中的salt my-minion-id state.show_sls components证明不完全等同于pillar.items();例如,如果尝试使用salt.pillar.items(),则可能会看到以下错误:

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


这是否意味着应该避免Jinja提供的隐式pillar.ls()前缀快捷方式,或者改为使用我不能说类似salt.的结构(感谢@brousch,作为建议)。

#2 楼

您也可以这样做:

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