1

我有一个有效的 CloudFormation 模板,其中包含用户数据和 cloud-init,成功连接并构建到托管的 Chef 服务器。我在 AWS EC2 库存图像上使用 Ubuntu 12.04。

出于我自己的目的,我想继续这样做,但是

1)将 Chef 配置为作为服务运行,仅按需运行(“sudo chef-client”)

...或者,或补充这一点

2) 像以前一样执行整个 Chef 安装/配置,但只运行一次,而不是作为服务

我找不到合适的钩子,如果有的话,可以通过 cloud-init 示例来实现这一点。我想知道 Chef 是否有一些设置允许这个用例?我尝试使用 update-rc.d 禁用 chef-client 但这不起作用,因为它已经在运行。

以下是与 EC2 实例关联的 CF 模板中的用户数据片段:

#cloud-config

resize_rootfs: true
apt_update: true
byobu_by_default: disable
manage_etc_hosts: false
disable_root: true
timezone: Europe/London
package_upgrade: true
package_reboot_if_required: true

apt_sources:
  - source: "deb http://apt.opscode.com/ $RELEASE-0.10 main"
    key: |
      -----BEGIN PGP PUBLIC KEY BLOCK-----
      Version: GnuPG v1.4.9 (GNU/Linux)
      xxxx truncated xxxxx
      -----END PGP PUBLIC KEY BLOCK-----

chef:
  install_type: packages
  server_url: xxxxxx
  node_name: xxxxx
  validation_name: xxxxxx
  validation_key: |
    -----BEGIN RSA PRIVATE KEY-----
    xxxx truncated xxxxx
    -----END RSA PRIVATE KEY-----
  run_list:
    - role[my-server]
  environment: production

output: {all: '| tee -a /var/log/cloud-init-output.log'}
4

4 回答 4

2

最简单的方法cloud-init是编写一个用户数据脚本来执行 Chef 安装、配置和客户端运行(这些脚本默认由 root 运行,因此您不需要sudo)。

cloud-init输入通过它们的 MIME 类型来区分,而这些类型又由它们的第一行推断出来。正如文档所示,您所拥有的就是其中的text/cloud-config一部分。您还需要一个“用户数据脚本”,它只是一个以 shebang 开头的部分#!,或者具有特定的 MIME 内容类型。考虑到这一点,您的流程是这样的:

  1. 编写一个脚本来处理 chef 的安装和chef-client运行。它可以是bashsh任何可执行的脚本语言。

  2. 使用您现有的 cloud-config 脚本,并从中剥离出主厨部分。

  3. 使用cloud-init 文档write-mime-multipart中引用的脚本将您的 cloud-config 部分和 user-script 部分连接到一个多部分 MIME 有效负载中。

  4. 将整个 MIME 消息放入您的云形成模板中,我假设这是您根据代码中的引号使用的内容。cloud-init(以及技术上的 cfn-init,AWS 编写的 CloudFormation 处理器)将负责其余的工作。

完成一次之后就很容易了。按照文档中的多部分示例,您将很快看到发生了什么。

于 2013-05-09T03:06:03.197 回答
1

根据源代码(但不是文档!), chef-client 只有在“ install_type: gems ”时才会运行。在 v.0.7.7 之前你无法控制它。

对于那些真正想要运行的人,在 cloud-init 0.7.7 中添加了选项 'exec: true' ,对于“ install_type: gems ”设置为 true ,对于其他设置为 false 。

于 2015-02-04T11:11:21.783 回答
1

是的,您可以使用cloud-init来安装和配置 Chef,但根本不运行它,还可以像以前一样执行整个 Chef 安装/配置,但只运行一次,而不是作为守护进程。

  1. 根据 cloud-init Chef 模块文档,您可以使用execconfig 键来控制是否运行 chef:

exec:运行或不运行 chef 的布尔值(默认为 false,除非请求安装 gem,然后默认为 true)

例子:

chef:
  # [other options]
  exec: false
  1. 根据源代码,传递给的默认参数chef-client['-d', '-i', '1800', '-s', '20'],它将 chef-client 作为守护进程运行,间隔为 1800 秒,“播放”为 20 秒。要只运行一次,您可以使用未记录exec_arguments的配置键指定一组空的 exec 参数,这将导致 chef-client 只运行一次然后退出,而不会被守护为重复的后台进程。

例子:

chef:
  # [other options]
  exec_arguments: ''
于 2016-12-23T21:51:51.157 回答
0

您可以安装/配置 chef-client 并从 cfn-init 运行一次,这将在 cloud-init 中执行,如下所示。有关 cloudfromation 模板和调用cfn-init元数据,请参阅 aws 文档。

第 1 步:使用元数据中的文件部分将 chef-client 安装程序复制到节点。

"files" : {
"c:/chef-client-12.04.exe" : {
"sorce" : "https://s3:link to file "
},
"client.rb" :{
"content":"..."}
"validation.pem":{..}
}

第 2 步:添加代码以执行安装程序以在云形成中安装厨师。

"commands": {
"1-install-chef": { 
"command":"msiexec /qn /i d:\\yourFolder\\chef-client-12.04.exe     ADDLOCAL=\"ChefClientFeature,ChefServiceFeature\"",
"waitAfterCompletion" :"1"
 }
 }

第 3 步:从 cloud-init 运行一次 chef 客户端

"commands": {
"run-chef-client": { 
"command":"chef-client >c:\cheflogfile.log",
"waitAfterCompletion" :"1"
 }
 }

请注意:如果您不想将 chef-client 配置为服务,请从安装部分中删除 ADDLOCAL=\"ChefClientFeature,ChefServiceFeature\"。

请参阅 cfn-init 链接了解确切的 json 语法。

于 2015-01-15T09:19:46.957 回答