Saltstack通过for循环将变量附加到自身

Saltstack通过for循环将变量附加到自身

好的,我在 Linux 中使用 salt 来管理我的 grub.conf 启动选项(最重要的是隔离的 CPU),并且有一个基本公式来实现这一点:

{% set cpu1 = (grains['num_cpus']-1) %}
{% set cpu2 = (grains['num_cpus']-2) %}
{% set cpu3 = (grains['num_cpus']-3) %}
{% set cpu4 = (grains['num_cpus']-4) %}
{% set cpu5 = (grains['num_cpus']-5) %}
{% set cpus = cpu5|string + ',' + cpu4|string + ',' + cpu3|string + ',' + cpu2|string + ',' + cpu1|string %}
{% set bootoptions = 'nosoftlockup isolcpus=' + cpus + ' intel_idle.max_cstate=0 idle=poll processor.max_cstate=0 mce=ignore_ce crashkernel=auto audit=1' %}

insert-options:
  file.replace:
    - name: /boot/grub/grub.conf
    - pattern: (kernel \/vmlinuz-.* quiet)(.*)
    - repl: '\1 {{ bootoptions }}'

唯一的问题是我必须有一个手动的 CPU 字符串,这意味着如果我想在列表中添加一个额外的 CPU,或者删除一个,我必须写入额外的字符串位,或者删除字符串位。

最理想的情况是这样的:

{% for x in range(grains['num_cpus']-5,grains['num_cpus']-1) %}
{% set cpus = cpus + ',' + x|string %}
{% endfor %}

我尝试了两种方法,第一种方法就像上面写的一样,它给了我一个cpus未定义的错误,因为第一个实例仍在尝试将自身设置为自身,这是可以理解的。

我的第二次尝试添加了一个循环外声明来开始工作:

{% set cpus = (grains['num_cpus']-6) %}
{% for x in range(grains['num_cpus']-5,grains['num_cpus']-1) %}
{% set cpus = cpus + ',' + x|string %}
{% endfor %}

但最终却cpus 仅有的包含循环外声明值的值。

有没有办法使这个循环过程起作用?

这会产生巨大的差异,特别是因为我可以轻松地将偏移量数字更改(-1,-5)为支柱项目,从而为可能需要不同数量的独立 CPU 的不同服务器提供轻松定制的值。

答案1

我不建议使用 Jinja2 来完成某些复杂的任务。最好选择一个合适的渲染器以保持代码清晰且可读性。您可以选择例如Python语言而不是默认语言Jinja2 + YAML来完成任务:

#!py

def run():
  config = {}
  cpus = ''

  for x in range(__grains__['num_cpus'] - 5, __grains__['num_cpus'] - 1 ):
    cpus += ',' + str(x)

  config['echo ' + str(cpus)] = {
    'cmd': [
      'run'
    ]
  }

  return config

相关内容