Il burattino scrive gli host utilizzando la chiamata api

Sto provando a scrivere una function di fantoccio che chiama il mio ambiente di hosting (atm rackspace cloud) per elencare i server, quindi aggiornare il mio file host.

La mia function get_hosts è attualmente:

require 'rubygems' require 'cloudservers' module Puppet::Parser::Functions newfunction(:get_hosts, :type => :rvalue) do |args| unless args.length == 1 raise Puppet::ParseError, "Must provide the datacenter" end DC = args[0] USERNAME = DC == "us" ? "..." : "..." API_KEY = DC == "us" ? "..." : "..." AUTH_URL = DC == "us" ? CloudServers::AUTH_USA : CloudServers::AUTH_UK DOMAIN = "..." cs = CloudServers::Connection.new(:username => USERNAME, :api_key => API_KEY, :auth_url => AUTH_URL) cs.list_servers_detail.map {|server| server.map {|s| { s[:name] + "." + DC + DOMAIN => { :ip => s[:addresses][:private][0], :aliases => s[:name] }}} } end end 

E ho un hosts.pp che chiama questo e 'dovrebbe' scrivere su / etc / hosts.

 class hosts::us { $hosts = get_hosts("us") hostentry { $hosts: } } define hostentry() { host{ $name: ip => $name[ip], host_aliases => $name[aliases] } } 

Come potete immaginare, questo non è attualmente in corso e ho ottenuto un 'simbolo come indice di matrix all'indirizzo /etc/puppet/manifests/hosts.pp:2'. Immagino, una volta che ho capito che cosa sto attualmente male, ci saranno più errori da venire.

E 'questa una buona idea? Qualcuno può aiutarmi a capire come farlo?

Aggiornare

Finalmente riuscito a get questo lavoro (con l'aiuto dei commenti)! Ecco il mio get_hosts.rb:

 require 'rubygems' require 'cloudservers' module Puppet::Parser::Functions newfunction(:get_hosts, :type => :rvalue) do |args| unless args.length == 1 raise Puppet::ParseError, "Must provide the datacenter" end dc = args[0] username = dc == "us" ? "..." : "..." api_key = dc == "us" ? "..." : "..." auth_url = dc == "us" ? CloudServers::AUTH_USA : CloudServers::AUTH_UK domain = "...." cs = CloudServers::Connection.new(:username => username, :api_key => api_key, :auth_url => auth_url) cs.list_servers_detail.map {|server| server[:name] + "." + dc + domain + "," + server[:addresses][:private][0] + "," + server[:name] } end end 

e le hosts.pp

 class hosts::us { $hosts = get_hosts("us") hostentry { $hosts: } } define hostentry() { $parts = split($name, ',') $address = $parts[0] $ip = $parts[1] $aliases = $parts[2] host{ $address: ip => $ip, host_aliases => $aliases } } 

E 'abbastanza brutto che mette in marcia la namevara come quella, ma era l'unico modo in cui mi sembrava di farlo funzionare. Qualsiasi miglioramento benvenuto.

2 Solutions collect form web for “Il burattino scrive gli host utilizzando la chiamata api”

Non lo definirei una ctriggers idea, ma hai davvero bisogno di smettere di usare costanti ovunque nel tuo codice (tutto ciò che inizia con una lettera maiuscola in Ruby è una costante).

Per eseguire il debug del tuo problema, probabilmente vuoi usare l'opzione --trace per la tua invocazione del burattinaio, in modo da printingre una backtrace invece di mangiare l'exception reale e darvi un messaggio di errore inutile. Hai un mucchio di dereferencing in corso nelle chiamate in map ; la mia ipotesi sarebbe che tu abbia frainteso una parte della struttura dei dati che esce dall'API e il tuo codice sta avventurandosi su quel malinteso. Spara un debugger (o libera spruzzare puts il codice) e vedrai quello che hai sbagliato in un ordine abbastanza breve.

Dividerei questa funzionalità in modo diverso.

Utilizza la function per build i dati puro in un hash di hash che rappresenta l'elenco delle risorse host.

Quindi utilizzare la function create_resources per creare risorse ospiti effettive da questi dati:

http://docs.puppetlabs.com/references/2.7.12/function.html#createresources

L'esempio che vi dovrebbe dare è sufficiente per andare avanti:

  # A hash of user resources: $myusers = { 'nick' => { uid => '1330', group => allstaff, groups => ['developers', 'operations', 'release'], } 'dan' => { uid => '1308', group => allstaff, groups => ['developers', 'prosvc', 'release'], } } create_resources(user, $myusers) 

Ha senso questo?

Quindi puoi evitare il tipo definito, e puoi fare tutti i dati che non sono presenti nella chiamata di function per get il hash degli hash e hai una buona separazione tra la function che raccoglie i dati e la function che installa le risorse.

Questo dovrebbe risolvere each necessità di iterazione classica se capisco correttamente il tuo problema.

Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.