3 votos

Marioneta de escribir hosts utilizar llamadas de api

Estoy tratando de escribir un títere de la función que llama a mi entorno de alojamiento (rackspace cloud atm) a la lista de servidores, a continuación, actualizar el archivo hosts.

Mi get_hosts función actualmente es este:

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

Y tengo un anfitriones.pp que se llama a este y 'debe' escribir en /etc/hosts.

class hosts::us {
    $hosts = get_hosts("us")

    hostentry { $hosts: }
}

define hostentry() {
  host{ $name: ip => $name[ip], host_aliases => $name[aliases] }
}

Como se puede imaginar, esto no es actualmente trabajando y me estoy poniendo un Símbolo como índice de la matriz en /etc/puppet/manifiestos/hosts.pp:2' error. Me imagino que, una vez que me he dado cuenta de lo que actualmente estoy haciendo mal habrá más errores a venir.

Es esta una buena idea? Alguien me puede ayudar averiguar cómo hacer esto?

Actualización

Finalmente se las arregló para conseguir este trabajo (con la ayuda de los comentarios) ! Aquí está mi 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

y los anfitriones.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 }
}

Es bastante desagradable encauzar el namevar como eso, pero era la única manera que podría parecer para que funcione. Cualquier mejora de la recepción.

1voto

Ryan Sampson Puntos 2898

No diría que fue una mala idea, pero usted realmente necesita para dejar de usar constantes en todas partes en el código (algo que empieza con una letra mayúscula en Ruby es una constante).

Para depurar el problema, es probable que desee utilizar el --trace opción para su puppetmaster invocación, así que voy a imprimir una traza, en lugar de comer la excepción real y te da un mensaje de error inútil. Tienes un montón de eliminar pasando en su map llamadas; mi conjetura sería que te he entendido mal la parte de la estructura de datos que viene de fuera de la API y su código es tropezar con la incomprensión. El fuego de un depurador (o espolvorear generosamente puts a través de su código) y verás lo que tienes mal en muy poco tiempo.

0voto

Nigel Kersten Puntos 76

Me gustaría separar esta funcionalidad de forma diferente.

El uso de su función de construir la pura datos en un hash de hashes en representación de la lista de recursos de host.

A continuación, utilice el create_resources la función para crear un host real de los recursos de datos:

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

El ejemplo no debe darle suficiente para salir:

    # 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)

¿Que sentido?

A continuación, puede evitar el tipo definido, y usted puede hacer todos los datos fotográficos en la llamada a la función para obtener el hash de hash, y tienes una buena separación entre la función que recoge los datos, y la función que crea una instancia de recursos.

Esto debería resolver cualquier necesidad para el clásico de la iteración si estoy en la comprensión de su problema correctamente.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: