Chef Recipe下symbolic link仅不存在时创建不生效问题咨询
Chef 实现仅当软链接不存在时才创建的解决方案
问题根因
Chef 默认的 link 资源是幂等的,默认行为会始终校验软链接的指向是否和配方中定义的 to 参数一致,如果不一致就会更新指向,只要判断逻辑有遗漏,就会触发校正操作。
之前写法的问题
- 第一个
only_if写法完全逻辑反转only_if的含义是条件成立时才执行资源,你写的only_if {test -L /home/user1/veera}意思是「只有目标路径已经存在软链接时,才执行创建/更新操作」,完全和需求相反,自然每次运行都会更新软链接。 - 第二个
not_if写法判断逻辑有遗漏
你用的not_if { File.symlink?('/home/user1/veera') }仅判断目标是否为软链接,如果目标路径存在但不是软链接(比如是普通文件、目录),File.symlink?会返回false,not_if条件不触发,Chef 仍会执行资源操作,覆盖现有内容。另外部分旧版本 Chef 中如果现有软链接指向和配方定义不一致,即使判断存在软链接也可能触发更新。
正确实现
方案1:只要目标路径存在任何内容就跳过(最常用,符合绝大多数需求)
只要/home/user1/veera路径下存在任何内容(软链接、普通文件、目录都算)就完全跳过执行,只有路径完全不存在时才创建软链接:
link '/home/user1/veera' do to '/usr/local/veera-10.0' action :create not_if { ::File.exist?('/home/user1/veera') } end
方案2:仅跳过已存在的软链接,允许覆盖其他类型的内容
如果你的需求是仅不修改已存在的软链接,目标路径如果是普通文件/目录可以覆盖为指定软链接,可以用这个写法:
link '/home/user1/veera' do to '/usr/local/veera-10.0' action :create force true not_if { ::File.symlink?('/home/user1/veera') } end
内容的提问来源于stack exchange,提问作者AWS_Lernar
相关产品推荐
相关产品推荐

