ruby - 在 Chef 食谱中获取错误设置和评估变量
问题描述
大家早上好......我想知道是否有人可以帮助我。
我正在编写一本 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
也许有更好的方法来做到这一点?或者也许有一种方法可以按正确的顺序设置和解析变量?
解决方案
在 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']
......并以这种方式获得价值,这非常有效。
推荐阅读
- amazon-web-services - AWS Codeartifact 未指向私有存储库
- c# - 尝试使用 C# 发送电子邮件时出错
- r - R如何将双格式数据转换为日期时间
- javascript - 重构两个共享相同变量的 JS 函数
- bash - bash shell 文本操作:我可以从 URL 中提取域,我将如何扩展它以排除“.com”或“.co.uk”等
- python - 无法交互主窗口pygame
- r - R中颜色编码表的图例
- javascript - 如何使用 Wix Corvid 动态更改亚马逊搜索广告的搜索短语?
- javascript - 状态变量钩子不适用于 useEffect 回调
- javascript - 如何使用画布在鼠标悬停时填充形状?