【问题标题】:What is the "chef intended" method to perform an action like installing a vagrant plugin?执行诸如安装流浪插件之类的操作的“厨师意图”方法是什么?
【发布时间】:2017-09-20 12:25:57
【问题描述】:

TL;DR:

当执行取决于以特定用户身份运行并具有特定用户的环境时,处理 chef execute 块的适当方法是什么?


我正在使用 chef-solo 并编写一本食谱来安装(除其他外)vagrant 和多个 vagrant 插件。安装 vagrant 插件的命令格式如下:vagrant plugin install [plugin-name]。尝试使用以下代码:

execute "Install Vagrant plugin #{plugin}" do
   command "vagrant plugin install #{plugin}"
end

...导致插件安装在/root/.vagrant.d/gems/2.3.4/gems/plugin-1.0.0。尝试指定用户运行的版本:

execute "Install Vagrant plugin #{plugin}" do
   user "#{user}"
   group "#{user}"
   command "vagrant plugin install #{plugin}"
end

...导致用户 #{user} 由于缺乏足够的权限而无法执行命令 - 进程尝试将插件安装在 /root/.vagrant.d 而不是 /home/#{user}/.vagrant.d。我还尝试了在指定用户/组之上添加environment 指令的进一步版本:

execute "Install Vagrant plugin #{plugin}" do
   environment ({ 'HOME' => ::Dir.home(user), 'USER' => user })
   user "#{user}"
   group "#{user}"
   command "vagrant plugin install #{plugin}"
end

...导致插件按预期安装,但我不认为这是处理此类操作的预期方法 - 特别是因为此解决方案仅在有问题的用户在编译时存在时才有效,这在我的情况下,它不会(可以解决在编译时不存在的用户将.run_action(:create) 添加到创建相关用户的部分)。

我的理解是这涉及到厨师运行执行命令作为登录或非登录shell的问题,但我只是几乎不知道两者之间的区别。

我发现一个服务器故障question 回答了这个问题,但是最近的活动是在 4 年前。旧的 chef 问题跟踪器包含两个问题(CHEF-1523CHEF-2288),但我无法在新的(基于 github 的)问题跟踪器中找到这两个问题的更新。

在这类情况下,厨师的最佳做法是什么?

非常感谢任何提示、提示或建议!

  • 信息学家

【问题讨论】:

    标签: bash shell chef-infra


    【解决方案1】:

    你会延迟主目录的计算直到收敛时间:

    execute "vagrant plugin install #{plugin}" do
      user user
      group user
      environment lazy { {'HOME' => Dir.home(user)} }
    end
    

    我们已经讨论过自动设置组和一些常见的环境变量,我已经在 https://github.com/poise/poise/blob/master/lib/poise/utils/shell_out.rb 中实现了一个帮助程序版本,但它还没有被反向移植到 Chef 核心。

    【讨论】:

    • 感谢 coderanger,这是非常有价值的反馈。我不知道属性进行惰性评估的能力。这是我仍然可能会非常谨慎地使用的东西,但在你的老花篮中拥有它是件好事。非常感谢!
    猜你喜欢
    • 2019-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多