LINUX.ORG.RU
решено ФорумAdmin

Puppet5 функции

 ,


0

2

Как заставить функцию возвращать значение?

/mymodule/lib/puppet/functions/myfunc.rb

Puppet::Functions.create_function(:myfunc) do
  dispatch :myfunc do
    param 'String', :package_name
  end

  def myfunc(package_name)
    return system "/usr/bin/dpkg-query -W -f='${Version}'", package_name
  end
end

/environment/production/manifests/site.pp
param = myfunc("dpkg");
...

Задача написать ф-ю, которая будет возвращать версию установленного пакета по его имени.

return не работает.

★★

Последнее исправление: Flotsky (всего исправлений: 1)
Ответ на: комментарий от Deleted

поправил, но проблема именно в

return system "/usr/bin/dpkg-query -W -f='${Version}'", package_name
в манифест возвращается ничего пример из puppetlabs/stdlib, где значение возвращается
require 'yaml'

Puppet::Functions.create_function(:to_yaml) do
  dispatch :to_yaml do
    param 'Any', :data
  end

  def to_yaml(data)
    data.to_yaml
  end
end

Flotsky ★★
() автор топика
Ответ на: комментарий от Flotsky

Попробуй добавить в dispatch

return_type 'String'

Deleted
()
Ответ на: комментарий от Deleted

return тут не нужен, т.к. ruby-функция возвращает значение последнего выполненного выражения.

theNamelessOne ★★★★★
()

Метод Kernel#system возвращает true, false или nil. Для того, чтобы получить вывод команды, воспользуйся оператором backtick (и надо не забыть заэскейпить package_name, если он задаётся пользователем):

require 'shellwords'

def myfunc(package_name)
  `/usr/bin/dpkg-query -W -f -f='${Version}' #{Shellwords.escape(package_name)}`
end

Либо можно использовать один из методов модуля Open3, либо popen.

theNamelessOne ★★★★★
()
Последнее исправление: theNamelessOne (всего исправлений: 4)
Ответ на: комментарий от theNamelessOne
require 'shellwords'

def get_package_version(package_name)
  `/usr/bin/dpkg-query -W -f='${Version}' #{Shellwords.escape(package_name)}`
  end

возвращает ничего, а вот

`/usr/bin/dpkg-query -W -f='${Version}' dpkg `
именно с пробелом после dpkg возвращает правильную версию
pkg = "dpkg"
`/usr/bin/dpkg-query -W -f='${Version}' #{Shellwords.escape(pkg)}`
тоже возвращает версию
про open3/popen ещё не читал

Flotsky ★★
() автор топика
Ответ на: комментарий от Flotsky

заметил, что всё работает если сообщать другое имя пакета
с apt, dpkg... всё отрабатывает на ура, но с ejabberd молчит
если в самой системе выполнить

/usr/bin/dpkg-query -W -f='${Version}' ejabberd
получаю правильный ответ

Flotsky ★★
() автор топика

решено, проблема со списком перекочевала сюда.

Flotsky ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.