1

我有一个可以正常工作的CloudFormation模板,包含用户数据和cloud-init,可以成功连接并建立一个托管的Chef服务器。我在AWS EC2库存图像上使用Ubuntu 12.04。我可以使用cloud-init来安装和配置厨师,但不能实际运行吗?

对于我自己而言,我想继续做,但

1)配置厨师作为服​​务运行,仅按需运行(“sudo的厨师客户”)

...或者,或以补充该

2)之前执行的整个厨师安装/配置,但只运行一次,不作为服务

我找不到合适的挂钩,如果有的话通过cloud-init示例来实现这种涉水。我想知道是否有一些设置让厨师允许这个用例?我尝试使用update-rc.d来禁用厨师客户端,但由于它已在运行,所以无法正常工作。

这里是与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'} 
+0

你找到一个解决这个问题?回答你自己的问题是可以的。请不要忘记标记答案是正确的! :) – sethvargo 2014-01-02 23:09:56

回答

2

cloud-init做到这一点,最简单的方法是写一个用户数据脚本,做厨师的安装,配置和客户端运行(这些脚本是作为默认运行的,所以你不需要sudo)。

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

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

  2. 取出您现有的云配置脚本,并将其中的厨师零件剥离。

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

  4. 将整个MIME消息放到您的云形成模板中,我假设您正在使用基于代码中引号的内容。 cloud-init(技术上来说,AWS写的CloudFormation处理器cfn-init)将负责其余部分。

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

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步:如果你不想配置厨师为客户服务中删除ADDLOCAL = \“ChefClientFeature,ChefServiceFeature \:从云计算的初始化

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

注意这里运行厨师客户端一次“从安装部分。

请参阅cfn-init链接以获取确切的json语法。

1

根据源代码(但不是文档!),只有在“install_type:gems”时,厨师客户端才会运行。你不能控制这个,直到v.7.7.7。

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

+0

我越来越'7月8日07:46:47 ubuntu [CLOUDINIT] cc_chef.py [调试]:跳过未知的厨师模板关键'执行'与'执行:真正'在我的厨师云初始化YAML运行0.7.7在Ubuntu Xenial上。 :/ – hendry 2016-07-08 08:04:16

0

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

  1. 据云初始化厨师模块documentation,您可以使用exec配置键来控制是否将运行在所有的厨师:

高管:布尔运行或不运行厨师(默认为假,除非安装请求一个宝石,其中,这将随后默认为真)

实施例:

chef: 
    # [other options] 
    exec: false 
  • 按照source code,传递给chef-clientdefault arguments['-d', '-i', '1800', '-s', '20'],其运行厨师客户机作为与1800秒的间隔和20秒“张开”守护程序。要仅运行一次,可以使用undocumented exec_arguments配置键指定一组空白的exec参数,这将导致chef-client仅运行一次,然后退出,而不作为循环后台进程守护进程。
  • 例子:

    chef: 
        # [other options] 
        exec_arguments: ''