cf通过chef可以部署单节点实例。只需要按照 这里 的介绍即可安装。本文就尝试着分析一下整个部署的流程,同时也对chef进行一些学习。
vcap_dev_setup
好了,首先从最外部的脚本进入,就是bin/vcap_dev_setup。这是shell脚本,前面的内容全部忽略,到run_cmd apt-get $APT_CONFIG install -qym wget这一行开始,这里在安装wget,然后check下网络,关系不大。
然后开始安装chef,这里需要拿到一个key,如果失败,可以参看 这里 获取key。得到key之后update apt-get然后安装chef。
接下来会安装git,然后去github把最新版本的代码全部update下来。我们可以看代码:
cd $CLOUDFOUNDRY_HOME && git clone $VCAP_REPO && cd vcap && git submodule update --init && git checkout $VCAP_REPO_BRANCH
就是这句,如果想看所有源码,就可以通过这些命令获得源码,如果单纯只是git clone的话,有些代码是没有的,比如services、uaa等都是没有的。当然在update之前,脚本会查看目标目录是否已经有vcap这个目录,如果有了,就不会再update了,所以如果有人已经安装完毕了,就可以直接把vcap目录拷贝过来,这样可以节省不少时间。
然后使用gem安装了rake,根据其comments里面所讲: Our deployment code needs this gem. Using bundler seems like an overkill for the deployment code. So for now just manually install the required gem。也不是太懂,意会好了。
然后就调用chefsolo_launch.rb执行接下来的操作了。这里遇到过一个permission denied,因为我们代码从svn check下来,结果没有x权限,这个自己加上去就好了
chefsolo_launch.rb这个文件前面大部分代码都在处理文件路径,这里列几个重要路径的default设置,其实自己都可以更改的:
cloudfoundry_home: /root/cloudfoundry
cloudfoundry_domain: vcap.me
deployment_spec: /root/cloudfoundry/.deployment/devbox/devbox.yml
deployment_config_path: /root/cloudfoundry/.deployment/devbox/config
然后各种参数,包括文件路径都被传入了一个叫做spec的hash(map)。同时JobManager通过job_dependencies.rake文件来得出每个job的依赖(job就是一个组建,比如cloud controller、health manager等),这些信息也被放入了spec。最终这些spec信息全部被写入了/tmp/solo.json文件,通过-j参数传给chef,我们可以看一下这个文件的内容:{
"cloudfoundry":{
"home":"/root/cloudfoundry"
},
"deployment":{
"user":"root",
"name":"devbox",
"domain":"vcap.me",
"group":0
},
"run_list":[
"role[nats_server]",
"role[cloudfoundry]",
"role[router]",
"role[ccdb]",
"role[cloud_controller]",
"role[health_manager]",
"role[dea]",
"role[uaa]",
"role[uaadb]",
"role[redis_node]",
"role[mysql_node]",
"role[mongodb_node]",
"role[neo4j_node]",
"role[rabbitmq_node]",
"role[memcached_node]",
"role[redis_gateway]",
"role[mysql_gateway]",
"role[mongodb_gateway]",
"role[neo4j_gateway]",
"role[rabbitmq_gateway]",
"role[memcached_gateway]"
],
"jobs":{
"installed":null,
"install":{
"all":null
}
}
}