Как я могу отредактировать атрибут шеф-повара узла ec2 с помощью ножа

Я хочу отредактировать node_data узла ec2 с помощью команды knife node.
Я могу сделать это вручную с помощью приведенной ниже команды.
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 }

Я хочу отредактировать node_data в этом json.
Если бы мне пришлось редактировать run_list, для этого есть команда
knife node run_list add node 'role[ROLE_NAME]'
Мне нужно что-то похожее на эту команду.


person Mady    schedule 26.09.2013    source источник


Ответы (3)


Похоже, вам нужен скриптовый/неинтерактивный способ установить атрибут данного узла. Вы можете использовать knife exec для этого.

Для вашего примера предположим, что вы хотите получить и установить значение source_repo в node_data для «УЗЛА-1». Вы можете добиться этого, запустив:

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.node_data.source_repo

person nonbeing    schedule 26.11.2013
comment
Обратите внимание, что эквивалент в последних Chefs выглядит как node.set['node_data']..., а не просто node['node_data']... -- chef.io/blog/2013/02/05/chef-11-in-depth-attributes-changes - person Andrew Magee; 22.03.2015

Я добавил плагин ножа для добавления в 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
person Mady    schedule 28.11.2013
comment
Это сработало отлично, я изменил его, чтобы использовать в качестве универсального средства обновления атрибутов узла, поскольку по какой-то причине Chef не включает эту функцию по умолчанию... - person Tobias J; 31.05.2014

если ты хочешь

добавить новый атрибут

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

Необходимо обновить атрибут

это зависит от типа атрибута узла

если атрибут узла - json, запустите эту команду

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; }"
person Sunil Shakya    schedule 09.02.2015