我想使用chef-shell在 aws opsworks ec2 服务器上创建会话,以便我可以测试一些我想包含在自定义配方中的环境和实例特定代码。例如,我想查看实例属性例如 node[:opsworks][:instance][:layers] 或 node[:opsworks][:instance][:public_dns_name] 以及我使用传递给 opsworks 堆栈的数据自定义 json。
我可以启动 chef-shell,只是不知道如何使用它来访问 opsworks 属性。
如果我通过 ssh 进入 opsworks ec2 实例,我可以访问诸如 node['ec2']['instance_id'] 之类的属性,但不能访问 opsworks 特定的属性,例如 node['opsworks']['instance']['layers']
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 >
答案1
当发生 OpsWorks 事件(设置、配置、部署、取消部署、关闭)时,自定义 JSON 和堆栈的状态将以 JSON 结构的形式推送到实例。如果您希望配方能够查看 OpsWorks 堆栈的最新状态,则需要通过 OpsWorks UI 运行配方部署 -> 运行命令 -> 执行配方形式。
OpsWorks 发送的 JSON 存储在实例上。如果您愿意使用可能过时的 Stack 状态信息(该信息仅与此实例上次运行 OpsWorks 事件时一样新),您可以*.json
在 中查找实例上的最新文件/var/lib/aws/opsworks/chef
,并通过 Ruby 代码对其进行解析。
您还可以使用opsworks-agent-cli
实例上的实用程序直接从实例上的命令行(重新)运行 OpsWorks 事件中的配方。此实用程序将重新运行 OpsWorks 事件 - 它不会启动新事件,并且它才不是提取堆栈状态或自定义 JSON 的新副本,而是重用.json
OpsWorks 发送给实例的文件该活动最初举办的时间。例如,为了setup
在您的实例上重新运行该事件(因为设置事件肯定已经运行过):
sudo opsworks-agent-cli run_command setup
为了重新运行您上次从 UI 运行执行配方时执行的同一组配方:
sudo opsworks-agent-cli run_command execute_recipes
这有点糟糕,因为您需要先通过 UI 运行事件。因此,如果您想运行自定义食谱,或者想要更新自定义食谱,您首先需要从 UI 运行该事件。但是,第二次、第三次及后续时间,您可以通过 重新运行这些事件opsworks-agent-cli
。
看这里有关 opsworks-agent-cli 的更多信息。
答案2
根据 @schlomoswidler 在上述回答中关于 ec2 实例文件上自定义 json 位置的建议,我运行了以下命令来获取包含我正在寻找的自定义 opsworks 属性的交互式 chef-shell:
root@mongodb1:/opt/aws/opsworks/current/bin# /opt/aws/opsworks/current/bin/chef-shell -j /var/lib/aws/opsworks/chef/2014-10-27-13-46-53-01.json
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 > node['opsworks']['instance']['layers']
=> ["mongodb"]
chef >
您显然需要用系统上的适当文件替换 /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/
。
[root@asd1 ~]# ll /var/chef/runs/c7f67e3e-c15d-4159-bb14-5bde07751543/data_bags/
total 36
drwxr-xr-x 2 root root 4096 Nov 23 21:19 aws_opsworks_app
drwxr-xr-x 2 root root 4096 Nov 23 21:19 aws_opsworks_command
drwxr-xr-x 2 root root 4096 Nov 23 21:19 aws_opsworks_ecs_cluster
drwxr-xr-x 2 root root 4096 Nov 23 21:19 aws_opsworks_elastic_load_balancer
drwxr-xr-x 2 root root 4096 Nov 23 21:19 aws_opsworks_instance
drwxr-xr-x 2 root root 4096 Nov 23 21:19 aws_opsworks_layer
drwxr-xr-x 2 root root 4096 Nov 23 21:19 aws_opsworks_rds_db_instance
drwxr-xr-x 2 root root 4096 Nov 23 21:19 aws_opsworks_stack
drwxr-xr-x 2 root root 4096 Nov 23 21:19 aws_opsworks_user
[root@asd1 ~]#
您不能使用chef-shell
我上面对 Chef 11 堆栈所用的相同技术。
据我所知,尝试搜索的最佳方式是使用窥探会议以访问专用于客户的第二个 chef 运行的运行时环境。
示例窥探会议
在以下示例中,我首先从 UI 触发“执行配方”生命周期事件,并使用“opsworks_cookbook_demo::foo”作为要运行的配方。然后我通过 SSH 进入我的实例并编辑/var/chef/cookbooks/opsworks_cookbook_demo/recipes/foo.rb
,添加以下两行。
require "pry"
binding.pry
然后我运行opsworks-agent-cli run
以重复最新运行。除非最新运行的类型为“更新自定义食谱”,否则这将保留本地更改。
该配方将再次运行,但现在我们有一个交互式 shell 可以进行实验。以下是执行两个搜索的方法:
[root@asd1 ~]# opsworks-agent-cli run
[2015-11-23 21:46:35] INFO [opsworks-agent(3396)]: About to re-run 'execute_recipes' from 2015-11-23T21:43:15
... lots more output ...
From: /var/chef/runs/76ff2d58-ab8f-4cf6-8744-9562025321fd/local-mode-cache/cache/cookbooks/opsworks_cookbook_demo/recipes/foo.rb @ line 4 Chef::Mixin::FromFile#from_file:
1: Chef::Log.info "foo"
2:
3: require "pry"
=> 4: binding.pry
search(:aws_opsworks_stack)
=> [{"data_bag_item('aws_opsworks_stack', 'f24bd5ea-3ff2-4a1a-a4e4-9298495ae263')"=>
{"arn"=>"arn:aws:opsworks:us-west-2:153700967203:stack/f24bd5ea-3ff2-4a1a-a4e4-9298495ae263/",
"custom_cookbooks_source"=>{"type"=>"s3", "url"=>"redacted", "username"=>nil, "password"=>nil, "ssh_key"=>nil, "revision"=>nil},
"name"=>"susan",
"region"=>"us-west-2",
"stack_id"=>"f24bd5ea-3ff2-4a1a-a4e4-9298495ae263",
"use_custom_cookbooks"=>true,
"vpc_id"=>nil,
"id"=>"f24bd5ea-3ff2-4a1a-a4e4-9298495ae263",
"chef_type"=>"data_bag_item",
"data_bag"=>"aws_opsworks_stack"}}]
search(:aws_opsworks_instance, "self:true")
=> [{"data_bag_item('aws_opsworks_instance', 'asd1')"=>
{"ami_id"=>"ami-d93622b8",
"architecture"=>"x86_64",
"auto_scaling_type"=>nil,
"availability_zone"=>"us-west-2a",
"created_at"=>"2015-11-20T12:48:29+00:00",
"ebs_optimized"=>false,
"ec2_instance_id"=>"i-be823867",
"elastic_ip"=>nil,
"hostname"=>"asd1",
"instance_id"=>"42d28e39-29a8-4fdf-a327-afdc23668ff1",
"instance_type"=>"c3.large",
"layer_ids"=>["f08fb7e2-9278-498a-8c0d-7d1c1bae22aa"],
… lots more data …
AWS 博客文章快速探索 AWS OpsWorks 中的 Chef 环境还有在 OpsWorks 实例上使用 pry 的其他示例。