2013-09-26 86 views
5

Tôi muốn chỉnh sửa node_data của nút ec2 bằng cách sử dụng lệnh knife node.
Tôi có thể thực hiện thủ công bằng cách sử dụng lệnh dưới đây.
knife node edit NODE_NAME
Nó sẽ tạo ra một json mà tôi cần chỉnh sửa.Làm cách nào để chỉnh sửa thuộc tính đầu bếp của nút ec2 bằng dao

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

Tôi muốn chỉnh sửa node_data trong json đó.
Nếu tôi phải chỉnh sửa run_list, có một lệnh cho rằng
knife node run_list add node 'role[ROLE_NAME]'
Tôi cần một cái gì đó tương tự như lệnh này.

Trả lời

2

Tôi đã thêm một plugin dao để thêm vào 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 
+0

Điều này làm việc tuyệt vời, tôi đã sửa đổi nó để sử dụng như một nút chung thuộc tính updater vì lý do nào đó Chef không bao gồm chức năng đó theo mặc định ... –

8

Có vẻ như bạn muốn một cách có thể viết/không tương tác để đặt thuộc tính của một nút nhất định. Bạn có thể sử dụng knife exec cho việc này.

Ví dụ cụ thể của bạn, giả sử bạn muốn nhận và đặt giá trị là source_repo trong node_data cho "NODE-1". Bạn có thể đạt được điều này bằng cách chạy:

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

Lưu ý node.save ở cuối: điều này sẽ làm cho máy chủ đầu bếp lưu thay đổi. Nếu điều này bị thiếu trong lệnh, thì đó là một thay đổi tạm thời không được lưu trên máy chủ đầu bếp.

Để xác nhận rằng các thuộc tính đã thực sự thay đổi trên máy chủ đầu bếp, bạn có thể nhận được giá trị hiện tại như thế này:

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

Bạn sẽ thấy: /new/path/softwares/ như đầu ra của lệnh trên.

Bằng cách này, lưu ý rằng node['node_data']['source_repo'] tương đương với (và có thể được thay thế bằng) node.node_data.source_repo

+1

Lưu ý rằng tương đương trong đầu bếp gần đây có vẻ là 'node.set [ 'node_data'] ... 'thay vì chỉ' nút [ 'node_data'] ... '- https://www.chef.io/blog/2013/02/05/chef-11-in-depth-attributes-changes/ –

0

nếu bạn muốn

thêm thuộc tính mới

knife exec -E "nodes.find(:name => 'NODE-1') { |node| node.normal_attrs[:attribute_name]='Value' ; node.save; }" 

Cần phải cập nhật thuộc tính

của nó phụ thuộc vào loại thuộc tính nút

nếu thuộc tính nút là json sau đó chạy lệnh này

knife exec -E "nodes.find(:name => 'NODE-1') { |node| node.normal_attrs['node_data'][:attribute_name]= 'Value' ; node.save; }" 

nếu thuộc tính nút trong kiểu mảng

knife exec -E "nodes.find(:name => 'NODE-1') { |node| node.normal.tags << {'attribute_name'=>'Value',''=>}; node.save; }"