2013-09-26 2 views
5

knife node 명령을 사용하여 ec2 노드의 node_data를 편집하고 싶습니다.
아래 명령을 사용하여 수동으로 수행 할 수 있습니다.
knife node edit NODE_NAME
편집해야 할 json이 생성됩니다.칼을 사용하여 ec2 노드의 요리사 속성을 편집하는 방법

"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]'
이 명령과 비슷한 것이 필요합니다.

답변

2

에 해당합니다 (및 교체 할 수 있습니다) 있습니다. 노드 속성이 JSON 경우

의 노드 속성 유형에 따라 달라집니다

다음 실행

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

위의 코드는 매우 효과적이었고 일반 노드로 사용하도록 수정했습니다. 어떤 이유로 쉐프는 기본적으로 해당 기능을 포함하지 않기 때문에 속성 업데이터를 ... –

8

스크립트 가능/비대화 형 방식으로 주어진 노드의 속성을 설정하는 것처럼 들리는 것 같습니다. 이 경우 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 :이 요리사 서버가 변경 사항을 저장하게됩니다. 명령에 이것이 없으면 임시 변경으로 요리사 서버에 저장되지 않습니다.

은 속성이 실제로 요리사 서버에 변경된 것을 확인하려면, 당신은 다음과 같이 현재 값을 얻을 수 있습니다 : 당신은 볼 수

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

: /new/path/softwares/를 위의 명령의 출력으로. 그런데

node['node_data']['source_repo'] 내가 node_data에 추가 할 칼 플러그인을 추가 한 node.node_data.source_repo

+1

최근 요리사에 상응'node.set [ 'node_data']으로 ... '보다는 단지'노드가 아닌 것으로 보인다하는 것으로한다면 [ 'node_data'] ...'- https://www.chef.io/blog/2013/02/05/chef-11-in-depth-attributes-changes/ –

0

새로운 속성을 추가

원한다면

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

는 속성을 업데이트 할 필요 이 명령

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

어레이 형의 노드 속성

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