我想使用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]'
我需要类似于这个命令的东西。
答案 0 :(得分:9)
听起来您需要一种可编写脚本/非交互方式来设置给定节点的属性。您可以使用knife exec
。
对于您给出的示例,假设您要在source_repo
中为“NODE-1”获取并设置node_data
的值。您可以通过运行:
knife exec -E "nodes.find(:name => 'NODE-1') { |node| node['node_data']['source_repo'] = '/new/path/softwares/'; node.save; }"
注意最后的node.save
:这将使厨师服务器保存您的更改。如果命令中缺少这个,那么这是一个临时更改,不会保存在厨师服务器上。
要确认在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
答案 1 :(得分:2)
我添加了一个插件来添加到node_data。
require 'chef/knife'
require 'chef/knife/core/node_presenter'
class Chef
class Knife
class NodeJson_dataUpdate < Knife
deps do
require 'chef/node'
require 'json'
end
banner "knife node json_data update [NODE] [JSON_NODE_DATA]"
def run
node = Chef::Node.load(@name_args[0])
node_data = @name_args[1]
update_node_data(node, node_data)
node.save
output(node.normal.node_data)
end
def update_node_data(node,node_data)
parsed_node_data = JSON.parse(node_data)
parsed_node_data.each do |key,val|
if key.empty?
print "ERROR: Key is empty for value- "+val+". Not adding this to node_data.\n"
else
node.normal.node_data[key]=val
end
end
end
end
end
end
答案 2 :(得分:0)
如果你想
添加新属性
knife exec -E "nodes.find(:name => 'NODE-1') { |node| node.normal_attrs[:attribute_name]='Value' ; node.save; }"
需要更新属性
它取决于节点属性类型
如果node属性为json,则运行此命令
knife exec -E "nodes.find(:name => 'NODE-1') { |node| node.normal_attrs['node_data'][:attribute_name]= 'Value' ; node.save; }"
如果数组类型中的node属性
knife exec -E "nodes.find(:name => 'NODE-1') { |node| node.normal.tags << {'attribute_name'=>'Value',''=>}; node.save; }"