【发布时间】: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-1523、CHEF-2288),但我无法在新的(基于 github 的)问题跟踪器中找到这两个问题的更新。
在这类情况下,厨师的最佳做法是什么?
非常感谢任何提示、提示或建议!
- 信息学家
【问题讨论】:
标签: bash shell chef-infra