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

use*_*405 11 chef-infra

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

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

我可以为vm指定环境或运行列表; 我可以覆盖我的环境中的某些设置,例如,我在测试环境的"覆盖"块中设置了厨师 - 客户端间隔,以便在我测试时每60次运行客户端,所以我不必手动运行厨师 -客户每次.

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

  • 克隆vm模板并启动vm

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

  • 使用初始配方引导节点

    刀bootstrap chef-test1 -r'配方[ntp],食谱[chef-client]'

  • 编辑节点以反映新环境

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

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
Run Code Online (Sandbox Code Playgroud)

当我没有那个配方的bootstrap并尝试编辑节点并设置"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]"
  ]
}
Run Code Online (Sandbox Code Playgroud)

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

Node not updated, skipping node save
Run Code Online (Sandbox Code Playgroud)

我试图在厨师gui中编辑这个属性,属性不会保存.

我找到了这个在/etc/chef/chef.json中创建json的人,基本上按照我的预期行事,但我不确定/etc/chef/chef.json如何发挥作用(为每个新的更新它)节点?我不是在使用大厨独唱所以也许这就是我的困惑所在.)

根据此电子邮件线程,无法使用刀节点编辑覆盖默认属性,但"set_fqdn"不是默认值.我想避免为每个节点创建一个角色,我想我可以使用hostname cookbook来减轻手动设置主机名的需要,例如:

刀具bootstrap saucy64 -r'配方[ntp],配方[chef-client],配方[主机名]' - json'"{set_fqdn":"chef-test1.local.tld","chef_client":{"interval" :"600"}'

刀引导程序fedora19 -r'recipe [ntp],食谱[chef-client],食谱[hostname]' - json'"{set_fqdn":"chef-test2.local.tld","chef_client":{"interval" :"60"}'

我很感激你的帮助.

Ste*_*ing 6

我看到一些问题:

  • 在期间knife node edit,您不能将该属性设置为fqdn等旁边的顶级属性.您必须将其放在下面normal.这之间的层次defaultoverride.请参见属性优先级
  • 使用knife node edit气味.我宁愿不这样做(对于主机名可能没问题,但对于其他一切,不可能在版本控制中跟踪这些变化).尝试让hostname菜谱运行.
  • 将属性写入chef.json文件应该是恕我直言,也避免.你的逻辑应该在你的食谱里面
  • 你应该有一个base角色/食谱或类似的东西,包括每个节点都有的微不足道的东西(比如ntp,chef-client还有主机名).
  • 你也可以在bootstrapping期间直接设置环境:( -E myenv但是,我想知道为什么没有记录这个)
  • 您也可以在引导过程中设置节点名称:-N NAME--node-name NAME.