大家早上好....我想知道有没有人能帮我这个忙。
我正在制作一本厨师食谱,其中我从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
也许有更好的方法?或者也许有一种方法可以让变量按正确的顺序设置和解析?
在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']
…并以这种方式获取值,这工作得很好。