gpt4 book ai didi

linux - 在运行列表中的 Chef Recipe 执行之间保持 $PATH 变量

转载 作者:太空宇宙 更新时间:2023-11-04 12:39:39 25 4
gpt4 key购买 nike

我们为一个节点设置了一个 Chef 运行列表,比方说,该节点由菜谱 A 和菜谱 B 组成。在方案 A 中,我们执行启动 script.sh 的命令资源,它使用自定义路径在目标机器上导出 $PATH 变量。

接下来,当配方 B 被执行时,它会寻找一个要启动的可执行文件,我们希望它可以执行它并查看 $PATH 中包含的路径。不幸的是,配方 B 中的 $PATH 变量丢失了配方 A 中所做的修改。

上下文是:在一台机器上,我们在特定路径中有一个 JVM(不在 $PATH 中)。使用配方 A,我们启动一个 script.sh,将 JVM bin 路径导出到 $PATH 中。然后在方法 B 中,我们使用一个 java 可执行文件(比方说,jar),所以我们希望它正在执行,查看我们之前在 $PATH 中导出的路径。但它不起作用。

我们希望将 JVM 路径临时设置到 $PATH 中,以便让配方 B 执行。我想我们不能使用任何 Chef 环境变量来实现这一点,因为在分布式场景中,JVM 路径可能因机器而异。

非常感谢。

更新:

Recipe A

mydir = "/path/to/jvm"
script_name = "script.sh"
sh = File.join(mydir,script_name).gsub("/","\/")
script_str = ". " + sh

# Launch script.sh in order to export Java to PATH
execute "ExecuteScript" do
command script_str
user "myuser"
group "mygroup"
only_if {File.exists?(File.join(mydir,script_name))}
end

很遗憾,我无法发布配方 B,但请记住它不可编辑,它只是执行“java”或“jar”(在 $PATH 中寻找它们)。

更新 2

我在配方 A 中通过以下设置解决了这个问题:

javapath = "/path/to/jvm/bin"
ENV['PATH'] = "#{ENV['PATH']}:" + javapath

通过这种方式,我在 Ruby 执行期间设置了环境变量 $PATH。这使得配方 B 能够看到该变量,从而执行所需的 bin(在我的例子中是 jar)。我不知道这是否是一个优雅的解决方案,但它对我有用。

最佳答案

execute a command resource that launch a script.sh, which export the $PATH variable on the target machine with a custom path.

此导出仅在 execute 资源中可用,因此对于您的脚本及其调用的任何内容,一旦资源结束,它就会被丢弃。

您的描述听起来好像您一开始做错了,但如果没有更多详细信息,很难为您的用例提供正确的建议。

关于linux - 在运行列表中的 Chef Recipe 执行之间保持 $PATH 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40637033/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com