我想在 aws opsworks ec2 服务器上使用chef-shell会话,这样我就可以测试一些我想包含在自定义配方中的环境和实例特定代码。例如,我想查看node[:opsworks][:instance][:layers] 或 node[:opsworks][:instance][:public_dns_name] 等实例属性的输出以及我传递的数据使用自定义 json到 opsworks 堆栈。
我可以启动 chef-shell,我只是不知道如何使用它来访问 opsworks 属性。
如果我 ssh 进入 opsworks ec2 实例,我可以访问像 node['ec2']['instance_id'] 这样的属性,但没有像 node['opsworks']['instance']['layers'] 这样的 opsworks 特定属性
root@mongodb1:/opt/aws/opsworks/current/bin# ./chef-shell
loading configuration: none (standalone session)
Session type: standalone
Loading......done.
This is the chef-shell.
Chef Version: 11.10.4
http://www.opscode.com/chef
http://docs.opscode.com/
run `help' for help, `exit' or ^D to quit.
Ohai2u [email protected]!
chef > attributes_mode
chef:attributes > node['ec2']['instance_id']
=> "i-c1a98f2c"
chef:attributes > node['opsworks']['instance']['layers']
NoMethodError: undefined method `[]' for nil:NilClass
from (irb#1):4
chef:attributes >
当 OpsWorks 事件(设置、配置、部署、取消部署、关闭)发生时,自定义 JSON 和堆栈的状态将推送到 JSON 结构中的实例。如果您希望配方查看 OpsWorks 堆栈的最新状态,则需要通过部署 -> 运行命令 -> 执行配方表单从 OpsWorks UI 运行配方。
OpsWorks 发送的 JSON 存储在实例上。如果您愿意使用仅与此实例上次运行 OpsWorks 事件时一样新鲜的可能陈旧的堆栈状态信息,您可以在 中查找实例上的最新
*.json
文件/var/lib/aws/opsworks/chef
,并通过 Ruby 代码对其进行解析。您还可以使用
opsworks-agent-cli
实例上的实用程序直接从实例上的命令行从 OpsWorks 事件(重新)运行配方。此实用程序将重新运行 OpsWorks 事件 - 它不会启动新事件,并且不会拉入堆栈状态或自定义 JSON 的新副本,而是重用OpsWorks在该事件发生时.json
发送给实例的文件原来运行。例如,为了setup
在您的实例上重新运行事件(因为 setup 事件肯定已经运行):sudo opsworks-agent-cli run_command setup
为了重新运行您上次从 UI 运行 Execute Recipes 时执行的同一组配方:
sudo opsworks-agent-cli run_command execute_recipes
这很糟糕,因为您需要先通过 UI 运行事件。因此,如果您想要运行自定义配方,或者想要更新自定义食谱,您首先需要从 UI 运行该事件。但是,第二次、第三次和随后的时间,您可以通过 重新运行这些事件
opsworks-agent-cli
。有关 opsworks-agent-cli 的更多信息,请参见此处。
在上面的回答中使用@schlomoswidler 关于ec2 实例文件中自定义json 位置的建议,我运行以下命令来获取一个交互式chef-shell,其中包含我正在寻找的自定义opsworks 属性:
您显然需要将 /var/lib/aws/opsworks/chef 文件夹中的 json 替换为系统上的适当文件。
Chef 12 Linux OpsWorks Stacks (2016) 更新
Chef 12 基于 Linux 的 OpsWorks 堆栈的工作方式与 Chef 11 堆栈不同。一个区别是厨师搜索现在是访问 OpsWorks 在食谱中提供的数据的正确方法。在实例上,属性数据现在通过数据包(堆栈迁移和引用)公开。您可以通过检查您的一个 Chef 运行的目录来获得可用数据包的概览。每个数据包在下面都有自己的子目录
/var/chef/runs/<ID>/data_bags/
。你不能使用
chef-shell
我上面用于 Chef 11 堆栈的相同技术。我所知道的尝试搜索的最佳方法是使用Pry 会话来访问专用于客户的第二次厨师运行的运行时环境。
例如撬会话
在以下示例中,我首先从 UI 触发“执行食谱”生命周期事件,并使用“opsworks_cookbook_demo::foo”作为要运行的食谱。然后我 SSH 进入我的实例并编辑
/var/chef/cookbooks/opsworks_cookbook_demo/recipes/foo.rb
,添加以下两行。然后我跑来
opsworks-agent-cli run
重复最近的一次跑步。除非最新运行的类型是“更新自定义食谱”,否则这将保留本地更改。配方将再次运行,但现在我们有一个交互式 shell 可以进行试验。执行两个搜索的方法如下:
aws 博客文章快速探索 AWS OpsWorks中的 Chef 环境提供了在 OpsWorks 实例上使用 pry 的其他示例。