Tag: 厨师

如何编写扩展现有提供程序的Chef提供程序?

Cookbook A提供了一个LWRP,我希望在cookbook B中使用LWRP或HWRP进行扩展,这样我就可以执行以下操作,其中provider_b将使用provider_b的现有代码/资源并接受可用于其的其他属性。自己的行动: provider_a “A” do attr_from_a :value end provider_b “B” do attr_from_a :value attr_from_b :value end 这是可能的,如果我想避免编辑食谱A,它仍然可能吗?

如何在配方中访问Chef LWRP属性

使用一些默认的Chef资源,可以在调用它们之后访问它们的一些属性 # recipes/default.rb f = file “/tmp/file_resource” do owner “root” group “root” mode “0755” action :create end log “Path to my file is #{f.path}” # outputs “/tmp/file_resource” 如何在自定义LWRP中实现(这是一个示例) # resources/default.rb actions :create default_action :create attribute :relative_path, :kind_of => String, :name_attribute => true attribute :full_path, :kind_of => String 在这个提供程序中,我试图将new_resource.full_path的属性更新为等于文件资源的路径 # providers/default.rb action :create do f = […]

如何获取linux命令输出到chef属性

我想将命令输出转换为chef属性。 有人可以帮助我如何在执行资源或bash资源中设置它。 ruby_block “something” do block do #tricky way to load this Chef::Mixin::ShellOut utilities Chef::Resource::RubyBlock.send(:include, Chef::Mixin::ShellOut) command = ‘cat #{fileName}’ command_out = shell_out(command) node.set[‘my_attribute’] = command_out.stdout end action :create end 如何在上面的代码中使用属性..

Chef Users资源(检查是否存在?)

我知道如何创建用户资源: user “random” do supports :manage_home => true comment “Random User” uid 1234 gid “users” home “/home/random” shell “/bin/bash” password “$1$JJsvHslV$szsCjVEroftprNn4JHtDi.” end 但我不确定如何使用Chef查找当前节点上所有用户的列表。 我查看了在chef-client运行期间检查node [:users],但只有node [:current_user]可供我使用。 在Chef配方中,有没有办法询问普通用户是否存在? 我的情况是我不应该/不能创建用户(由于公司规定,但我绝对不应该继续安装我的食谱中定义的其他东西,除非xyz用户已经存在。)

Windows配方中的厨师NOT_IF和ONLY_IFvalidation问题

我正在运行这个简单的配方块来在IIS中创建一个Web应用程序 powershell_script “create_site_my_site” do code “New-webapppool -name ‘My_Web_App’; New-Website -Name ‘My_Web_App’ -applicationpool ‘My_Web_App’ -Port ’80’ -IPAddress * -PhysicalPath ‘c:\webs\My_Web_App’ ” action :run not_if “get-website | where-object { $_.name -eq ‘My_Web_App’ }” end 这里的问题是NOT_IF部分它总是真的 PS C:\Users\carlos> PS C:\Users\carlos> get-website | where-object { $_.name -eq ‘asdfasdfasdf’ } PS C:\Users\carlos> echo $lastexitcode 1 PS C:\Users\carlos> get-website | where-object […]

大厨11:任何方式将属性转换为ruby哈希?

