Определите переменную, которая будет использоваться в пакетном скрипте
У меня есть пакетный скрипт, который устанавливает сервис. Я использую Puppet для установки этого сервиса на Windows, используя Powershell.
C:\graylog-collector\bin\graylog-collector-service.bat install GrayLogCollector
Использование вышеупомянутого через PS установило бы службу как ее простой запуск файла.bat. Эта услуга требует JAVA_HOME
которая уже установлена как системная переменная env, но Puppet этого не знает. Я пытаюсь передать значение JAVA_HOME
перед запуском этого командного файла. Я пробовал несколько разных вещей, например:
$JAVA_HOME = [Environment]::GetEnvironmentVariable("JAVA_HOME", "Machine"); C:\graylog-collector-0.5.0\bin\graylog-collector-service.bat install GrayLogCollector
Я не хочу редактировать файл и не хочу объявлять переменную снова. Я пытаюсь использовать то, что уже установлено в системе. В основном, пытаясь получить значение JAVA_HOME
и скормить его в файл.bat.
2 ответа
Вы можете объединить свои пакетные сценарии и сценарии PowerShell в один пакетный сценарий, чтобы выполнить свою работу. Например:
<# :
@echo off
setlocal
set "JAVA_HOME=..." % rem : this will be established in PowerShell too
powershell /nologo /executionpolicy bypass^
"&{[ScriptBlock]::Create((Get-Content '%~f0') -join [Char]10).Invoke(@(&{$args}%*))}"
endlocal
exit /b
#>
"PowerShell args...$($args.ForEach{$_})"
Get-ChildItem env:
Сохраните это как пакетный скрипт (расширение.bat или.cmd), затем попробуйте запустить mybatch.cmd a b c
в cmd или хост PowerShell. Надеюсь это поможет.
Я бы, вероятно, создал пользовательский факт для разрешения JAVA_HOME
переменная окружения:
Facter.add(:java_home) do
setcode do
ENV['JAVA_HOME']
end
end
или (более сложный с отступлением для определения местоположения java
двоичный файл, если переменная окружения не установлена):
Facter.add(:java_home) do
setcode do
begin
ENV['JAVA_HOME'] || File.dirname(File.dirname(`readlink -f $(which java) 2>/dev/null`.chomp))
rescue
nil
end
end
end
Facter.add(:java_home) do
confine :osfamily => 'Windows'
setcode do
begin
ENV['JAVA_HOME'] || File.dirname(File.dirname(`where java 2>nul`.lines[0].chomp))
rescue
nil
end
end
end
Назовите файл java_home.rb
и поместите его в правильный каталог. Мы обычно размещаем такие факты в lib/facter
нашего модуля профилей приложений.
Затем вы можете использовать этот факт, чтобы изменить среду exec
ресурс:
exec { 'Install GraylogCollector service':
command => 'graylog-collector-service.bat install GrayLogCollector',
unless => 'sc query GraylogCollector',
path => [ 'C:\Windows', 'C:\Windows\system32', 'C:\graylog-collector\bin' ],
environment => [ "JAVA_HOME=${::java_home}" ],
logoutput => true,
}
NB: Я не могу проверить это прямо сейчас, поэтому я не совсем уверен, можно ли запустить пакетный сценарий напрямую (хотя я бы ожидал, что это произойдет). Если это не просто изменить строку на
command => 'cmd.exe /c "graylog-collector-service.bat install GrayLogCollector"',