【问题标题】:Strange behavior with ruby_block resource in ChefChef 中 ruby​​_block 资源的奇怪行为
【发布时间】:2026-01-14 17:25:01
【问题描述】:

我在食谱末尾有两个红宝石块:

ruby_block 'set permissions for app dir' do
  block do
    require 'fileutils'
    FileUtils.chown_R 'user01', 'user01', '/mnt/app/'
  end
  action :run
end

ruby_block 'configure node app session' do
  block do
    cmd = "sudo su - user01 -c \"/mnt/app/http-app-/bin/app create /mnt/app/http-app/#{node['hostname']}\" && sudo su -c 'systemctl enable app' && sudo su -c 'systemctl start app'"
exec(cmd)
  end
  action :run
  not_if "stat -c %U /mnt/app/#{node['hostname']} |grep app"
end

发生了一些奇怪的事情。一,我不能在最后一个块之后添加任何代码......如果添加它就不会运行。第二,当食谱运行时,如果运行失败或成功,食谱永远不会结束。第二次引导系统将证明成功完成......但是 ssh'ing 到盒子并运行 chef-client 会返回一个空的运行列表。

谁能解释这种行为?我该如何解决?

【问题讨论】:

    标签: ruby chef-infra chef-recipe


    【解决方案1】:

    exec() 不是你想的那样。这是一个 Ruby 核心方法,它调用实际的 exec() 系统调用,它用新的东西替换了当前进程。你想要的是我们的 shell_out!() 助手,它运行一个子命令并返回结果并作为对象。

    【讨论】: