Я почти уверен, что lookup("pipe")
будет делать то, что вы хотите, при условии, что скрипт доступен на целевом хосте:
- set_fact:
my_vars: '{{ lookup("pipe", "./my_script.py") | from_json }}'
(замена from_json
на from_yaml
] или что угодно, чтобы привести текстовый вывод из скрипта в структуру данных Python, возможно , что ansible принудительно приведет его автоматически, но явное лучше, чем неявное)
Если вы хотите, чтобы скрипт находится на управляющем компьютере и , вам, скорее всего, придется сделать несколько прыжков с delegate_to:
и некоторым hostvars
ниндзялем, чтобы продвинуть set_fact:
с управляющего хоста на все хосты playbook [ 1112]
редактирование: добавленный больше кода для Вашего обновленного вопроса
правовая оговорка: Я не использовал Ruby через год или так и не установил его на этой машине, таким образом, синтаксис мог бы быть совершенно неправильным. Но понятия корректны.
<час>Тот же самый путь, с классами и переопределенными методами:
class Animal
def MakeNoise
return ""
end
def Sleep
print self.class.name + " is sleeping.\n"
end
end
class Dog < Animal
def MakeNoise
return "Woof!"
end
end
class Cat < Animal
def MakeNoise
return "Meow!"
end
end
animals = [Dog.new, Cat.new]
animals.each {|a|
print a.MakeNoise + "\n"
a.Sleep
}
Построение на предыдущем ответе, это, как Вы могли бы сделать это?
<час> 112-секундное сокращение после разъяснения:
class Animal
def MakeNoise
raise NotImplementedError # I don't remember the exact error class
end
def Sleep
puts self.class.to_s + " is sleeping."
end
end
class Dog < Animal
def MakeNoise
return "Woof!"
end
end
class Cat < Animal
def MakeNoise
return "Meow!"
end
end
animals = [Dog.new, Cat.new]
animals.each {|a|
puts a.MakeNoise
a.Sleep
}
(я оставлю это, как, но победы "self.class.name" ".to_s")
Все ответы до сих пор выглядят довольно хорошими мне. Я думал, что просто упомяну, что целая вещь наследования не совсем необходима. Исключая поведение "сна" на мгновение, мы можем достигнуть целого желаемого результата с помощью ввода утки и опустив потребность создать базовый класс Животных вообще. Поиск с помощью Google для "ввода утки" должен привести к любому количеству объяснений, таким образом, для здесь, позвольте нам просто сказать, "если это идет как утка и шарлатаны как утка..."
поведение "сна" могло быть обеспечено при помощи смесительного модуля, как Массив, Хеш и другой Ruby встроенные классы inclue Счетное. Я не предполагаю, что это обязательно лучше, просто другое и возможно более идиоматически Ruby способ сделать его.
module Animal
def sleep
puts self.class.name + " sleeps"
end
end
class Dog
include Animal
def make_noise
puts "Woof"
end
end
class Cat
include Animal
def make_noise
puts "Meow"
end
end
Вы знаете остальных...
Используя идиоматический Ruby
class Animal
def sleep
puts "#{self.class} is sleeping"
end
end
class Dog < Animal
def make_noise
"Woof!"
end
end
class Cat < Animal
def make_noise
"Meow!"
end
end
[Dog, Cat].each do |clazz|
animal = clazz.new
puts animal.make_noise
animal.sleep
end
Принцип утиного ввода просто, что объект должен ответить на вызываемые методы. Таким образом, что-то как этот может добиться цели также:
module Sleeping
def sleep; puts "#{self} sleeps"
end
dog = "Dog"
dog.extend Sleeping
class << dog
def make_noise; puts "Woof!" end
end
class Cat
include Sleeping
def to_s; "Cat" end
def make_noise; puts "Meow!" end
end
[dog, Cat.new].each do |a|
a.sleep
a.make_noise
end
Это - то, как я записал бы это:
class Animal
def make_noise; '' end
def sleep; puts "#{self.class.name} is sleeping." end
end
class Dog < Animal; def make_noise; 'Woof!' end end
class Cat < Animal; def make_noise; 'Meow!' end end
[Dog.new, Cat.new].each do |animal|
puts animal.make_noise
animal.sleep
end
Это не действительно отличающееся от других решений, но это - стиль, который я предпочел бы.
Это - 12 строк по сравнению с этой 41 строкой (на самом деле, можно сбрить 3 строки при помощи инициализатора набора) от исходного примера C#.Неплохо!
Небольшой вариант решения Manveru, который динамически создает различные типы объектов на основе массива типов классов. Ничего особенного, просто немного яснее.
Species = [Dog, Cat]
Species.each do |specie|
animal = specie.new # this will create a different specie on each call of new
print animal.MakeNoise + "\n"
animal.Sleep
end