【问题标题】:Getting error setting and evaluating variables in Chef cookbook在 Chef 食谱中获取错误设置和评估变量
【发布时间】:2021-12-09 07:41:22
【问题描述】:

大家早上好......我想知道是否有人可以帮助我解决这个问题。

我正在编写一本 Chef 食谱,其中我从 AWS SecretsManager 检索值并将它们分配给配方中的变量,然后将它们传递给配置文件的模板。但是,我认为我遇到了执行顺序问题,在部署模板之前没有设置这些变量。所以,我可能有这样的事情:

lifecyclestage = shell_out("cat /etc/chef/bootstrap.json | jq -r '.policy_group'| tr -d '\n'").stdout
stackVersion = shell_out("cat /apps/chef-repo/stackVersion.txt | tr -d '\n'").stdout
webListenerPort = shell_out("aws secretsmanager get-secret-value --secret-id MySecret-#{lifecyclestage}-#{stackVersion} | jq -r '.SecretString' | jq -r '.listenerportweb'| tr -d '\n'").stdout

我收到一个错误:

undefined local variable or method `stackVersion' for cookbook

也许有更好的方法来做到这一点?或者也许有一种方法可以按正确的顺序设置和解析变量?

【问题讨论】:

  • 执行puts stackVersion 时是否显示该值?此外,这将有助于查看模板资源和模板本身的相关示例(在问题中)。
  • 没有。 Puts 似乎在配方执行任何操作之前执行。至于模板,我什至无法进入该块,因为我需要解析以前的变量才能设置我将传递给模板的变量。请注意,在我设置的第三个变量中,我实际上使用的是前两个变量的值。这就是让我感到震惊的原因。
  • 没错,Ruby 代码将在编译阶段运行。所以puts 会在Compiling cookbooks... 出现。而模板资源将在收敛时运行。

标签: ruby amazon-web-services chef-infra


【解决方案1】:

在 Chef 的一位员工的帮助下,我得以完成这项工作。最终,我最终创建了一个共享资源来将这些值设置为节点属性,然后在整个说明书中引用它们。

所以,我创建了libraries/shared.rb 并设置了一个函数:

def setEnvVars
  lifecyclestage = shell_out("cat /etc/chef/bootstrap.json | jq -r '.policy_group'| tr -d '\n'").stdout
  node.default['stackVersion'] = shell_out("cat /apps/chef-repo/stackVersion.txt | tr -d '\n'").stdout
  node.run_state['secretContent'] = JSON.parse(shell_out("aws secretsmanager get-secret-value --secret-id MySecret-#{node['lifecyclestage']}-#{node['stackVersion']}-secrets --region us-west-2 | jq -r '.SecretString'").stdout)
end

然后,我从 default.rb 配方中调用了这个函数。

最后,secretContent 现在是一个 JSON 字符串,我可以使用以下方法在食谱中引用它:

node.run_state['secretContent']['secret_key_name'] 

…并以这种方式获取值,这非常有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-26
    • 1970-01-01
    • 2014-11-06
    • 2013-03-08
    • 2015-10-24
    • 2016-12-19
    • 2015-09-17
    相关资源
    最近更新 更多