knife exec
Используйте подкоманду 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)
Опции
Примечание
Эта подкоманда имеет следующие опции:
-
-E CODE,--exec CODE -
Строка кода для выполнения.
-
-p PATH:PATH,--script-path PATH:PATH -
Путь, разделенный двоеточием, в котором находятся скрипты на Ruby. Используется для переопределения стандартного местоположения скриптов. Если эта опция не указана, knife будет искать скрипты в директории
chef-repo/.chef/scripts.
Примечание
Примеры
Следующие примеры показывают, как использовать эту подкоманду 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/