我试图通过从如何写可重复使用的厨师食谱,江南风格中获取灵感来实现包装食谱.我希望在没有经理应用程序的情况下在我的节点上安装tomcat 7.我用以下attributes/default.rb文件创建了一个包装器食谱:
default["tomcat"]["base_version"] = 7
default["tomcat"]["deploy_manager_apps"] = false
Run Code Online (Sandbox Code Playgroud)
提供的默认属性tomcat/attributes/default.rb是:
default["tomcat"]["base_version"] = 6
#other attributes
default["tomcat"]["deploy_manager_apps"] = true
default["tomcat"]["user"] = "tomcat#{node["tomcat"]["base_version"]}
Run Code Online (Sandbox Code Playgroud)
我希望在所有属性中覆盖这些值.但是,诸如["tomcat"]["user"]未被覆盖的属性.以上仍具有的价值tomcat6在node["tomcat"]["user"].
我是否必须覆盖所有引用的属性["tomcat"]["base_version"]}"?如果我attributes/default.rb在tomcat cookbook之前加载了default.rb这个就行了.
我正在使用Berkshelf,Vagrant和Chef solo进行开发.在metadata.rb我的食谱中,我已经提到了depends "tomcat".
我的自定义食谱位于https://github.com/vaibhavguptaIITD/hcentive-ops/tree/master/hc-tomcat,tomcat社区食谱位于https://github.com/opscode-cookbooks/tomcat.
我希望为模板中使用的模型添加别名,以便可以为不同的模型重用相同的模板.例如,在以下模型中:
member = {
name: "Member1",
children:[
{
name:"Child1"
},
{
name:"Child2"
}
]
}
Run Code Online (Sandbox Code Playgroud)
"成员"和"儿童"都有"名称"属性.所以我希望创建一个操作这个"name"属性的模板.在这个问题的帮助下我能够做到这一点:
按照建议,我创建了一个指令,例如:
app.directive('member', function(){
return {
restrict: 'A',
template: "{{prefix}}<input type='text' ng-model='member.name'>",
scope: {
member: "="
}
};
});
Run Code Online (Sandbox Code Playgroud)
以下是该指令的用法:
<div ng-controller="MemberCtrl">
{{member | json}}
<div member="member"></div>
<div member="member.children[0]"></div>
</div>
Run Code Online (Sandbox Code Playgroud)
我能够实现模板重用,但是因为我在我的指令中使用"scope",所以创建了一个隔离的范围,它无法访问控制器范围的任何属性.所以对于控制器:
app.controller('MemberCtrl', function($scope){
$scope.member = {
name: "Member1",
children:[
{
name:"Child1"
},
{
name:"Child2"
}
]
};
$scope.prefix = "Mr.";
});
Run Code Online (Sandbox Code Playgroud)
指令内的模板无法访问"prefix"属性.以下是jsfiddle:
http://jsfiddle.net/vaibhavgupta007/mVBaC/1/
这可能是什么问题?
编辑
我也可以使用$ parent来访问前缀.但这是干净的方法吗?
我希望创建一个基于Web的应用程序的开发人员环境,该环境将使用vagrant在VM上安装应用程序服务器和数据库服务器.我正在使用开源厨师服务器和流浪汉与chef_client配置器.但是,每次配置开发人员节点时,chef_client配置程序都会在chef服务器上创建客户端节点.这是不可取的,因为许多开发人员都会使用此设置.这样的节点可能会被多次创建和销毁.因此,不需要在chef服务器上维护此类节点的列表.
chef_solo是另一种选择,但它需要食谱存在于系统中.我们正在使用厨师服务器作为烹饪书的存储库.因此,开发人员无需在他/她的系统中拥有特定的食谱.我已经查看了berkshelf以及我可以配置chef_api厨师服务器的路径.但这也需要一个节点.以下是我的流浪文件:
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.box = "precise64-chef"
config.vm.network :private_network, ip: "33.33.33.10"
config.omnibus.chef_version = '11.8.2'
config.vm.provision "chef_client" do |chef|
chef.log_level = :debug
chef.environment = "development"
chef.delete_node = true
chef.delete_client = true
chef.node_name = "sample_app"
chef.chef_server_url = "https://chef-server-url"
chef.validation_key_path = "chef-validator.pem"
chef.add_role "base"
chef.add_role "pg_client"
chef.add_role "application_server"
chef.add_role "db_server"
chef.add_recipe "deploy_application"
end
end
Run Code Online (Sandbox Code Playgroud)
我希望不在sample_appChef服务器上创建节点.否则这符合我的目的.欢迎使用厨师服务器提供开发者环境的任何其他策略.