【问题标题】:How do I pass parameters to a salt state file?如何将参数传递给盐状态文件?
【发布时间】:2021-01-29 08:17:36
【问题描述】:

我想使用盐状态文件创建一个组和用户,但我不知道组、gid、用户、uid、sshkey,直到我需要执行我想作为参数传递的盐状态文件。

我已阅读有关创建变量的 Pillar 的信息。如何在执行前创建柱子?

/srv/salt/group.sls:

{{ name }}:
  group.present:
    - gid: {{ gid }}
    - system: True

命令行:

salt 'SaltStack-01' state.sls group name=awesome gid=123456

【问题讨论】:

    标签: python salt-stack


    【解决方案1】:

    如果你真的想在命令上传递数据,你也可以这样做:

    {{ pillar['name'] }}:
      group.present:
        - gid: {{ pillar['gid'] }}
        - system: True
    

    然后在命令行你可以像这样传入数据:

    salt 'SaltStack-01' state.sls group pillar='{"name": "awesome", "gid": "123456"}'
    

    【讨论】:

    • 这是我多年前问这个问题时一直在寻找的答案。公认的答案可能是最佳实践。谢谢戴夫!
    【解决方案2】:

    您使用 Pillars 创建可以引用到 State 文件中的“字典”。我不确定我是否正确理解了您,但这里有一个示例说明您可以做什么:

    1. mkdir /srv/pillar/

    2. 创建/srv/pillar/groups.sls 并将类似的内容粘贴到其中:

      组:
        第一:1234
        第二:5678
      

      这些是您要创建的组的名称和 GID。

    3. 创建/srv/pillar/top.sls,以便您可以将此支柱应用于您的爪牙。这与 salt top 文件非常相似,因此您可以将其应用于所有 minions ('*') 或仅应用于其中一个 ('SaltStack-01'):

      基础:
        'hc01*':
          - 团体
      

      要测试它是否有效,您可以运行salt '*' pillar.items,您应该会在输出中的某处找到groups 支柱。

    4. 现在,您的 /srv/salt/group.sls 文件应如下所示:

      {% for group,gid in pillar.get('groups',{}).items() %}
      {{ group }}:
        group.present:
          - gid: {{ gid }}
      {% endfor %}
      

      这是一个 for 循环:for 每个 groupgid 在支柱 groups 中,完成其余的工作。所以基本上,你可以看它好像状态文件运行了两次:

      首先:
        group.present:
          - gid:1234
      

      然后:

      秒: group.present: - gid:5678

    这是从this guide 合并而来的。

    【讨论】:

      【解决方案3】:

      如果你不想使用Pillar
      你可以这样做:

      # /srv/salt/params.yaml
      
      name: awesome
      gid: 123456
      

      然后:

      # /srv/salt/groups.sls
      
      {% import_yaml "params.yaml" as params %}
      
      {{ params['name'] }}:
        group.present:
          - gid: {{ parmas['gid'] }}
          - system: True
      

      更多详情:doc

      【讨论】:

        【解决方案4】:

        另一种很好的传递方式(如果您不想使用支柱,也不想像其他答案所示那样创建文件) - 您可以将本地环境变量传递给 salt 并从 sls 文件中读取它,就像这个:

        命令:

        MYVAR=world salt 'SaltStack-01' state.sls somesalt   # Note the env variable passed at the beginning
        

        sls 文件:

        # /srv/salt/somesalt.sls
        
        foo:
          cmd.run:
            - name: |
                echo "hello {{ salt['environ.get']('MYVAR') }}"
        

        将打印到标准输出:

        hello world
        

        要知道的另一件好事是 env 变量也会传递到任何包含的盐状态。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-17
          • 1970-01-01
          • 2019-12-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多