2016-11-01 12 views
0

Я пытаюсь выяснить, как я могу использовать факты Facter в файле erb-файла Ruby, настроенном на Puppet.Как использовать значения Facter в шаблоне Ruby с Puppet

Пример переменной шаблона рубин

zk.l.conn= 

Ожидаемый результат конфигурационного файла из кукольного

zk.l.conn=ip-xx-31-xx-xxx.ec2.internal:2181,ip-xxx-31-xx- xxx.ec2.internal:2181,ip-172-xxx-xxx-xx.ec2.internal:2181 

Facter фактические данные:

"zk-internal": [ 
    { 
    "host": "ip-xx-31-xx-xxx.ec2.internal", 
    "port": 2181, 
    "priority": 2, 
    "weight": 10 
    }, 
    { 
    "host": "ip-xxx-31-xx-xxx.ec2.internal", 
    "port": 2181, 
    "priority": 3, 
    "weight": 10 
    }, 
    { 
    "host": "ip-172-xxx-xxx-xx.ec2.internal", 
    "port": 2181, 
    "priority": 1, 
    "weight": 10 
    } 
], 

ответ

2

Короче:

zk.1.conn=<%= @facts['zk-internal'].map { |h| "#{h['host']}:#{h['port']}" }.join(',') %> 

@facts['zk-internal'] позволяет получить доступ к значению структурированного факта, потому что @zk-internal не будет допустимым именем переменной из-за дефиса.

.map { |h| "#{h['host']}:#{h['port']}" } выполняет итерацию по каждому элементу и возвращает новые строки, содержащие «host: port» из каждого элемента, поэтому у вас есть массив хостов/портов.

.join(',') возвращает строку из массива с каждым элементом, разделенным запятой.

Это выходы:

zk.1.conn=ip-xx-31-xx-xxx.ec2.internal:2181,ip-xxx-31-xx-xxx.ec2.internal:2181,ip-172-xxx-xxx-xx.ec2.internal:2181 

(Испытано на Puppet 4.7)

+0

Clever использовать '.map', чтобы сохранить его в виде массива во время итерации, так что вы можете использовать' .join' для запятых. –

+0

Отлично! но если мне нужно добавить порт для каждого ip, например, ip-xx-31-xx-xxx.ec2.internal: 2181? – rocky

+0

Вы измените это во второй части - '.map {| h | "# {h ['host']}: # {h ['port']}"} 'теперь будет возвращать массив строк хоста: port. –