【问题标题】:output of unix command in chef recipe厨师食谱中 unix 命令的输出
【发布时间】:2017-02-23 02:18:32
【问题描述】:

我在厨师食谱中有一个execute 命令,我想将cwd 属性设置为unix 命令的输出。

execute 'run dynamically generated install file' do
    command 'make install'
    cwd '' # would like the output of `ls -Adrt /tmp/unixODBC.* | tail -n 1`
end

这可能吗?

【问题讨论】:

    标签: ruby unix chef-infra


    【解决方案1】:

    好的,所以终于可以在键盘上完整地写出来了。

    你所拥有的字面意思是:

    execute 'run dynamically generated install file' do
        command 'make install'
        cwd lazy { shell_out!('ls -Adrt /tmp/unixODBC.* | tail -n 1').stdout.strip }
    end
    

    但是这会比需要的速度慢得多,而且更容易出错,所以我建议用 Ruby 编写它:

    execute 'run dynamically generated install file' do
        command 'make install'
        cwd lazy { Dir['/tmp/unixODBC.*'].first }
    end
    

    这避免了产生一堆进程,而是直接执行相同的(我认为)逻辑。

    【讨论】:

    • 美丽。我最终使用了cwd lazy { Dir['/tmp/unixODBC.*'].sort_by{ |f| File.mtime(f) }.last + '/unixODBC-2.3.0' }。谢谢!!
    【解决方案2】:

    你应该可以这样做:

    execute 'run dynamically generated install file' do
        command 'make install'
        cwd `ls -Adrt /tmp/unixODBC.* | tail -n 1`
    end
    

    【讨论】:

    • 很简单。谢谢@eiko
    • 不要那样做。您在大厨资源中弄乱了 ruby​​ 代码。这可能会以多种方式失败。
    • 这是非常不推荐的,因为 Ruby 的命令执行非常容易出错,并且因为它没有错误处理失败
    • @Tensibai 同意,这样做不安全。
    • @coderanger 诚然,我在这里是作为一个非常了解 ruby​​ 的人,而不是一个非常了解厨师的人。感谢您让我知道 - 我正在研究更好的实现,如果其他人没有击败我,我会更新我的答案!
    【解决方案3】:

    这似乎超出了execute 块的范围。

    也许只使用ruby_block

    ruby_block 'run dynamically generated install file' do
        require 'mixlib/shellout'
        block do
            cmd = Mixlib::ShellOut.new('make install')
            cmd.run_command
            cwd = cmd.stdout
            # Do more stuff with cwd...
        end
    end
    

    【讨论】:

    • 我应该补充一点,execute 仅适用于您不必频繁交互的命令。
    • 这在大多数情况下也是不正确的,或者至少是矫枉过正。也不要直接使用类,使用 shell_out 方法包装器来获取一些常见的 Chef-y 行为。
    猜你喜欢
    • 2016-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-05
    相关资源
    最近更新 更多