Puppet

使用 api 呼叫 Puppet 寫入主機

  • April 16, 2020

我正在嘗試編寫一個呼叫我的託管環境(機架空間雲 atm)來列出伺服器的 puppet 函式,然後更新我的主機文件。

我的 get_hosts 函式目前是這樣的:

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

我有一個 hosts.pp 呼叫它並“應該”將它寫入 /etc/hosts。

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

   hostentry { $hosts: }
}

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

正如您可以想像的那樣,這目前不起作用,並且我在 /etc/puppet/manifests/hosts.pp:2 處收到“符號作為數組索引”錯誤。我想,一旦我意識到我目前做錯了什麼,就會有更多的錯誤發生。

這是一個好主意嗎?有人可以幫我弄清楚如何做到這一點嗎?

更新

終於設法讓這個工作(在評論的幫助下)!這是我的 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

和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 }
}

像這樣編組 namevar 非常討厭,但這是我似乎讓它工作的唯一方法。歡迎任何改進。

我不會說這是一個壞主意,但是您確實需要停止在程式碼中的任何地方使用常量(在 Ruby 中以大寫字母開頭的任何東西都是常量)。

要調試您的問題,您可能希望使用--tracepuppetmaster 呼叫的選項,因此它將列印回溯而不是吃掉真正的異常並給您一個無用的錯誤消息。你的map電話中有一大堆取消引用;我的猜測是您誤解了來自 API 的部分資料結構,並且您的程式碼因該誤解而絆倒。啟動一個調試器(或者隨意地puts瀏覽你的程式碼),你會在很短的時間內看到你做錯了什麼。

引用自:https://serverfault.com/questions/376791