试图找出大型项目的最佳方法.何时通过使用include_recipe
而不是将配方添加到配方中来添加配方中的配方run_list
?有一个很好的经验法则吗?
假设我在食谱中有一个默认属性:
default.nginx_upstreams = {
'service1' => ['service1.server.com'],
'service2' => ['service2.server.com'],
}
Run Code Online (Sandbox Code Playgroud)
然后它会在角色和环境中被修改和覆盖,直到它最终到达我的配方.在那里,我计算了一些我想要添加到属性的附加服务.如果我做这样的事情:
node.nginx_upstreams.merge! {'service3' => ['service3.server.com']}
Run Code Online (Sandbox Code Playgroud)
然后当我尝试使用属性在我的模板,我得到了undefined method 'each' for nil:NilClass
我的模板时,我尝试做
<% node.nginx_upstreams.each do |name, servers| %>
Run Code Online (Sandbox Code Playgroud)
另外,我也得到了WARN: Setting attributes without specifying a precedence is deprecated and will be removed in Chef 11.0
.有用的警告告诉我如何以正常优先级设置属性(显然,使用node.set["key"] = "value"
,但不告诉我如何指定默认或覆盖属性.
通过这样做,我可以解决这个问题:
upstreams = node.nginx_upstreams.to_hash
upstreams.merge! {'service3' => ['service3.server.com']}
template "nginx_config" do
variables({:upstreams=>upstreams})
end
Run Code Online (Sandbox Code Playgroud)
但这感觉就像一个黑客.我在这个页面node.set()
之外找不到任何文档,这也表明你可以在配方中设置正常和覆盖属性,但没有说明如何.
那么......你如何从配方中正确设置属性(与其他所有东西深度融合)?这个node.set()
电话实际上做了什么,我可以告诉它我想要合并的优先级吗?
如何使用Chef配方设置环境变量?
我需要使用Chef配方设置环境变量.你能提供一个如何实现这个目标的例子吗?
我有7个文件和1个战争.我需要在部署它时更改值.我有这个:
##usuario
#alfresco.user=*****
alfresco.user=********
##pass
#alfresco.password= sfsfs
alfresco.password=sfgsf
alfresco.rutaAnexos=/gthtfdh/dfgdf/cm:
#atributo.type.anexo=ANEXO_INFO_OBJETO
atributo.type.anexo=AN
atributo.type.observaciones=OBSERVACIONES
Run Code Online (Sandbox Code Playgroud)
我需要评论一些行并取消注释其他一些行.然后我需要制作七个模板并根据环境放置变量并在配方中创建一个文件.
我怎样才能做到这一点?
我一直试图弄清楚如何将节点的名称(knife bootstrap -N
)放入模板中.我已经尝试了十几个不同的想法,但还没有发现任何有用的东西.有谁知道如何从厨师食谱访问这个?
另外 - 有没有办法列出Chef配方可用的所有变量?
在厨师食谱中做一点干燥的最佳方法是什么?即只是打破了Ruby代码的一小部分,所以我不会一遍又一遍地复制粘贴它.
以下失败当然是:
NoMethodError: undefined method `connect_root' for Chef::Resource::RubyBlock
Run Code Online (Sandbox Code Playgroud)
我可能在一个配方中有多个ruby_blocks,因为它们做了不同的事情,并且需要将不同的not_if块作为truley幂等.
def connect_root(root_password)
m = Mysql.new("localhost", "root", root_password)
begin
yield m
ensure
m.close
end
end
ruby_block "set readonly" do
block do
connect_root node[:mysql][:server_root_password] do |connection|
command = 'SET GLOBAL read_only = ON'
Chef::Log.info "#{command}"
connection.query(command)
end
end
not_if do
ro = nil
connect_root node[:mysql][:server_root_password] do |connection|
connection.query("SELECT @@read_only as ro") {|r| r.each_hash {|h|
ro = h['ro']
} }
end
ro
end
end
Run Code Online (Sandbox Code Playgroud) 简介 我正在学习厨师在工作中自动化服务器管理.我从这里下载了chefdk 3.0 ,现在我正在尝试用厨师制作我的第一本食谱.
重要 我在Windows环境中使用它进行测试,我确实认为它失败了,因为Windows没有iptables,但我不认为它会失败,说它找不到食谱.我尝试过使用Windows cookbook,但它确实有效.
问题 我能够创建菜谱并运行它,但我无法引用超市的依赖关系.
我尝试过两种选择:
备选方案1
我使用以下命令来创建cookbook
chef generate cookbook learn_chef_httpd
Run Code Online (Sandbox Code Playgroud)
(来自本教程)
我能够完成教程,现在我想测试引用另一本食谱,所以我选择了simple_iptables
我添加了这一行
cookbook 'simple_iptables', '~> 0.7.0'
Run Code Online (Sandbox Code Playgroud)
对于我的Berksfile,如超市中所述.
然后我将这些行添加到我的default.rb文件中:
include_recipe 'simple_iptables'
# Allow HTTP, HTTPS
simple_iptables_rule "http" do
rule [ "--proto tcp --dport 80",
"--proto tcp --dport 443" ]
jump "ACCEPT"
end
Run Code Online (Sandbox Code Playgroud)
我使用以下方法运行食谱:
chef-client --local-mode --runlist 'recipe[learn_chef_httpd]'
Run Code Online (Sandbox Code Playgroud)
问题是厨师找不到食谱
Chef::Exceptions::CookbookNotFound
----------------------------------
Cookbook simple_iptables not found. If you're loading simple_iptables from anoth er cookbook, make sure you configure the …
Run Code Online (Sandbox Code Playgroud) 使用案例: DevOps团队不久前推出了一个节点,我的团队想知道run_list中使用的一个/几个cookbook的版本是什么.我们的DevOps团队正在进行消防,因此我们希望找到一种自给自足的方法.
命令已尝试:
knife cookbook show COOKBOOK
提供所有可能的版本,但不指定正在使用的版本.
knife node show NODE
显示所有烹饪书,但没有附加版本信息.
问:是否有一个命令(类似的东西来knife search
,ohai
)查询厨师服务器部署在节点上的版本?
我正在编写一个Chef配方来安装我们的应用程序代码并执行它.配方需要特别关注此代码最终的目录(用于运行模板,设置日志转发等).因此,目录本身会在不同的食谱中出现在很多地方.
我试图获取/定义一个变量,所以我可以在我的资源块中使用字符串插值重新使用它.这非常简单:
home = node['etc']['passwd'][node['nodejs']['user']]['dir']
Run Code Online (Sandbox Code Playgroud)
使用示例用法,npm install
同时告诉它在主目录中插入repo下载,如下所示:
execute "npm install" do
command "npm install #{prefix}#{app} --prefix #{home}"
end
Run Code Online (Sandbox Code Playgroud)
除了定义home
变量的第一个块将在编译时运行.在一个新的服务器上,我的nodejs用户帐户可能还不存在,这是一个问题,给出了一个
NoMethodError undefined method '[]' for nil:NilClass
Run Code Online (Sandbox Code Playgroud)
我有一些解决方法,但我想要一个特定的解决方案,使home变量只在配方执行时获取,而不是编译时.
动态评估ruby块内的home变量,如下所示:
ruby_block "fetch home dir" do
block do
home = node['etc']['passwd'][node['nodejs']['user']]['dir']
end
end
Run Code Online (Sandbox Code Playgroud)
这似乎没有实际工作,当你尝试做类似这样的事情时,为Chef :: Resource :: Directory提供一个NoMethodError未定义方法的主页:
directory ".npm" do
path "#{home}/.npm"
end
Run Code Online (Sandbox Code Playgroud)
我觉得我必须在这里做错事.
懒惰地评估每个需要它的资源的参数.所以改为:
directory ".npm" do
path lazy "#{node['etc']['passwd'][node['nodejs']['user']]['dir']}/.npm"
end
Run Code Online (Sandbox Code Playgroud)
但是,只需要维护一行代码,将其存储在变量中并完成它就会非常棒.
在编译时创建用户.这当然有效,使用此处链接的通知技巧,如下所示:
u = …
Run Code Online (Sandbox Code Playgroud) 我正在使用Vagrant和chef-solo来测试我的食谱,但我有一个特殊的食谱需要厨师服务器(它使用搜索).我希望我的默认配方如下所示:
include_recipe 'some_recipe'
include_recipe 'some_other_recipe'
unless running_as_chef_solo?
include_recipe 'a_recipe_that_requires_chef_server'
end
Run Code Online (Sandbox Code Playgroud)
如何检查厨师是否在菜谱中作为厨师独奏运行,所以我可以跳过不支持的食谱?
chef-infra ×10
chef-recipe ×10
ruby ×2
berkshelf ×1
cookbook ×1
knife ×1
recipe ×1
vagrant ×1
variables ×1