AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 639442
Accepted
Peter M
Peter M
Asked: 2014-10-25 07:25:57 +0800 CST2014-10-25 07:25:57 +0800 CST 2014-10-25 07:25:57 +0800 CST

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

  • 772

我想在 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 >
amazon-web-services
  • 2 2 个回答
  • 4917 Views

2 个回答

  • Voted
  1. Best Answer
    Shlomo Swidler
    2014-10-27T11:24:48+08:002014-10-27T11:24:48+08:00

    当 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 的更多信息,请参见此处。

    • 10
  2. Peter M
    2014-10-28T06:43:02+08:002014-10-28T06:43:02+08:00

    在上面的回答中使用@schlomoswidler 关于ec2 实例文件中自定义json 位置的建议,我运行以下命令来获取一个交互式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 文件夹中的 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 堆栈的相同技术。

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

    例如撬会话

    在以下示例中,我首先从 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 的其他示例。

    • 9

相关问题

  • AWS RDS 的定价 [关闭]

  • 如何在 AWS ubuntu 实例上安装 apache?

  • 了解 Amazon AWS 使用数据

  • 亚马逊提供的负载均衡服务体验如何?

  • ELB 中现有节点的 AWS 自动缩放问题

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve