标签: chef

在 Chef (solo) 食谱中循环的正确方法是什么?

有人可以向我解释厨师是如何工作的吗?这是一个相当广泛的问题,所以为了缩小范围,我有一个非常简单的方法,它循环遍历用户列表并创建每个用户(如果它们尚不存在)。这是行不通的。

据我所知,循环似​​乎正如我所期望的那样发生。一旦循环完成了我创建每个用户的 bash 命令,循环中的每次迭代都会执行一次。然而,当 bash 命令被执行时,它们似乎只有来自第一次循环迭代的用户值。

编写类似于此示例的循环变量数据的配方的正确方法是什么?

这是食谱:

node[:users].each do |user|
  puts "in loop for #{user['username']}"
  bash "create_user" do
    user "root"
    code do
      puts "running 'useradd' for #{user['username']}"
      "useradd #{user['username']}"
    end
    not_if do
      puts "checking /etc/passwd for #{user['username']}"
      "cat /etc/passwd | grep #{user['username']}"
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

我正在使用具有以下设置的 Vagrant 对此进行测试:

Vagrant::Config.run do |config|
  config.vm.box = "precise32"
  config.vm.box_url = "http://files.vagrantup.com/precise32.box"
  config.vm.provision :chef_solo do |chef|
    chef.add_recipe "sample"
    chef.json = {
      :users => [
        {:username => 'testA'},
        {:username => 'testB'},
        {:username => 'testC'},
        {:username …
Run Code Online (Sandbox Code Playgroud)

chef chef-solo

8
推荐指数
2
解决办法
2万
查看次数

Chef Server vs Chef Solo

我正在构建一个结构来运行 Rails 应用程序。应用程序本身在 Heroku 上运行。但是,它向集群发出请求,集群通过 C 中的程序执行调用。

为了能够更快地从崩溃中恢复,我想使用 Chef 创建一个例程。我设法编写了一个“食谱”来安装您需要的一切,当我使用 Vagrant 虚拟机时,它可以完美运行。

但是,当我申请真正的服务器时,它失败了。另外我用的是Chef Solo,运行脚本之前需要手动在机器上安装一些东西,不太实用。

我不知道在这种情况下我是否应该使用 Chef Server。恐怕这是满足“小”需求的“伟大”工具。

这个集群只有三台机器组成,这个应该不会增加太多。但是,该应用程序还会向另一个稍大的集群(6 台机器)发出请求,尽管安装速度非常快,但也可以使用 Chef 服务器。

应该使用 Chef 还是 Chef Solo Server?有没有关于它的教学指南?开发人员文档非常混乱。

chef chef-solo

8
推荐指数
1
解决办法
4784
查看次数

Chef - 如何从节点特定值计算属性?

假设我有一本配置和安装神奇守护进程的食谱:

魔法守护进程/食谱/default.rb:

template "/etc/magical-deamon/magical.conf" do
    source "magical.conf"
    mode 0644
    notifies :restart, resources(:service => "magical-deamon")
end
Run Code Online (Sandbox Code Playgroud)

魔法守护进程/属性/default.rb:

default['magical-deamon']['memory'] = 1024
Run Code Online (Sandbox Code Playgroud)

magic-deamon/templates/default/magical.conf.erb:

memory = <%= node['magical-deamon']['memory'] %>
Run Code Online (Sandbox Code Playgroud)

据我了解,我会使用节点属性来设置内存值,例如:

{
    "normal": {
        "tags": [],
        "magical-deamon": {
            "memory": 256
        }
    },
    "name": "server.example.com",
    "chef_environment": "production",
    "run_list": [
        "role[base]"
    ]
}
Run Code Online (Sandbox Code Playgroud)

或者通过角色:

{
    "name": "base",
    "default_attributes": {
        "magical-deamon": {
                "memory": 756
            }
    },
    "json_class": "Chef::Role",
    "env_run_lists": {
    },
    "run_list": [
    ],
    "description": "base role applied to all nodes",
    "chef_type": "role",
    "override_attributes": {
    },
  }
} …
Run Code Online (Sandbox Code Playgroud)

chef

7
推荐指数
1
解决办法
2万
查看次数

同时拥有 Chef/Puppet 和 RightScale/Scalr 的引人注目的用例是什么?

我想知道云计算管理工具和服务器配置软件之间的区别,因为它们之间似乎有重叠。我想从使用过这两款软件的客户那里得到一些反馈。

configuration puppet chef scalr

7
推荐指数
1
解决办法
454
查看次数

厨师引导程序给予 401 未经授权

我正在尝试通过运行来引导一个新的 Chef 节点:
knife bootstrap <server ip> -x lewis -N gitlab --sudo
但我得到以下输出:
[Mon, 03 Sep 2012 14:45:17 +0000] INFO: *** Chef 10.12.0 ***
[Mon, 03 Sep 2012 14:45:17 +0000] INFO: Client key /etc/chef/client.pem is not present - registering
[Mon, 03 Sep 2012 14:45:17 +0000] INFO: HTTP Request Returned 401 Unauthorized: Failed to authenticate. Ensure that your client key is valid.
[Mon, 03 Sep 2012 14:45:17 +0000] FATAL: Stacktrace dumped to /var/chef/cache/chef-stacktrace.out
[Mon, 03 Sep 2012 14:45:17 +0000] FATAL: Net::HTTPServerException: …

ubuntu centos chef knife

7
推荐指数
2
解决办法
1万
查看次数

使用厨师刀启动 EC2 实例需要 IAM 中的哪些权限?

问题 1:我尝试在 IAM AWS 控制台中创建用户,该用户仅具有使用 Knife ec2 方法启动新实例的受限权限。目前只有具有“Amazon EC2 完全访问权限”策略的完全访问权限才有效。创建用户并授予启动/停止实例和描述图像不起作用。

Q2:我如何调试这个

ERROR: Fog::Compute::AWS::Error: UnauthorizedOperation => You are not authorized to perform this operation.
Run Code Online (Sandbox Code Playgroud)

并追踪我到底需要哪些许可。(-V -V -V 不起作用)

chef amazon-ec2

7
推荐指数
1
解决办法
2万
查看次数

依赖项的厨师食谱依赖项

这可能是一个简单的问题 - 我正在尝试安装一本食谱(gitlab

我将食谱克隆到本地驱动器上的一个文件夹中并运行

knife cookbook upload gitlab.
Run Code Online (Sandbox Code Playgroud)

它立即抛出一个错误:

Cookbook gitlab depends on cookbook postgresql version >= 0.0.0
Run Code Online (Sandbox Code Playgroud)

所以我跑了

knife cookbook site download postgresql
Run Code Online (Sandbox Code Playgroud)

它有一些依赖项,还有更多的依赖项,现在我正在安装我知道我不需要的食谱(dmg、windows 等)

我的印象是这些东西会像 aptitude 或 yum 一样自动解决。我是否错过了食谱依赖解析器的一些关键步骤?

chef cookbook

7
推荐指数
2
解决办法
5564
查看次数

在 opsworks 实例上调试厨师食谱 - 访问自定义 json / 数据包属性

我想在 aws opsworks ec2 服务器上使用Chef-shell会话,以便我可以测试一些我想包含在自定义配方中的环境和实例特定代码。例如,我想查看node[:opsworks][:instance][:layers] 或 node[:opsworks][:instance][:public_dns_name] 等实例属性的输出以及我传递的数据使用自定义 json到 opsworks 堆栈。

我可以启动chef-shell,只是不知道如何使用它来访问opsworks 属性。

如果我通过 ssh 进入 opsworks ec2 实例,我可以访问像 node['ec2']['instance_id'] 这样的属性,但没有像 node['opsworks']['instance']['layers'] 这样的特定于 opsworks 的属性

root@mongodb1:/opt/aws/opsworks/current/bin# ./chef-shell
loading configuration: none (standalone session)
Session type: standalone
Loading......done.

This is the chef-shell.
 Chef Version: 11.10.4
 http://www.opscode.com/chef
 http://docs.opscode.com/

run `help' for help, `exit' or ^D to quit.

Ohai2u ubuntu@mongodb1.localdomain!
chef > attributes_mode
chef:attributes > node['ec2']['instance_id']
 => "i-c1a98f2c"
chef:attributes > node['opsworks']['instance']['layers']
NoMethodError: undefined method `[]' for nil:NilClass
        from …
Run Code Online (Sandbox Code Playgroud)

chef amazon-web-services opsworks

7
推荐指数
2
解决办法
4729
查看次数

厨师客户端是否使用本地缓存?如果是这样,我可以清除它吗?

这可能是一个愚蠢的问题。我对厨师了解不多。我在一个节点上使用 Chef 11.8.2。我有一个奇怪的问题,这可能是由厨师客户端缓存内容而不是从厨师服务器下载引起的。难道厨师做到这一点?在本地缓存东西?如果是这样,是否可以在运行之前清除 Chef 节点上的本地缓存,chef-client以便我可以确定我的问题不是来自缓存?

chef chef-server

7
推荐指数
2
解决办法
2万
查看次数

如何从节点的顶级属性值创建哈希或 yml?

我有一个厨师食谱,我想获取 node['cfn']['environment'] 下的所有属性并将它们写入 yml 文件。我可以做这样的事情(它工作正常):

content = {
  "environment_class" => node['cfn']['environment']['environment_class'],
  "node_id" => node['cfn']['environment']['node_id'],
  "reporting_prefix" => node['cfn']['environment']['reporting_prefix'],
  "cfn_signal_url" => node['cfn']['environment']['signal_url']
}

yml_string = YAML::dump(content)

file "/etc/configuration/environment/platform.yml" do
  mode 0644
  action :create
  content "#{yml_string}"
end
Run Code Online (Sandbox Code Playgroud)

但我不喜欢我必须明确列出属性的名称。如果稍后我添加一个新属性,如果它自动包含在写出的 yml 文件中,那就太好了。所以我尝试了这样的事情:

yml_string = node['cfn']['environment'].to_yaml
Run Code Online (Sandbox Code Playgroud)

但是因为节点实际上是一个 Mash,所以我得到了一个像这样的 platform.yml 文件(它包含很多我不想要的意外嵌套):

--- !ruby/object:Chef::Node::Attribute
normal:
  tags: []
  cfn:
    environment: &25793640
      reporting_prefix: Platform2
      signal_url: https://cloudformation-waitcondition-us-east-1.s3.amazonaws.com/...
      environment_class: Dev
      node_id: i-908adf9
...
Run Code Online (Sandbox Code Playgroud)

但我想要的是这个:

----
reporting_prefix: Platform2
signal_url: https://cloudformation-waitcondition-us-east-1.s3.amazonaws.com/...
environment_class: Dev
node_id: i-908adf9
Run Code Online (Sandbox Code Playgroud)

如何在不按名称显式列出属性的情况下实现所需的 yml 输出?

chef chef-solo

6
推荐指数
1
解决办法
6759
查看次数