在 opsworks 实例上调试厨师食谱 - 访问自定义 json / 数据包属性

Pet*_*r M 7 chef amazon-web-services opsworks

我想在 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 ubuntu@mongodb1.localdomain!
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 >
Run Code Online (Sandbox Code Playgroud)

小智 10

当 OpsWorks 事件(设置、配置、部署、取消部署、关闭)发生时,自定义 JSON 和堆栈的状态将被推送到 JSON 结构中的实例。如果您希望您的配方看到 OpsWorks 堆栈的最新状态,那么您需要通过Deploy -> Run Command -> Execute Recipes表单从 OpsWorks UI 运行您的配方。

OpsWorks 发送的 JSON 存储在实例上。如果您愿意使用仅与此实例上次运行 OpsWorks 事件时一样新鲜的潜在陈旧堆栈状态信息,您可以在 中查找*.json实例上的最新文件/var/lib/aws/opsworks/chef,并通过 Ruby 代码对其进行解析。

您还可以使用opsworks-agent-cli实例上的实用程序直接从实例上的命令行(重新)运行 OpsWorks 事件中的配方。此实用程序将重新运行 OpsWorks 事件 - 它不会启动新事件,也不会引入堆栈状态或自定义 JSON 的新副本,而是重用.jsonOpsWorks在该事件发生时发送到实例的文件原来跑。例如,为了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 的更多信息,请参见此处


Pet*_*r M 9

使用来自@schlomoswidler 的关于 ec2 实例文件上自定义 json 位置的建议,我运行了以下命令以获取包含我正在寻找的自定义 opsworks 属性的交互式厨师外壳:

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 ubuntu@mongodb1.localdomain!
chef > node['opsworks']['instance']['layers']
 => ["mongodb"]
chef >
Run Code Online (Sandbox Code Playgroud)

您显然需要用系统上的适当文件替换 /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 ~]#
Run Code Online (Sandbox Code Playgroud)

您不能使用chef-shell我在上面用于 Chef 11 堆栈的相同技术。

据我所知,试验搜索的最佳方法是使用Pry 会话来访问专供客户使用的第二次厨师运行的运行时环境。

示例 Pry 会话

在以下示例中,我首先从 UI 触发“执行食谱”生命周期事件,并使用“opsworks_cookbook_demo::foo”作为要运行的食谱。然后我通过 SSH 进入我的实例并编辑/var/chef/cookbooks/opsworks_cookbook_demo/recipes/foo.rb,添加以下两行。

require "pry"
binding.pry
Run Code Online (Sandbox Code Playgroud)

然后我运行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 …
Run Code Online (Sandbox Code Playgroud)

aws 博客文章Quickly Explore the Chef Environment in AWS OpsWorks提供了在 OpsWorks实例上使用pry 的其他示例。