After a lot of trial and error here's what I came up with.  It may not be 
elegant, but it works.  It will pull in all hosts that match on the 
${environment} in this case "test", so it pulled in test-search001, 
test-search002, test-search003 & test-search004.

#Custom function searchparse
module Puppet::Parser::Functions
  newfunction(:searchparse, :type => :rvalue) do |args|
    oldarray  = args[0]
    newarray = Array.new
    pos = 0 
    oldarray.each do |value|
      newarray.push(value['name'])
      pos = pos + 1 
    end 
    return newarray
  end 
end

#Final puppet code
$cluster_name = "${environment}-search"
  class { 'java':
    package => 'java-1.8.0-openjdk',
  }

  package { 'java-1.7.0-openjdk':
    ensure  => absent,
    require => Class['java'],
  }

  package { 'jq':
    ensure => present,
  }

  $f = {
    item           => 'hosts',
    search         => "${cluster_name}",
    filter_results => 'fqdn',
    per_page       => '20',
    foreman_user   =>  "${puppet_user}",
    foreman_pass   =>  "${puppet_pass}"
  }
  $hostlist = foreman($f)
  $hostlist2 = $hostlist['results']
  $hostlist3 = searchparse($hostlist2)

#from this site: https://github.com/elastic/puppet-elasticsearch/issues/647
  file { '/usr/local/bin/checklicense.sh':
    ensure  => present,
    owner   => 'root',
    group   => 'root',
    mode    => '0755',
    source  => 'puppet:///modules/fm_search/checklicense.sh',
    require => Package['jq'],
  }

  file { '/etc/elasticsearch/license.json':
    ensure  => present,
    content => "${elastic_license}",
    require => Class['elasticsearch'],
  }

  class { 'elasticsearch':
    repo_version => '5.x',
    manage_repo  => true,
    java_install => false,
    jvm_options  => [
      "-Xms${xms}",
      "-Xmx${xmx}"
    ],
    config => { 'cluster.name' => $cluster_name }
  }

  $elastic_config = {
    'node.name'                          => $hostname,
    'network.host'                       => '0.0.0.0',
    'discovery.zen.ping.unicast.hosts'   => $hostlist3,
    'xpack.security.enabled'             => 'false',
    'discovery.zen.minimum_master_nodes' => '2',
    'bootstrap.memory_lock'              => 'true',
  }

  elasticsearch::instance { $hostname:
    config => $elastic_config
  }

  Elasticsearch::Plugin { instances => $hostname }
  elasticsearch::plugin { 'x-pack': }

  class { 'kibana':
    config          => {
      'server.host' => '0.0.0.0',
    },
    require => Class['elasticsearch'],
  }

  kibana_plugin { 'x-pack': }

  exec { 'install license':
    command  => 'curl -XPUT http://localhost:9200/_xpack/license -d 
@/etc/elasticsearch/license
.json ; sleep 5; /etc/init.d/kibana restart',
    onlyif   => '/etc/elasticsearch/checklicense.sh',
    provider => 'shell',
    require  => 
[File['/etc/elasticsearch/license.json'],File['/usr/local/bin/checklicense.sh']
,Class['elasticsearch'],Class['kibana']]
  }

Matt


On Tuesday, August 8, 2017 at 10:13:44 AM UTC-4, Matt Shields wrote:
>
> I'm trying to get a list of hostnames to populate an array from the 
> Foreman function.  We have servers that are dedicated to clients and 
> non-production.  We use naming {clientid}-{server_type}.  So for example, 
> test1-search001, test1-search002, test2-search001, test2-search003, 
> client1-search001, client1-search002.
>
> With my code below, I'm able to get back what appears to be json with the 
> following error.  Line 111 is the discovery.zen.ping.unicast.hosts line.
>
>   $search_hostnames = "${clientid}-search"
>
>   $f = { 
>     item           => 'fact_values',
>     search         => "${search_hostnames}",
>     filter_results => 'fact = hostname',
>     per_page       => '20',
>     foreman_user   => "${puppet_user}",
>     foreman_pass   => "${puppet_pass}"
>   }
>
>   $hostlist = foreman($f)
>
>   file { '/root/search.txt':
>     ensure   => present,
>     content  => "${hostlist}",
>   }
>
>   elasticsearch::instance { $hostname:
>     config                                => {
>       'node.name'                         => $hostname,
>       'network.host'                      => '0.0.0.0',
>       'path.data'                         => '/opt/elastic/search',
>       'discovery.zen.ping.unicast.hosts'  => ${hostlist},
>     },  
>   }
>
> Notice: Local environment: 'production' doesn't match server specified 
> node environment 'test', switching agent to 'test'.
> Info: Retrieving pluginfacts
> Info: Retrieving plugin
> Info: Loading facts
> Error: Could not retrieve catalog from remote server: Error 500 on SERVER: 
> Server Error: Syntax error at '}' at 
> /etc/puppetlabs/code/modules/fm_search/manifests/init.pp:111:56 on node 
> test-search001.useast.mydomain.com
> Warning: Not using cache on failed catalog
> Error: Could not retrieve catalog; skipping run
>
>
> {total => 0, subtotal => 4, page => 1, per_page => 20, search => 
> test-search, sort => {by => , order => }, results => {
> test-search001.useast.mydomain.com => {networking::hostname => 
> test-search001, hostname => test-search001, networking::fqdn => 
> test-search001.useast.mydomain.com, clientcert => 
> test-search001.useast.mydomain.com, fqdn => 
> test-search001.useast.mydomain.com}, test-search002.useast.mydomain.com 
> => {hostname => test-search002, networking::hostname => test-search002, 
> clientcert => test-search002.useast.mydomain.com, fqdn => 
> test-search002.useast.mydomain.com, networking::fqdn => 
> test-search002.useast.mydomain.com}, test-search003.useast.mydomain.com 
> => {hostname => test-search003, networking::hostname => test-search003, 
> fqdn => test-search003.useast.mydomain.com, networking::fqdn => 
> test-search003.useast.mydomain.com, clientcert => 
> test-search003.useast.mydomain.com}, test-search004.useast.mydomain.com 
> => {hostname => test-search004, networking::hostname => test-search004, 
> fqdn => test-search004.useast.mydomain.com, clientcert => 
> test-search004.useast.mydomain.com, networking::fqdn => 
> test-search004.useast.mydomain.com}}}
>

-- 
You received this message because you are subscribed to the Google Groups 
"Foreman users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to foreman-users+unsubscr...@googlegroups.com.
To post to this group, send email to foreman-users@googlegroups.com.
Visit this group at https://groups.google.com/group/foreman-users.
For more options, visit https://groups.google.com/d/optout.

Reply via email to