Spec-Zone.ru › Chef 17

knife exec

[править на 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'

Операции с пользователями и ключами пользователей

Чтобы изменить любые глобальные конечные точки, такие как пользователь или ключи пользователей, используйте флаг --server-url:

knife exec -E 'api.delete("/users/myuser/keys/user33")' --server-url https://

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

Чтобы запросить узел для нескольких атрибутов с помощью скрипта на 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/workstation/knife_exec/

Spec-Zone.ru

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