2013-09-26 16 views
5

knife node komutunu kullanarak ec2 node's node_data dosyasını düzenlemek istiyorum.
El ile aşağıdaki komutu kullanarak yapabilirsiniz.
knife node edit NODE_NAME
Düzenlemem gereken bir json üretecektir.Bir ec2 düğümünün bir şef niteliğini nasıl düzenleyebilirim?

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

O json içinde node_data düzenlemek istiyorum. Ben run_list düzenlemek için olsaydı
Bu komutun benzer bir şey gerektiğini
knife node run_list add node 'role[ROLE_NAME]'
için bir komut yoktur.

cevap

2

eşdeğerdir (ve değiştirilebilir) unutmayın. Düğüm nitelik json ise

onun düğüm öznitelik türüne bağlıdır

sonra çalıştırın

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

Bu işe yaradı, genel bir düğüm olarak kullanmak için değiştirdim Bir sebepten dolayı özellik güncellemesi, Şef bu işlevselliği varsayılan olarak içermez ... –

8

Belirli bir düğümün özniteliğini ayarlamak için betiklenebilir/etkileşimli olmayan bir yöntem gibi görünüyorsunuz. Bunun için knife exec'u kullanabilirsiniz.

Verilen örnekte, "NODE-1" için source_repo değerini node_data olarak almak ve ayarlamak istediğinizi varsayalım. Sen çalıştırarak bu elde edebiliriz:

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

Not sonunda node.save: bu şef sunucu değişiklikleri kaydedin yapacaktır. Komutta bu yoksa, o zaman şef sunucuya kaydedilmeyen geçici bir değişiklik olur.

nitelik gerçekten şef sunucusunda değiştiğini onaylamak için, bu gibi güncel değerini elde edebilirsiniz: görmelisin

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

: /new/path/softwares/ Yukarıdaki komutunun çıktısı olarak. Bu arada

, node['node_data']['source_repo'] ben node_data eklemek için bir bıçak eklentisi eklemiş node.node_data.source_repo

+1

son Şefler eşdeğer 'node.set [ 'node_data'] olmak ...' ziyade sadece 'düğüm daha görünüyor Not eğer [ 'node_data'] ... 'https://www.chef.io/blog/2013/02/05/chef-11-in-depth-attributes-changes/ –

0

yeni öznitelik eklemek

istiyorsanız

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

özelliğini güncellemeniz gerekiyor bu komut

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

dizi türü düğüm nitelik

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