chef-client执行cookbook_file资源时未生成目标文件反而创建同名文件夹的问题
问题成因
核心故障点:Recipe存放位置完全不符合Chef cookbook规范
- Chef 只会加载cookbook根目录下
recipes/文件夹内的.rb文件作为可执行的runlist recipe。放在files/目录下的所有文件都属于静态资源(仅供cookbook_file、template等资源引用的源内容),不会被识别为可执行代码,也不会在chef-client运行时被加载。 - 你还出现了路径拼写错误:将
recipes错写为resipes,即便放在根目录下,这个拼写错误的目录也不会被Chef识别为合法的recipe目录。 - 最终chef-client运行时执行的是cookbook根目录下原有
recipes/filebeat.rb的旧内容(大概率是之前测试时误写的directory资源,正好指向/etc/filebeat/filebeat.yml路径),因此才会创建出名为filebeat.yml的目录,而非预期的配置文件。
其他需修正的附带问题
- 配置文件权限设置不合理:
0755是可执行文件的权限位,.yml配置文件一般应设置为0644,避免不必要的可执行权限带来的安全风险。 ignore_failure true会屏蔽资源执行时的所有错误,不利于排查问题,若非特殊场景建议移除。
修正步骤
- 将你编写的
cookbook_file资源代码移动到cookbook根目录下的recipes/filebeat.rb文件中,覆盖原有旧内容。 - 修正代码中的mode参数为
0644,按需移除ignore_failure true。 - 重新上传cookbook到Chef Server/本地缓存后,再次执行chef-client即可正常生成文件。
内容的提问来源于stack exchange,提问作者Boris Becker
相关产品推荐
相关产品推荐