我正在使用chef属性为我的服务生成配置。 但是,在某些时候,我需要将属性mash转换为简单的ruby哈希。 这曾经在Chef 10中正常工作: node.myapp.config.to_hash 但是,从Chef 11开始,这不起作用。 只有属性的顶级转换为散列,然后嵌套值保持不可变的mash对象。 修改它们会导致这样的错误: Chef :: Exceptions :: ImmutableAttributeModification ——————————————- —–如果未指定要设置的优先级,则节点属性是只读的。 要设置属性,请使用类似`node.default [“key”] =“value”’的代码 我已经尝试了很多方法来解决这个问题,但这些方法都不起作用: node.myapp.config.dup.to_hash JSON.parse(node.myapp.config.to_json) json解析hack,看起来应该很好用,导致: JSON::ParserError unexpected token at ‘”#”‘ 有没有任何实际可靠的方法,在每个cookbook中包含嵌套解析函数,将属性转换为简单,普通,好的旧ruby哈希?

如何在chef LWRP定义中实现动态属性默认值

我希望能够定义一个轻量级资源,让我们说3个参数,其中两个是基本/基本参数,第三个是这两个参数的组合。 我还想提供定制第三个参数的可能性。 例如: 如何修改以下代码以实现full_name属性的上述行为: 资源定义: actions :install attribute :name, :kind_of => String, :name_attribute => true attribute :version, :kind_of => String attribute :full_name, :kind_of => String 提供者定义: action :install do Chef::Log.info “#{new_resource.full_name}” end 我想看到不同资源指令的不同输出,例如: resource “abc” do version “1.0.1” end 将导致abc-1.0.1 ,但是: resource “def” do version “0.1.3” full_name “completely_irrelevant” end 将导致completely_irrelevant 。 是否有可能在资源定义中定义此行为(可能通过default参数),或者我只能在提供程序定义中执行此操作? 如果第二个为真,那么我可以将计算出的值存储在new_resource对象的full_name属性中(该类似乎错过了full_name=方法定义)或者我必须将它存储在局部变量中吗? 更新 感谢Draco的提示,我意识到我可以在资源文件中创建一个访问器方法,并在请求时动态计算full_name值。 […]

厨师rubygem安装程序失败

我正在尝试通过厨师在CentOS VM上设置cassandra,但它失败并出现以下错误。 我已经尝试清除捆绑缓存无济于事。 配方适用于另一台机器,但关键的区别是我事先在那台机器上运行了其他配方,所以我怀疑我缺少一个厨师依赖(这就是为什么我没有尝试直接修复包)。 如果这是一个显而易见的问题,我对ruby也非常陌生。 机器配置 厨师:11.4.0 ruby 1.9.3p286(2012-10-12修订版37165)[x86_64-linux] gem1.8.24 Linux somehost 2.6.32-276.el6.x86_64#1 SMP Tue May 29 17:38:19 EDT 2012 x86_64 x86_64 x86_64 GNU / Linux 错误消息chef-client输出: 启动Chef Client,版本11.4.0 解决运行清单的食谱:[“chef-client”,“cassandra”] 同步Cookbook: – minitest-handler – chef_handler – 百胜 – cron – selinux – sysctl – openssh – iptables – 厨师 – 客户 – 卡桑德拉 – apt […]

使用’file’s chef-solo资源更新文件

我正在尝试使用chef-solo安装java。 问题是在/etc/profile文件中设置JAVA_HOME和PATH变量。 我尝试使用厨师提供的’file’资源。 这是我的一些代码: java_home = “export JAVA_HOME=/usr/lib/java/jdk1.7.0_05” path = “export PATH=$PATH:/usr/lib/java/jdk1.7.0_05/bin” execute “make_dir” do cwd “/usr/lib/” user “root” command “mkdir java” end execute “copy” do cwd “/usr/lib/java” user “root” command “cp -r /home/user/Downloads/jdk1* /usr/lib/java” end file “/etc/profile” do owner “root” group “root” action :touch content JAVA_HOME content PATH end 但问题是content命令会覆盖文件的所有内容,有没有办法在使用chef-solo资源时更新文件。 谢谢! 更新:我已经找到了一些来自chef-recipe代码,但我不确定它究竟做了什么,代码是.. ruby_block “set-env-java-home” […]

如何在Chef-repo中的Chef cookbook之间共享代码?

我想在厨师回购中分享一些食谱方法。 我知道在菜谱级别上我可以将代码放在libraries目录中的模块中(参见相关问题 )。 我正在寻找的是类似的东西,但可以在我的厨师仓库的所有食谱中找到。 我能想到几个解决方案: 创建一个gem,安装gem作为Chef run的一部分。 这似乎有点矫枉过正。 将文件放在某个文件夹中,并将该文件夹添加到配方文件中的$LOAD_PATH 。 我有一种感觉不适用于实际部署,因为厨师服务器对回购没有任何了解。 将文件放在某个文件夹中,并将其符号链接到每个cookbook的libraries目录中。 最后一个选项似乎是最可行的。 有没有更好/更惯用的方式来做我想要的?