我想使用knife node命令编辑ec2节点的node_data。
我可以使用以下命令手动进行操作。
knife node edit NODE_NAME
它将生成一个我需要编辑的json。

"name": "NODE-1",
  3   "chef_environment": "test",
  4   "normal": {
  5     "node_data": {
  6       "version": "23690ecc9c572e47db242bfad1296388f91da1e9",
  7       "depot_path": "https://s3.amazonaws.com/builds/",
  8       "source_repo": "softwares/"
  9     },
 10     "tags": [
 11
 12     ]
 13   },
 14   "run_list": [
 15     "role[my-role]"
 16   ]
 17 }


我想在该json中编辑node_data
如果我必须编辑run_list,有一个命令
knife node run_list add node 'role[ROLE_NAME]'
我需要与此命令相似的东西。

最佳答案

听起来您想要一种可脚本化/非交互式方式来设置给定节点的属性。您可以为此使用knife exec

对于给定的示例,假设您要获取并设置“ NODE-1”在source_repo中的node_data值。您可以通过运行以下命令来实现:

knife exec -E "nodes.find(:name => 'NODE-1') { |node| node['node_data']['source_repo'] = '/new/path/softwares/'; node.save; }"

请注意最后的node.save:这将使Chef服务器保存您的更改。如果命令中缺少此内容,则这是一个临时更改,未保存在Chef服务器上。

要确认Chef服务器上的属性确实已更改,可以像下面这样获取当前值:

knife exec -E "nodes.find(:name => 'NODE-1') { |node| puts node['node_data']['source_repo'] }"

您应该看到:/new/path/softwares/作为以上命令的输出。

顺便说一句,请注意node['node_data']['source_repo']等效于(并且可以替换为)node.node_data.source_repo

07-24 09:48
查看更多