Указанный целевой каталог не является каталогом linux
Обновлено: 21.11.2024
Вы можете использовать команды Bolt для подключения к целям и выполнения над ними действий. Эти действия варьируются по сложности от вызова простой команды до выполнения ряда команд и задач в рамках рабочего процесса оркестровки.
Полный список доступных команд Bolt см. в справочнике по командам Bolt.
Выполнить команду
Bolt может запускать произвольные команды на цели. Чтобы выполнить команду, укажите команду и список целей, на которых будет выполняться команда.
*команда оболочки nix
🔩 Совет. Если команда содержит пробелы или специальные символы оболочки, заключите команду в одинарные кавычки.
Запустить команду в кавычках
Если вам нужно запустить команду, которая использует кавычки, вы должны правильно экранировать кавычки. То, как вы избегаете кавычек, зависит от того, используете ли вы Bash или PowerShell.
В оболочке Bash используйте обратную косую черту \ или двойные кавычки:
*команда оболочки nix
В оболочке PowerShell используйте комбинацию обратной косой черты \ и удвоения кавычек. В приведенном ниже примере используются две двойные кавычки для обозначения значения, передаваемого в Filter , однако в примере также используется обратная косая черта, чтобы базовый анализатор аргументов Bolt Ruby принял команду.
Читать команду из файла
Чтение команды из файла полезно, когда вам нужно запустить сценарий на цели, которая не разрешает загрузку файлов. Чтобы прочитать команду из файла, передайте символ @, за которым следует относительный путь к файлу.
*команда оболочки nix
Примечание. В PowerShell всегда заключайте имя файла в одинарные кавычки.
Чтение команды из стандартного ввода
Чтобы прочитать команду из стандартного ввода (stdin), перенаправьте результаты другой команды в Bolt и передайте один дефис (-) в качестве команды.
*команда оболочки nix
Чтение из стандартного ввода не поддерживается модулем PowerShell.
Указать цели
Самый распространенный способ указать цели в командной строке — использовать параметр target. Этот параметр принимает список целей, разделенных запятыми.
*команда оболочки nix
Указать цели из файла инвентаризации
Если у вас есть файл инвентаризации, вы можете перечислить цели и группы целей по имени вместо использования универсального идентификатора ресурса (URI) цели.
*команда оболочки nix
Укажите цели с помощью сопоставления шаров
Bolt поддерживает сопоставление глобусов для целей. Это полезно, когда у вас есть несколько целей, для которых вы хотите запустить команду с похожими именами. Например, чтобы выполнить команду для всех целей, начинающихся со слова «болт»:
*команда оболочки nix
Читать цели из файла
Чтобы прочитать файл целей, передайте символ @, за которым следует относительный путь к файлу, в опцию целей.
*команда оболочки nix
Примечание. В PowerShell всегда заключайте имя файла в одинарные кавычки.
Чтение целей из стандартного ввода
Чтобы прочитать список целей из стандартного ввода, передайте результаты другой команды в Bolt и передайте один дефис (-) в параметре целей.
*команда оболочки nix
Чтение из стандартного ввода не поддерживается модулем PowerShell.
Указать цели из предыдущей команды
После каждого выполнения Bolt записывает информацию о результате этого запуска в файл .rerun.json в каталоге проекта Bolt. Вы можете использовать файл .rerun.json вместе с параметром повторного запуска, чтобы указать цели для будущих команд. Параметр повторного запуска принимает одно из трех значений:
success : список целей, на которых команда успешно завершилась.
failure : список целей, на которых не удалось выполнить команду.
все : все цели, на которых выполнялась команда.
Например, если вам нужно запустить команду, которая зависит от успеха предыдущей команды, вы можете выбрать успешные цели с помощью значения успеха.
*команда оболочки nix
Отключить .rerun.json
Если вы хотите сохранить результаты определенного запуска Bolt и запустить для него несколько команд повторного запуска, вы можете отключить файл .rerun.json.
*команда оболочки nix
Используйте параметр --no-save-rerun, чтобы отключить сохранение файла повторного запуска:
Используйте аргумент -SaveRerun со значением $false, чтобы отключить сохранение файла повторного запуска:
Укажите учетные данные для подключения
Чтобы установить соединение с удаленными целями, Bolt необходимо предоставить учетные данные цели. Вы можете указать учетные данные в командной строке или в файле инвентаризации, и предоставленные вами учетные данные могут различаться в зависимости от операционной системы, на которой работает цель.
Независимо от того, использует ли цель Unix-подобную операционную систему или Windows, самый простой способ указать учетные данные — передать имя пользователя и пароль команде Bolt:
*команда оболочки nix
Если вы предпочитаете, чтобы Bolt безопасно запрашивал пароль, чтобы он не отображался в списке процессов или на консоли, вместо этого используйте параметр запроса пароля:
*команда оболочки nix
Указать транспорт
Bolt использует определенный транспорт для установления соединения с целью. По умолчанию Bolt подключается к целевым объектам с помощью транспорта ssh. Вы можете использовать один из приведенных ниже методов, чтобы установить другой транспорт из командной строки, или вы можете настроить транспорты в своем файле инвентаризации.
Вы можете указать транспорт, используемый для подключения к определенной цели, установив его в качестве протокола в URI цели:
*команда оболочки nix
Вы также можете использовать параметр командной строки транспорта:
*команда оболочки nix
📖 Связанная информация
Вывод потока
🧪 Эта функция является экспериментальной и может быть изменена.
Bolt может передавать выходные данные запущенных команд и сценариев на цели, позволяя вам видеть, что происходит на цели во время выполнения действия.
Чтобы включить потоковую передачу из командной строки, можно указать параметр командной строки для потоковой передачи:
*команда оболочки nix
Чтобы включить потоковую передачу для всех команд и сценариев, добавьте параметр потоковой передачи в файл конфигурации Bolt-Project.yaml или Bolt-Defaults.yaml:
Если потоковая передача включена, Bolt выводит вывод на консоль в том порядке, в котором он его получает. Каждая строка выходных данных включает имя цели, которая вернула выходные данные, а также тип вывода: стандартный вывод (out) или стандартная ошибка (err).
После завершения действия Bolt распечатывает все выходные данные цели под ее именем. Если вы не хотите видеть вывод во второй раз, вы можете указать параметр командной строки без подробностей при запуске команды или сценария. У этого параметра командной строки нет соответствующего параметра конфигурации.
*команда оболочки nix
Когда вы указываете no-verbose , выходные данные цели печатаются только один раз.
Запустить скрипт
Когда вы запускаете скрипт на целевом Bolt, он копирует скрипт с вашего контроллера Bolt во временный каталог на целевом объекте, запускает скрипт, а затем удаляет скрипт из временного каталога.
Вы можете запускать сценарии на любом языке, если в системе установлен соответствующий интерпретатор. Это включает в себя любой язык сценариев, который может работать в системе.
Чтобы запустить скрипт, укажите путь к скрипту на контроллере Bolt и список целей для запуска скрипта.
*команда оболочки nix
Вы также можете запускать сценарии, являющиеся частью проекта или модуля. Скрипты, являющиеся частью проекта или модуля, сохраняются в каталоге scripts/. Чтобы запустить скрипт, укажите путь к файлу Puppet в виде /scripts/ :
*команда оболочки nix
Передать аргументы скрипту
Значения аргументов передаются буквально и не интерполируются оболочкой на цели.
*команда оболочки nix
Чтобы передать скрипту аргументы, укажите их после команды:
Чтобы передать скрипту аргументы, укажите их после команды:
Вы также можете использовать параметр -Arguments и указать список аргументов, разделенных запятыми:
🔩 Совет. Если аргумент содержит пробелы или специальные символы, заключите их в одинарные кавычки.
Требования для запуска скрипта
В зависимости от целевой операционной системы существуют дополнительные требования для запуска скриптов:
Для целей, подобных Unix, ваши сценарии должны включать строку shebang, указывающую интерпретатор. Например, сценарий Bash должен указать путь к интерпретатору Bash:
Для целей Windows может потребоваться включить расширения файлов. По умолчанию цели Windows поддерживают расширения .ps1 , .rb и .pp . Чтобы добавить дополнительные расширения файлов, добавьте их в раздел конфигурации winrm вашего файла инвентаризации:
Запустить задачу
Задачи – это отдельные действия, которые вы можете выполнять над целью. Они похожи на скрипты, но имеют метаданные, принимают структурированный ввод и возвращают структурированный вывод. Вы можете писать задачи, характерные для вашего проекта, или загружать модули из Puppet Forge, которые содержат задачи.
Чтобы запустить задачу, укажите имя задачи и список целей, на которых будет выполняться задача.
*команда оболочки nix
Передать параметры задаче
Если задача принимает параметры, вы можете передать их Bolt как часть команды.
*команда оболочки nix
Чтобы передать параметры задаче, добавьте в команду объявления параметров вида параметр=значение:
Чтобы передать параметры задаче, добавьте в команду объект с объявлениями параметров:
📖 Связанная информация
Запустить план
Планы — это наборы задач и команд, которые можно комбинировать с другой логикой.Они позволяют выполнять сложные операции, такие как запуск нескольких задач с помощью одной команды, вычисление входных данных для задачи или выполнение определенных задач на основе результатов другой задачи. Как и в случае с задачами, вы можете создавать планы, относящиеся к вашему проекту, или загружать модули из Puppet Forge, содержащие планы.
Чтобы запустить план, укажите его название.
*команда оболочки nix
Передать параметры в план
Если план принимает параметры, вы можете передать их Bolt как часть команды.
*команда оболочки nix
Чтобы передать параметры в план, добавьте в команду объявления параметров в форме параметр=значение:
Чтобы передать параметры задаче, добавьте в команду объект с объявлениями параметров:
Передать цели в параметр плана
Если план принимает параметр target с типом TargetSpec , вы можете использовать параметр командной строки target для указания значения параметра.
*команда оболочки nix
📖 Связанная информация
Загрузить файл или каталог
Bolt может копировать файлы и каталоги с вашего контроллера Bolt в цели. Чтобы загрузить файл или каталог, укажите исходный путь на контроллере Bolt, целевой путь на целевом объекте, в который он должен быть скопирован, и список целевых объектов.
И источник, и место назначения принимают абсолютные и относительные пути. Если вы укажете относительный путь в качестве места назначения, Bolt скопирует файл относительно текущего рабочего каталога цели. Как правило, текущим рабочим каталогом для цели является домашний каталог пользователя, вошедшего в систему.
*команда оболочки nix
Скачать файл или каталог
Bolt может копировать файлы и каталоги из целей в каталог назначения на вашем контроллере Bolt. Чтобы загрузить файл или каталог, укажите исходный путь на цели, путь к целевому каталогу на контроллере Bolt и список целей.
И источник, и место назначения принимают абсолютные и относительные пути. Если вы укажете относительный путь в качестве источника, Bolt скопирует файл относительно текущего рабочего каталога на цели. Как правило, текущим рабочим каталогом для цели является домашний каталог пользователя, вошедшего в систему.
*команда оболочки nix
Пункт назначения на контроллере Bolt — это путь к каталогу, в который копируется загруженный файл или каталог. Если целевой каталог не существует, Bolt создаст его для вас.
Bolt сохраняет каждый загружаемый файл или каталог в подкаталог целевого каталога, который соответствует закодированному в URL-адресу имени цели, из которой он был загружен. Имена целевых каталогов имеют URL-кодировку, чтобы гарантировать, что они являются допустимыми именами каталогов.
*команда оболочки nix
После запуска этой команды из корня каталога вашего проекта структура каталогов вашего проекта будет выглядеть примерно так:
🔩 Совет. Чтобы избежать создания каталогов со специальными символами, дайте своим целям простое, удобочитаемое имя.
Применить код Puppet
Применить код Puppet из файла
Вы можете напрямую применить код Puppet из файла, содержащего код Puppet (известный как манифест), к вашим целям. Чтобы применить код манифеста Puppet к цели, укажите путь к файлу манифеста и список целей.
Пакет агента Puppet должен быть установлен на целевом объекте для запуска кода манифеста. Когда вы применяете код манифеста Puppet, Bolt гарантирует, что пакет агента Puppet установлен на цели.
*команда оболочки nix
Применить код Puppet из командной строки
Кроме того, вы можете применять код Puppet напрямую к своим целям, без необходимости предварительной записи его в файл. Чтобы применить код Puppet непосредственно к цели, используйте параметр командной строки выполнить.
Вопрос: мне нужен простой пример использования cp --no-target-directory .
У меня есть некоторые трудности с пониманием cp --no-target-directory . Я понимаю объяснение mv --no-target-directory , но не могу представить, как использовать его для cp .
Например, при успешном выполнении команды mv /tmp/source /tmp/dest нет гарантии, что /tmp/source был переименован в /tmp/dest : он мог быть переименован в /tmp/dest /source, если какой-то другой процесс создал каталог /tmp/dest. Однако, если mv -T /tmp/source /tmp/dest завершается успешно, нет никаких сомнений в том, что /tmp/source был переименован в /tmp/dest`. (источник)
3 ответа 3
По умолчанию cp проверяет, является ли последний аргумент существующим каталогом. Если это произойдет, cp создаст ссылку внутри этого каталога с базовым именем источника. То есть, учитывая команду
если wibble является существующим каталогом, cp копирует исходный код в wibble/bar .Если wibble не существует, то cp связывает источник с wibble .
Если вы хотите быть уверенным, что копия всегда качается , вы можете указать параметр --no-target-directory (псевдоним -T ). Таким образом, если cp завершится успешно, вы можете быть уверены, что копия называется wibble. Если wibble уже существует как каталог, cp завершится ошибкой.
В виде таблицы:
Единственное отличие состоит в том, что с -T , если целью является существующий каталог, команда возвращает ошибку. Это полезно, когда вы ожидаете, что каталог не существует: вы получите сообщение об ошибке, а не что-то неожиданное.
То же самое относится к mv и ln . Если целью является существующий каталог, с -T они сигнализируют об ошибке, а не молча делают что-то другое.
С cp дело обстоит иначе. Если вы выполняете рекурсивное копирование, а источником является каталог, то cp -T копирует содержимое источника в место назначения, а не копирует сам источник. То есть учитывая
Указывает включаемые каталоги для использования при компиляции данной цели. Имя named должно быть создано с помощью такой команды, как add_executable() или add_library(), и не должно быть целью ALIAS .
Используя AFTER или BEFORE явным образом, вы можете выбирать между добавлением и добавлением в начале, независимо от значения по умолчанию.
Ключевые слова INTERFACE , PUBLIC и PRIVATE необходимы для указания области действия следующих аргументов. ЧАСТНЫЕ и ПУБЛИЧНЫЕ элементы будут заполнять свойство INCLUDE_DIRECTORIES файла . Элементы PUBLIC и INTERFACE будут заполнять свойство INTERFACE_INCLUDE_DIRECTORIES файла . Следующие аргументы определяют включаемые каталоги.
Новое в версии 3.11: Разрешить установку элементов ИНТЕРФЕЙСА для ИМПОРТИРОВАННЫХ целей .
Повторные вызовы одних и тех же элементов добавления в вызываемом порядке.
Если указан параметр SYSTEM, компилятору будет сообщено, что на некоторых платформах под каталогами подразумеваются системные включаемые каталоги. Это может иметь такие последствия, как подавление предупреждений или пропуск содержащихся заголовков в вычислениях зависимостей (см. документацию компилятора). Кроме того, системные включаемые каталоги ищутся после обычных включаемых каталогов независимо от указанного порядка.
Если SYSTEM используется вместе с PUBLIC или INTERFACE , целевое свойство INTERFACE_SYSTEM_INCLUDE_DIRECTORIES будет заполнено указанными каталогами.
Аргументы target_include_directories могут использовать «выражения генератора» с синтаксисом $ . Доступные выражения см. в руководстве cmake-generator-expressions(7). Дополнительные сведения об определении свойств системы сборки см. в руководстве по cmake-buildsystem(7).
Указанные включаемые каталоги могут быть абсолютными или относительными путями. Относительный путь будет интерпретироваться как относительный к текущему исходному каталогу (например, CMAKE_CURRENT_SOURCE_DIR ) и преобразован в абсолютный путь перед его сохранением в связанном целевом свойстве. Если путь начинается с выражения генератора, он всегда будет считаться абсолютным путем (за одним исключением, указанным ниже) и будет использоваться без изменений.
Требования к использованию каталогов Include обычно различаются между деревом сборки и деревом установки. Выражения генератора BUILD_INTERFACE и INSTALL_INTERFACE можно использовать для описания отдельных требований к использованию в зависимости от места использования. Относительные пути разрешены в выражении INSTALL_INTERFACE и интерпретируются как относящиеся к префиксу установки. Относительные пути не следует использовать в выражениях BUILD_INTERFACE, поскольку они не будут преобразованы в абсолютные. Например:
Создание перемещаемых пакетов¶
Обратите внимание, что не рекомендуется заполнять INSTALL_INTERFACE INTERFACE_INCLUDE_DIRECTORIES цели абсолютными путями к включаемым каталогам зависимостей. Это жестко закодировало бы в установленных пакетах пути к каталогам для зависимостей, найденные на машине, на которой был создан пакет.
INSTALL_INTERFACE для INTERFACE_INCLUDE_DIRECTORIES подходит только для указания необходимых каталогов включения для заголовков, предоставляемых самой целью, а не для тех, которые предоставляются транзитивными зависимостями, перечисленными в его целевом свойстве INTERFACE_LINK_LIBRARIES. Эти зависимости сами по себе должны быть целевыми объектами, указывающими свои собственные заголовки в INTERFACE_INCLUDE_DIRECTORIES .
См. раздел «Создание перемещаемых пакетов» руководства cmake-packages(7) для обсуждения дополнительной осторожности, которую необходимо соблюдать при указании требований к использованию при создании пакетов для распространения.
Некоторые имена имеют особое значение, если они отображаются как цели.
Предпосылки специальной цели .PHONY считаются фальшивыми целями. Когда придет время подумать о такой цели, make безоговорочно запустит свой рецепт, независимо от того, существует ли файл с таким именем или каково время его последней модификации. См. Фальшивые цели.
Предварительные условия специальной цели .SUFFIXES — это список суффиксов, которые будут использоваться при проверке правил суффиксов. См. устаревшие правила использования суффиксов.
Рецепт, указанный для .DEFAULT, используется для любой цели, для которой не найдены правила (явные или неявные правила). См. «Последнее средство». Если указан рецепт .DEFAULT, каждый файл, указанный в правиле как обязательный, но не целевой, будет выполнять этот рецепт от своего имени. См. Алгоритм поиска по неявному правилу.
Цели, от которых зависит .PRECIOUS, обрабатываются следующим образом: если make уничтожается или прерывается во время выполнения их рецептов, цель не удаляется. См. Прерывание или уничтожение make . Кроме того, если целью является промежуточный файл, он не будет удален после того, как станет не нужен, как это обычно делается. См. Цепочки неявных правил. В этом последнем отношении он пересекается со специальной целью .SECONDARY.
Вы также можете указать целевой шаблон неявного правила (например, ' %.o ') в качестве предварительного файла специальной цели .PRECIOUS, чтобы сохранить промежуточные файлы, созданные правилами, целевые шаблоны которых соответствуют имени этого файла. р>
Цели, от которых зависит .INTERMEDIATE, рассматриваются как промежуточные файлы. См. Цепочки неявных правил. .INTERMEDIATE без предварительных условий не действует.
Цели, от которых зависит .SECONDARY, рассматриваются как промежуточные файлы, за исключением того, что они никогда не удаляются автоматически. См. Цепочки неявных правил.
.SECONDARY без предварительных требований приводит к тому, что все цели рассматриваются как вторичные (т. е. ни одна цель не удаляется, поскольку она считается промежуточной).
Если .SECONDEXPANSION упоминается как цель где-либо в make-файле, то все списки обязательных требований, определенные после его появления, будут расширены во второй раз после того, как все make-файлы будут прочитаны. См. Вторичное расширение.< /p>
Если .DELETE_ON_ERROR упоминается как цель где-либо в make-файле, то make удалит цель правила, если оно было изменено, и его рецепт завершается с ненулевым статусом выхода, как это происходит при получении сигнала. См. Ошибки в рецептах.
Если вы укажете предварительные условия для .IGNORE , make будет игнорировать ошибки при выполнении рецепта для этих конкретных файлов. Рецепт для .IGNORE (если есть) игнорируется.
Если указано как цель без предварительных требований, .IGNORE говорит игнорировать ошибки при выполнении рецептов для всех файлов. Такое использование «.IGNORE» поддерживается только для исторической совместимости. Поскольку это влияет на каждый рецепт в make-файле, это не очень полезно; мы рекомендуем использовать более избирательные способы игнорирования ошибок в определенных рецептах. См. Ошибки в рецептах.
Если вы указываете предварительные условия для .LOW_RESOLUTION_TIME , make предполагает, что эти файлы созданы командами, которые генерируют метки времени с низким разрешением. Рецепт для цели .LOW_RESOLUTION_TIME игнорируется.
Временные метки файлов с высоким разрешением во многих современных файловых системах уменьшают вероятность ошибочного вывода о том, что файл актуален. К сожалению, некоторые хосты не предоставляют возможности установки метки времени файла с высоким разрешением, поэтому такие команды, как ‘ cp -p ’, которые явно устанавливают метку времени файла, должны отбрасывать его часть, меньшую секунды. Если файл создается с помощью такой команды, вы должны указать его как предварительное условие .LOW_RESOLUTION_TIME, чтобы make не сделал ошибочного вывода, что файл устарел. Например:
Поскольку ‘ cp -p ’ отбрасывает долю секунды в отметке времени src, dst обычно немного старше, чем src, даже если он обновлен. Строка .LOW_RESOLUTION_TIME заставляет make считать dst актуальным, если его отметка времени находится в начале той же секунды, что и отметка времени src.
Из-за ограничений формата архива временные метки элементов архива всегда имеют низкое разрешение. Вам не нужно перечислять членов архива в качестве предварительных условий .LOW_RESOLUTION_TIME , так как make делает это автоматически.
Если вы укажете предварительные условия для .SILENT , то make не будет печатать рецепт, используемый для переделки этих конкретных файлов перед их выполнением. Рецепт для .SILENT игнорируется.
Если упоминается как цель без предварительных условий, .SILENT говорит не печатать какие-либо рецепты перед их выполнением. Вы также можете использовать более избирательные способы для отключения определенных командных строк рецепта. См. Повторение рецепта. Если вы хотите отключить все рецепты для определенного запуска make , используйте опцию ‘-s’ или ‘-silent’ (см. Обзор опций).
Простое упоминание в качестве цели указывает make по умолчанию экспортировать все переменные в дочерние процессы. См. раздел «Передача переменных в составную часть».
Если в качестве цели указан .NOTPARALLEL, то этот вызов make будет выполняться последовательно, даже если задана опция ‘-j’. Любая рекурсивно вызванная команда make по-прежнему будет запускать рецепты параллельно (если ее make-файл также не содержит эту цель). Любые предварительные условия для этой цели игнорируются.
Если .ONESHELL упоминается как цель, тогда, когда цель построена, все строки рецепта будут переданы для одного вызова оболочки, а не для каждой строки, вызываемой отдельно (см. Выполнение рецепта).
Если в качестве цели указан .POSIX, make-файл будет проанализирован и запущен в режиме, соответствующем POSIX. Это не означает, что будут приниматься только make-файлы, соответствующие POSIX: все расширенные функции GNU make по-прежнему доступны. Скорее, эта цель заставляет make работать в соответствии с требованиями POSIX в тех областях, где поведение make по умолчанию отличается.
В частности, если указана эта цель, рецепты будут вызываться, как если бы оболочке был передан флаг -e: первая неудачная команда в рецепте вызовет немедленный сбой рецепта.
Любой определенный суффикс неявного правила также считается специальной целью, если он отображается как цель, а также конкатенация двух суффиксов, например ‘.c.o’. Этими целями являются суффиксные правила, устаревший способ определения неявных правил (но все еще широко используемый). В принципе, любое целевое имя может быть таким особенным, если разбить его на две части и добавить обе части в список суффиксов. На практике суффиксы обычно начинаются с «. ’, поэтому эти специальные имена целей также начинаются с ‘ . ’. См. устаревшие правила использования суффиксов.
Читайте также: