我有一个有效的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'}
答案 0 :(得分:2)
在cloud-init
中执行此操作的最简单方法是编写用于执行主厨安装,配置和客户端运行的用户数据脚本(这些脚本默认由root运行,因此您不需要sudo
)。
cloud-init
输入由它们的MIME类型区分,而这些类型又由它们的第一行推断。正如docs所示,您所拥有的是text/cloud-config
部分。您还需要一个“用户数据脚本”,它只是一个以shebang,#!
开头或具有特定MIME内容类型的部分。考虑到这一点,您的流程就是:
编写一个脚本,用于处理厨师安装和chef-client
运行。它可以是bash
或sh
或任何可执行的脚本语言。
使用现有的cloud-config脚本,并将厨师部分从中删除。
使用write-mime-multipart
中引用的cloud-init docs脚本将您的cloud-config部分和用户脚本部分连接成一个多部分MIME有效负载。
将整个MIME消息放入您的云形成模板中,我假设您根据代码中的引号使用该模板。 cloud-init(以及技术上,cfn-init,AWS编写的CloudFormation处理器)将负责其余工作。
完成一次后很容易。按照文档中的多部分示例进行操作,您将看到快速发生的事情。
答案 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,但只运行一次,而不是作为守护进程
exec
配置密钥来控制是否要运行厨师:exec:boolean运行或不运行chef(默认为false,除非安装了gem,否则默认为true)
示例:
chef:
# [other options]
exec: false
chef-client
为['-d', '-i', '1800', '-s', '20']
,其作为守护程序运行chef-client,间隔为1800秒,并且为'splay '20秒。要只运行一次,您可以使用undocumented exec_arguments
配置键来指定一组空的exec参数,这将导致chef-client仅运行一次然后退出,而不会被作为重复的后台进程守护。示例:
chef:
# [other options]
exec_arguments: ''