【发布时间】:2020-08-23 07:29:01
【问题描述】:
您好,我正在尝试将 shell 脚本的输出设置为厨师食谱中的变量,但我看不到该变量设置不正确;我尝试了三种方式:
1.) 直接如下设置:
password = "`/home/#{OWNER}/fox/get_secretsmanager_pwd.sh '#{KEYSTORE_NAME}' 'password'`"
2.) 尝试以下方法:
ruby_block 'Get ' do
block do
node.set['test']['password'] = "`/home/#{OWNER}/fox/get_secret_pwd.sh '#{KEYSTORE_NAME}' 'password' `"
Chef::Log.info("password: #{node['test']['password']}")
end
action :run
end
3.) 也尝试了以下方法:
ruby_block 'Get ' do
block do
Chef::Resource::RubyBlock.send(:include, Chef::Mixin::ShellOut)
command = "`/home/#{OWNER}/fox/get_secrets_pwd.sh '#{KEYSTORE_NAME}' 'password' `"
command_out = shell_out(command)
node.set['test']['password'] = command_out.stdout
Chef::Log.info("password2: #{node['test']['password']}")
end
action :run
end
此脚本 (/home/#{OWNER}/fox/get_secrets_pwd.sh '#{KEYSTORE_NAME}' 'password' ) 将从 DB 返回文本。
【问题讨论】:
-
你引用了反引号,所以它们没有调用命令。
-
您的 foodcritic 规则告诉您不要使用
node.set,因为这在node.default和node.override不使用的节点上仍然存在。您永远不应该使用“node.set”(并且该 API 在 Chef 13+ 中已被删除)。此外,由于 Chef 节点可以读取其他节点的节点数据,因此您写入该节点的密码值会有效地发布到您的整个组织以及其中的任何受损服务器。您应该使用普通的 ruby 变量,或者应该使用node.run_state['test']['password']来将该值保持在节点本地而不是发布它。
标签: ruby shell chef-infra