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/knife_exec/

Spec-Zone.ru

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