设置唯一Chef节点属性的最佳实践

时间:2013-12-09 23:49:10

标签: chef

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

我目前正在这样做的方法是克隆一个基本vm映像,然后使用knife bootstrap来安装Chef并使vm处于一致状态。

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

例如,我的工作流程如下:

  • 克隆vm模板并启动vm

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

  • 使用初始配方引导节点

      

    刀自助厨师-test1 -r'食谱[ntp],食谱[chef-client]'

  • 编辑节点以反映新环境

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

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]"
  ]
}

当我退出编辑时,刀告诉我:

Node not updated, skipping node save

我尝试在厨师gui中编辑此属性,但该属性不会保存。

我发现this guy正在/etc/chef/chef.json中创建json,基本上按照我的预期行事,但我不确定/etc/chef/chef.json是如何发挥作用的(为每个新节点更新它?我没有使用厨师独奏所以也许这就是我的困惑所在。)

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

  

刀引导saucy64 -r'配方[ntp],食谱[chef-client],食谱[hostname]' - json'“{set_fqdn”:“chef-test1.local.tld”,“chef_client”:{ “interval”:“600”}'

     

刀引导fedora19 -r'配方[ntp],配方[chef-client],配方[hostname]' - json'“{set_fqdn”:“chef-test2.local.tld”,“chef_client”:{ “interval”:“60”}'

我感谢您的帮助。

3 个答案:

答案 0 :(得分:6)

我看到了一些问题:

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

答案 1 :(得分:2)

当您引导节点时,基于定义的node.name设置主机名的配方怎么样,我wrote one是原始chef-hostname cookbook的分支。

答案 2 :(得分:0)

这有效:

knife bootstrap 192.168.15.43 -r 'recipe[hostname],recipe[ntp],recipe[chef-client]' -j '{"set_fqdn": "chef-test2"}'

(也发现阅读knife help bootstrap帮助)

This stackoverflow answer使用类似的语法。

编辑:嗯,差不多,这会创建两个节点条目。需要使用-N参数指定节点名称:

knife bootstrap 192.168.15.43 -r 'recipe[hostname],recipe[ntp],recipe[chef-client]' -j '{"set_fqdn": "chef-test2"}' -N chef-test2

knife bootstrap 192.168.15.43 --run-list 'recipe[hostname],recipe[ntp],recipe[chef-client]' --json-attributes '{"set_fqdn": "chef-test2"}' --node-name chef-test2