chef-infra - 设置独特 Chef 节点属性的最佳实践

标签 chef-infra

我正在尝试使用 Chef 来管理新的虚拟机。我使用专用的 Chef 服务器并从单独的工作站虚拟机完成所有这些工作。

我目前的做法是克隆基础虚拟机镜像,然后使用 Knife Bootstrap 安装 Chef 并使虚拟机达到一致状态。

我可以为虚拟机指定环境或运行列表;我可以覆盖我的环境中的某些设置,例如我有 chef-client在我测试时,测试环境的“覆盖” block 中的间隔设置为每 60 运行一次客户端,这样我就不必每次都手动运行 Chef-client。

例如,我的工作流程是这样的:

  • 克隆虚拟机模板并启动虚拟机

  • 手动设置主机名(更新/etc/hostname 和/etc/hosts)并重新启动

  • 使用初始配方引导节点

    knife bootstrap chef-test1 -r 'recipe[ntp],recipe[chef-client]'

  • 编辑节点以反射(reflect)新环境

我遇到的问题是设置每个节点的属性。我想使用hostname Recipe 来设置节点的主机名,如果我在角色中设置它,那么每个服务器都必须创建一个新角色。但是当我尝试引导并包含此角色时,我收到错误:

chef-test1   * log[Please set the set_fqdn attribute to desired hostname] action write[2013-12-09T16:26:56-07:00] WARN: Please set the set_fqdn attribute to desired hostname

当我在没有该配方的情况下进行引导并尝试编辑节点并设置“set_fqdn”属性时,我无法保存该属性,例如这个json:

{
  "name": "chef-test1",
  "set_fqdn": "chef-test1.local.fqdn",
  "chef_environment": "test-dev1",
  "normal": {
    "tags": [

    ]
  },
  "run_list": [
    "recipe[ntp]",
    "recipe[chef-client]",
    "recipe[hostname]"
  ]
}

当我退出编辑器时,knife 告诉我:

Node not updated, skipping node save

我尝试在 Chef GUI 中编辑此属性,但该属性无法保存。

我找到了this guy谁在/etc/chef/chef.json 中创建 json,基本上做了我期望的事情,但我不确定/etc/chef/chef.json 如何发挥作用(为每个新节点更新它?我'我不使用 Chef-solo,所以也许这就是我的困惑所在)。

根据this email thread无法使用 Knife 节点编辑来覆盖默认属性,但“set_fqdn”不是默认属性。我想避免为每个节点创建一个角色,并且我认为我可以使用主机名说明书来减轻手动设置主机名的需要,例如:

knife bootstrap saucy64 -r 'recipe[ntp],recipe[chef-client],recipe[hostname]' --json '"{ set_fqdn": "chef-test1.local.tld", "chef_client": { "interval": "600" }'

knife bootstrap fedora19 -r 'recipe[ntp],recipe[chef-client],recipe[hostname]' --json '"{ set_fqdn": "chef-test2.local.tld", "chef_client": { "interval": "60" }'

非常感谢您的帮助。

最佳答案

我发现一些问题:

  • knife节点编辑期间,您无法将该属性设置为fqdn等旁边的顶级属性。您必须将其放置在正常下方。这是defaultoverride 之间的层次结构。请参阅Attribute Precedence
  • 使用 Knife 节点编辑气味。我宁愿不这样做(对于主机名可能没问题,但对于其他所有内容,不可能跟踪版本控制中的此类更改)。尝试改为运行 hostname 说明书。
  • 将属性写入到 chef.json 文件中,恕我直言,也应该避免。你的逻辑应该在你的 Recipe 中
  • 您应该有一个base角色/Recipe 或类似的内容,其中包括每个节点都有的琐碎事情(例如ntpchef-client还有主机名)。
  • 您也可以在 bootstrapping 期间直接设置环境:-E myenv(但是,是的,我想知道为什么没有记录)
  • 您也可以在引导期间设置节点名称:-N NAME--node-name NAME

关于chef-infra - 设置独特 Chef 节点属性的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20483260/

相关文章:

java - 使用 Chef 在 CentOS 上安装 Java JDK 1.8

python - 如何搭建chef环境,运行Django,发送邮件

chef-infra - 在 Chef 中使用berkshelf时如何使用手写 Recipe ?

amazon-web-services - 在 Chef 配方中获取 EC2 实例名称

validation - 进行 Chef 客户端设置时出现 ssl 验证错误

chef-infra - 如何在 Vagrant 中使用新的 opscode 存储库?

linux - 主目录不是通过使用 chef 添加用户资源创建的

centos - Knife Cookbook 安装后 Vagrant Box 损坏

linux - ChefServer - 服务器返回错误 502