我的雇主需要在 OpsWorks 中启动的 AWS ec2 实例上线后为其添加标签。
这些实例都是此堆栈中的 MS Windows Server 2012 R2 Base。目标是向堆栈 Foo 中启动的实例和堆栈 Bar 中的“应用程序”:“bar”添加自定义标签,如“application”:“foo”。
我找到了一个github repo chef-aws-tag,如果我在 Linux 上运行 Chef 11,我相信它会满足我的需求。OpsWorks 仅适用于 Windows Server 2012,并且仅适用于 Chef 12.2。
当我将 github 存储库中的 chef-aws-tag 配方添加到 Setup 生命周期事件时,实例在“running_setup”处失败,并带有“setup_failed”。
Chef 失败日志随后在 running_setup 阶段报告此失败:
INFO: HTTP Request Returned 412 Precondition Failed : No such cookbook: aws
ERROR: Running exception handlers
FATAL: Net::HTTPServerException: 412 "Precondition Failed "
这与 metadata.rb 中的依赖项匹配,即:depends 'aws', '>= 0.2.4'
我了解缺少依赖项。我不清楚如何实现这种依赖。配方在 S3 中,存储库 URL 是https://s3-us-west-2.amazonaws.com/employer/ec2instance-tagging.zip
当我将配方添加到配置生命周期事件时,机器可以正常联机,但未添加标签。ec2 实例显示“stock”标签;键 "opsworks:instance" 、 "opsworks:layer:foo_layer" 、 "opsworks:stack" 和 "Name" 都有我期望的值。我想通过配方添加的标签(“应用程序”、“团队”、“环境”)不存在。
自定义 JSON 在堆栈级别添加:
{ "aws-tag": {
"tags": {
"team": "specialteam",
"application": "foo",
"environment": "development"
}
}
}
是否有特定于 OpsWorks AWS 的食谱或食谱我应该在启动后调用以在实例上设置标签?我怎么称呼那个食谱?
我已阅读有关使用 OpsWorks 自定义应用程序部署的 AWS 博客文章。我是否缺少相同的“通过厨师在实例上设置 aws 标签”食谱或食谱,它位于 GitHub 上的Amazon Web Services - Labs存储库中?
github 上的aws opsworks-cookbooks说“对于 Chef 12.2 Windows 和 Chef 12 Linux,没有内置的食谱”,但我希望这是错误的 :-) 并且已经添加了我还没有找到的食谱。或者,希望有人已经这样做并在某处记录了它。
我正在按照这篇 AWS 博客文章快速探索 AWS OpsWorks 中的 Chef 环境(再次为 Linux 编写)和这个关于在 Opsworks 上调试 Chef 的 SF 问题进行故障排除
我能够自己弄清楚其中的一些。通过向 AWS Support 提交案例,我收到了足够多的指示来解决这个问题。
减速带可以解决
使用存档文件时针对不同平台的不同食谱目录结构。
如果您通过存储在 AWS S3 上的存档文件提供配方,AWS 需要一种用于 Linux 的目录结构和另一种不同的 Windows目录结构。
Linux 可以将多个说明书放在一个根目录中。这是
$ berks package
默认情况下所做的。Windows 不接受该根目录。该
$ berks package
命令没有以 Windows 接受的方式构建一个包含多个说明书的存档的选项。我不得不手动编辑 tarfile。Windows 上的红宝石
'aws' 食谱中可能会出现一个
"error: Seahorse::Client::NetworkingError: SSL_connect"
错误。AWS 想要服务之间的 https。这需要一个有效的证书颁发机构捆绑包。Windows 上的 Ruby 无法访问 OS CA 证书包。在以下情况下可以解决此问题:a)您安装 aws-sdk gem,然后
b)在配方中设置路径
curl-ca-bundle.crt
有关依赖项和社区食谱的详细信息。
Windows 上 Chef 12 的 AWS 文档没有提及 Berksfile 或社区食谱。这些都记录在 AWS for Chef 11 on Linux 上。
调用更新时指定区域。
奇怪的是,在实例上运行配方说实例不存在。
FATAL: Aws::EC2::Errors::InvalidInstanceIDNotFound: aws_resource_tag[i-5ccd24d4] (stemsoft::default line 27) had an error: Aws::EC2::Errors::InvalidInstanceIDNotFound: The instance ID 'i-5ccd24d4' does not exist
AWS 错误代码显示 InvalidInstanceID.NotFound 可能是由于 a) 不在区域内,或 b) 最近创建的实例的 ID 未通过系统传播。
修复是包含
region stack['region']
在aws_resource_tag
配方的块中。附加到正确角色的正确策略
确保使用正确的策略设置“aws-opsworks-ec2-role”和“aws-opsworks-service-role”。'aws-opsworks-service-role' 可以保持原样,因此 OpsWorks 服务可以对其他 AWS 服务进行 API 调用。“aws-opsworks-ec2-role”是默认 IAM 实例配置文件,需要 ec2 上的权限才能创建和描述标签。
程序
以下步骤的目标是构建一个在 Microsoft Windows Server 2012 上运行 Chef 12 的 OpsWorks 堆栈,其中包含一个(自定义)说明书,其中包含设置自定义标签的配方。在我的示例中,标签从堆栈中设置的自定义 json 获取其信息。
我还没有找到这样做的现有食谱。我宁愿使用现有的食谱而不是构建自定义食谱。
在此过程结束时,配方使用厨师社区“aws”食谱 从堆栈设置中定义的自定义 json 中设置的值更新“团队”标签。
为此,配方通过搜索现有数据包来获取实例详细信息。它还通过搜索第二个现有数据包来获取区域详细信息。
(它对我有用....)
git-bash.exe
chef generate cookbook cookbook_dir
$ chef generate cookbook cookbook_dir --berks --copyright 'EMPLOYER' --email '[email protected]'
depends 'aws'
$ ruby -c /path/to/cookbook_dir/recipes/default.rb
$ berks install
初始化 berksfile 和跟踪依赖项cookbook 'aws'
$ berks package
以构建 cookbook_dir.tar.gzINFO: AWS: Updating the following tags for resource i-12345678 (skipping AWS tags): { .... "team"=>"teamFooBar"}
示例配方
示例配方
example::default.rb