Назад | Перейти на главную страницу

Saltstack Добавление переменной к себе через цикл for

Хорошо, я использую соль для управления параметрами загрузки grub.conf (в первую очередь, изолированным процессором) в Linux, и у меня есть базовая формула для этого:

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

Единственная проблема с этим заключается в том, что у меня должна быть ручная строка процессоров, что означает, что если, скажем, я хочу добавить дополнительный процессор в список или удалить его, я должен написать дополнительные строковые биты или удалить строковые биты.

В идеале было бы что-то вроде:

{% 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) для основных элементов, чтобы получить легко настраиваемые значения для разных серверов, которым может потребоваться разное количество изолированных процессоров.

Я бы не рекомендовал использовать 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