Spec-Zone.ru › Chef 16

knife exec

[edit on GitHub]

Используйте подкоманду knife exec для выполнения скриптов Ruby в контексте полностью настроенного клиента Chef Infra Client. Используйте эту подкоманду для запуска скриптов, которые будут обращаться к серверу Chef Infra Server только один раз (или очень редко), или в любое время, когда операция не требует полного использования библиотеки подкоманд knife.

Авторизованные запросы к API

Подкоманду knife exec можно использовать для выполнения авторизованных запросов к API сервера Chef Infra Server с использованием следующих методов:

Метод Описание
api.delete Используется для удаления объекта с сервера Chef Infra Server.
api.get Используется для получения подробностей об объекте на сервере Chef Infra Server.
api.post Используется для добавления объекта на сервер Chef Infra Server.
api.put Используется для обновления объекта на сервере Chef Infra Server.

Эти методы используются с опцией -E, которая выполняет эту строку локально на рабочей станции с помощью chef-shell. Эти методы имеют следующий синтаксис:

knife exec -E 'api.method(/endpoint)'

где:

  • api.method — соответствующий метод аутентификации — api.delete, api.get, api.post, или api.put
  • /endpoint — конечная точка в API сервера Chef Infra Server

Например, чтобы получить данные для узла с именем «Example_Node»:

knife exec -E 'puts api.get("/nodes/Example_Node")'

и чтобы убедиться, что вывод отображается в консоли, добавьте puts перед запросом авторизации API:

knife exec -E 'puts api.get("/nodes/Example_Node")'

где puts — сокращённая версия предопределённой переменной $stdout.puts в Ruby.

Следующий пример демонстрирует, как добавить клиента с именем «IBM305RAMAC» и конечную точку /clients, а затем вернуть закрытый ключ этого пользователя в консоли:

client_desc = {
    "name"  => "IBM305RAMAC",
    "admin" => false
  }

  new_client = api.post("/clients", client_desc)
  puts new_client["private_key"]

Скрипты Ruby

Для скриптов Ruby, которые будут выполняться с помощью подкоманды exec, обратите внимание на следующее:

  • Скрипт Ruby должен быть расположен на системе, с которой выполняется команда knife (а не на системах, которые knife будет управлять).
  • Команды оболочки будут выполняться с рабочей станции управления. Например, что-то вроде %x[ls -lash /opt/only-on-a-node] покажет вам список каталога для каталога «opt/only-on-a-node» или ошибку «No such file or directory», если файл не существует локально.
  • Когда доступен DSL chef-shell, DSL Chef Infra Client не будет (если рабочая станция управления также не является клиентом Chef Infra Client). Без DSL Chef Infra Client блок bash не может использоваться для выполнения команд bash.

Синтаксис

Эта подкоманда имеет следующий синтаксис:

knife exec SCRIPT (options)

Опции

Примечание

Просмотрите список общих опций, доступных для этой (и всех) подкоманд и плагинов knife.

Эта подкоманда имеет следующие опции:

-E CODE, --exec CODE

Строка кода, подлежащая выполнению.

-p PATH:PATH, --script-path PATH:PATH

Путь, разделённый двоеточием, по которому расположены скрипты Ruby. Используется для переопределения стандартного расположения скриптов. Если эта опция не указана, knife будет искать скрипты в каталоге chef-repo/.chef/scripts.

Примечание

См. config.rb для получения дополнительной информации о том, как добавить определённые опции knife как настройки в файл config.rb.

Примеры

В следующих примерах показано, как использовать эту подкоманду knife:

Запуск скриптов Ruby

Существует три способа использования knife exec для запуска файлов скриптов Ruby. Например:

knife exec /path/to/script_file

или:

knife exec -E 'RUBY CODE'

или:

knife exec
RUBY CODE
^D

Статус Chef Knife

Чтобы проверить статус knife с помощью скрипта Ruby с именем status.rb (который выглядит так):

printf "%-5s %-12s %-8s %s\n", "Check In", "Name", "Ruby", "Recipes"
nodes.all do |n|
   checkin = Time.at(n['ohai_time']).strftime("%F %R")
   rubyver = n['languages']['ruby']['version']
   recipes = n.run_list.expand(_default).recipes.join(", ")
   printf "%-20s %-12s %-8s %s\n", checkin, n.name, rubyver, recipes
end

и расположен в каталоге с именем scripts/, введите:

knife exec scripts/status.rb

Список доступной свободной памяти

Чтобы отобразить доступную свободную память для всех узлов, введите:

knife exec -E 'nodes.all {|n| puts "#{n.name} has #{n.memory.total} free memory"}'

Список доступных индексов поиска

Чтобы перечислить все доступные индексы поиска, введите:

knife exec -E 'puts api.get("search").keys'

Запрос по нескольким атрибутам

Чтобы запросить узел по нескольким атрибутам с помощью скрипта Ruby с именем search_attributes.rb (который выглядит так):

% cat  scripts/search_attributes.rb
query = ARGV[2]
attributes = ARGV[3].split(",")
puts "Your query: #{query}"
puts "Your attributes: #{attributes.join(" ")}"
results = {}
search(:node, query) do |n|
   results[n.name] = {}
   attributes.each {|a| results[n.name][a] = n[a]}
end

puts results
exit 0

введите:

% knife exec scripts/search_attributes.rb "hostname:test_system" ipaddress,fqdn

чтобы получить что-то вроде:

Your query: hostname:test_system
Your attributes: ipaddress fqdn
{"test_system.example.com"=>{"ipaddress"=>"10.1.1.200", "fqdn"=>"test_system.example.com"}}

Поиск теневых кулинарных книг

Чтобы найти все места, в которых существуют кулинарные книги, которые могут затенять друг друга, создайте файл под названием shadow-check.rb, содержащий следующий код Ruby:

config = Chef::Config

cookbook_loader = begin
  Chef::Cookbook::FileVendor.on_create { |manifest| Chef::Cookbook::FileSystemFileVendor.new(manifest, config[:cookbook_path]) }
  Chef::CookbookLoader.new(config[:cookbook_path])
end

ui = Chef::Knife::UI.new($stdout, $stderr, $stdin, {})

cookbook_loader.load_cookbooks

if cookbook_loader.merged_cookbooks.empty?
  ui.msg "cookbooks ok"
else
  ui.warn "* " * 40
  ui.warn(<<-WARNING)
The cookbooks: #{cookbook_loader.merged_cookbooks.join(', ')} exist in multiple places in your cookbook_path.
A composite version of these cookbooks has been compiled for uploading.

#{ui.color('IMPORTANT:', :red, :bold)} In a future version of Chef, this behavior will be removed and you will no longer
be able to have the same version of a cookbook in multiple places in your cookbook_path.
WARNING
  ui.warn "The affected cookbooks are located:"
  ui.output ui.format_for_display(cookbook_loader.merged_cookbook_paths)
  ui.warn "* " * 40
end

Поместите этот файл в каталог по своему выбору. Выполните следующую команду:

knife exec shadow-check.rb

и убедитесь, что отредактировали shadow-check.rb так, чтобы он правильно определял путь к этому файлу.

© Chef Software, Inc.
Licensed under the Creative Commons Attribution 3.0 Unported License.
The Chef™ Mark and Chef Logo are either registered trademarks/service marks or trademarks/servicemarks of Chef, in the United States and other countries and are used with Chef Inc's permission.
We are not affiliated with, endorsed or sponsored by Chef Inc.
https://docs.chef.io/knife_exec/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API