好的,我在 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