我想在aws opsworks ec2服务器上使用一个chef-shell会话,这样我就可以testing一些我想包含在自定义配方中的环境和实例代码。 例如,我想查看实例属性的输出, 例如 node [:opsworks] [:instance] [:layers]或node [:opsworks] [:instance] [:public_dns_name]以及我传递的数据到使用自定义json的opsworks栈。
我可以启动chef-shell,我只是不知道如何使用它来访问opsworks属性。
如果我进入opsworks ec2实例,我可以访问像node ['ec2'] ['instance_id'],但没有opsworks特定的像节点['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事件(setup,configure,deploy,undeploy,shutdown)时,自定义JSON和堆栈状态会被推送到JSON结构中的实例。 如果你想让你的配方看到OpsWorks堆栈的最新状态,那么你需要通过Deploy – > Run Command – > Execute Recipes表单从OpsWorks UI运行你的配方。
OpsWorks发送的JSON存储在实例中。 如果您愿意使用潜在陈旧的堆栈状态信息,这个信息只是最后一次运行OpsWorks事件的时间,那么您可以在/var/lib/aws/opsworks/chef的实例中查找最近的*.json文件/var/lib/aws/opsworks/chef ,并通过Ruby代码parsing。
您也可以使用实例上的opsworks-agent-cli实用程序,直接从实例上的命令行(从OpsWorks事件中)重新运行配方。 此实用程序将重新运行OpsWorks事件 – 它不会启动新事件,也不会引入堆栈状态或自定义JSON的新副本,而是重新使用OpsWorks发送给实例的.json文件事件最初运行 。 例如,为了重新运行实例上的setup事件(因为安装事件已经确定已经运行):
sudo opsworks-agent-cli run_command setup
为了重新运行您上次执行的同一组食谱,请从UI执行“执行食谱”:
sudo opsworks-agent-cli run_command execute_recipes
这种糟透了,因为你需要先通过UI运行事件。 所以,如果你想运行一个自定义配方,或者如果你想更新自定义食谱,你首先需要从用户界面运行该事件。 但是,您可以通过opsworks-agent-cli重新运行这些事件的第二,第三和以后的时间。
有关opsworks-agent-cli的更多信息,请参阅此处 。
在上面的回答中,使用@schlomoswidler关于ec2实例文件中自定义json位置的build议,运行以下命令,获得一个交互式chef-shell,其中包含我正在寻找的自定义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 [email protected]! chef > node['opsworks']['instance']['layers'] => ["mongodb"] chef >
您显然需要将/ var / lib / aws / opsworks / chef文件夹中的jsonreplace为系统上适当的文件。
Chef 12基于Linux的OpsWorks堆栈的工作方式与Chef 11堆栈不同。 一个区别是, 厨师search现在是正确的方式来访问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 11堆栈的相同的chef-shell技术。
我所知道的尝试search的最好方法是使用Pry会话访问第二个厨师专用于客户端的运行时环境。
在下面的示例中,我首先从UI中触发“Execute Recipes”生命周期事件,并使用“opsworks_cookbook_demo :: foo”作为运行的配方。 然后我SSH到我的实例和编辑/var/chef/cookbooks/opsworks_cookbook_demo/recipes/foo.rb ,添加以下两行。
require "pry" binding.pry
然后我运行opsworks-agent-cli run来重复最新的运行。 除非最新的运行是“更新自定义食谱”types,否则这将使当地的变化不复存在。
配方将再次运行,但现在我们有一个交互式shell来实验。 以下是您可以执行两个search的方法:
[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还有其他一些在OpsWorks实例上使用pry的示例。