我可以使用cloud-init来安装和配置chef,但实际上不能运行它吗?

时间:2013-03-12 10:33:40

标签: amazon-web-services chef amazon-cloudformation cloud-init

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

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

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

...或者,或补充这个

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

我无法通过cloud-init示例找到适当的钩子,如果有的话。我想知道是否有一些设置让Chef允许这个用例?我尝试使用update-rc.d来禁用chef-client,但由于它已经在运行,因此无效。

以下是与EC2实例关联的CF模板中的userdata片段:

#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 个答案:

答案 0 :(得分:2)

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

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

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

  2. 使用现有的cloud-config脚本,并将厨师部分从中删除。

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

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

  5. 完成一次后很容易。按照文档中的多部分示例进行操作,您将看到快速发生的事情。

答案 1 :(得分:1)

根据源代码(但不是文档!),chef-client仅在" install_type:gems "时运行。你无法控制这一点,直到v.0.7.7。

对于那些真正想要运行的人来说,在cloud-init 0.7.7选项' exec:true'已添加,对于" install_type:gems "设置为true而对其他人则是假的。

答案 2 :(得分:0)

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

步骤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语法。

答案 3 :(得分:0)

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

  1. 根据cloud-init Chef模块documentation,您可以使用exec配置密钥来控制是否要运行厨师:
  2.   

    exec:boolean运行或不运行chef(默认为false,除非安装了gem,否则默认为true)

    示例:

    chef:
      # [other options]
      exec: false
    
    1. 根据source code,传递给default argumentschef-client['-d', '-i', '1800', '-s', '20'],其作为守护程序运行chef-client,间隔为1800秒,并且为'splay '20秒。要只运行一次,您可以使用undocumented exec_arguments配置键来指定一组空的exec参数,这将导致chef-client仅运行一次然后退出,而不会被作为重复的后台进程守护。
    2. 示例:

      chef:
        # [other options]
        exec_arguments: ''