Хорошо, я использую соль для управления параметрами загрузки 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