如何编写Salt State的if判断:按主机名匹配Salt Master文件选配置
解决Salt State中根据主机配置文件存在性选择源的问题
嘿,我来帮你搞定这个需求!你想要实现的是当Salt Master上存在对应主机名的自定义配置文件时使用它,否则用默认配置,核心问题是在Jinja模板里正确判断Master上的文件是否存在——这里不能直接用shell的test -f,因为那是在Minion本地执行的,我们需要用Salt自带的模块来检查Master文件服务器上的文件。
完整实现代码
这里有两种写法,你可以选自己习惯的:
写法一:三元运算符简洁版
{% set hostname = salt['grains.get']('host') %} {% set custom_config = 'salt://ntpd/ntp.conf_' ~ hostname %} {% set default_config = 'salt://ntpd/ntp.conf' %} ntpd-config: file.managed: - name: /etc/ntp.conf - source: {{ custom_config if salt['file.exists'](custom_config) else default_config }} - user: root - group: root - file_mode: 644
写法二:if-else块清晰版
{% set hostname = salt['grains.get']('host') %} {% set custom_config_path = 'salt://ntpd/ntp.conf_' ~ hostname %} ntpd-config: file.managed: - name: /etc/ntp.conf - user: root - group: root - file_mode: 644 {% if salt['file.exists'](custom_config_path) %} - source: {{ custom_config_path }} {% else %} - source: salt://ntpd/ntp.conf {% endif %}
关键知识点解释
- 获取主机名:用
salt['grains.get']('host')读取Minion的主机名grain,如果你的环境里主机名存在hostname这个grain里,改成salt['grains.get']('hostname')即可。 - 检查Master上的文件:
salt['file.exists'](custom_config_path)是核心——这个Salt模块会直接和Master通信,检查指定salt://路径下的文件是否存在,完美替代本地的test -f。 - 路径拼接:用
~符号在Jinja里拼接字符串,把主机名和配置文件前缀组合成自定义配置的路径。
注意事项
- 确保Minion有权限访问Salt Master文件服务器上的
ntpd目录; - 如果自定义配置文件名的规则有变化,比如带域名后缀,只需要调整
custom_config_path的拼接逻辑即可; - 测试的时候可以先用
salt 'minion-id' file.exists salt://ntpd/ntp.conf_yourhostname命令验证文件是否能被Minion检测到。
内容的提问来源于stack exchange,提问作者matze502
相关产品推荐
相关产品推荐

