如何在Jinja2模板中迭代Ansible传递的配置字典生成nrpe.cfg
解决Jinja2模板迭代Ansible字典生成nrpe.cfg的问题
嘿,我来帮你搞定这个迭代字典的问题!首先得先明确你的Ansible变量结构——毕竟NRPE配置大多是围绕监控命令来的,假设你传递的字典大概是这个样子:
nrpe_commands: check_cpu: command_line: "/usr/lib/nagios/plugins/check_cpu -w 70 -c 90" check_mem: command_line: "/usr/lib/nagios/plugins/check_mem -w 80 -c 95"
接下来分几种常用的迭代场景,对应不同的NRPE配置需求:
1. 同时获取命令名和配置内容(最常用)
如果你的目标是生成command[<命令名>]=<命令内容>这种标准NRPE命令行,直接用dict.items()就能同时拿到键(命令名)和值(对应的命令配置):
# 这是你的nrpe.cfg.j2模板内容 {% for command_name, command_details in nrpe_commands.items() %} command[{{ command_name }}]={{ command_details.command_line }} {% endfor %}
生成后的nrpe.cfg会是这样:
command[check_cpu]=/usr/lib/nagios/plugins/check_cpu -w 70 -c 90 command[check_mem]=/usr/lib/nagios/plugins/check_mem -w 80 -c 95
2. 只迭代命令名称(单独处理时用)
要是你只需要先拿到命令名,再单独调取对应的配置,直接迭代字典本身就行——Jinja2里迭代字典默认是遍历它的键:
{% for command_name in nrpe_commands %} # 这里可以加一些注释或者额外处理 command[{{ command_name }}]={{ nrpe_commands[command_name].command_line }} {% endfor %}
3. 处理带额外参数的嵌套字典
如果你的配置里还有timeout这类额外参数,比如变量是这样的:
nrpe_commands: check_load: command: "/usr/lib/nagios/plugins/check_load -w 15,10,5 -c 30,25,20" timeout: 10
模板里可以这么写,判断参数是否存在再生成对应配置:
{% for cmd_name, cmd_config in nrpe_commands.items() %} command[{{ cmd_name }}]={{ cmd_config.command }} {% if cmd_config.timeout is defined %} timeout[{{ cmd_name }}]={{ cmd_config.timeout }} {% endif %} {% endfor %}
为啥之前会报错?给你排查方向
如果之前迭代时出错,大概率是这几个坑:
- 变量名拼错了:仔细核对模板里的变量名和Ansible传递的是不是完全一致,比如别把
nrpe_commands写成nrpe_command - 变量类型不对:先用Ansible的debug模块确认变量是不是字典:
ansible -m debug -a "var=nrpe_commands" <你的目标主机> - 迭代方式错了:比如直接
for item in nrpe_commands却把item当成配置值用,这时候item其实是字典的键,自然会报错
内容的提问来源于stack exchange,提问作者Georg Gutsche
相关产品推荐
相关产品推荐

