さくらのクラウドに立ち上げたサーバをスクリプトでDNSに登録する

少し前にさくらのクラウドDNSができました。 これは何がいいかというとAPIがあることです。 早速、さくらのクラウドからサーバとIPアドレスを引っ張ってきて、 クラウドDNSに登録するというスクリプトを組んでみました。

まず、準備

  • 設定からAPIキー行ってAPIキーを登録しておきます。
  • そのキーを環境変数TOKENとSECRETに登録しておきます。
  • クラウドサーバあるゾーンを環境変数ZONEに登録しておきます。(石狩1だとis1aです)
  • クラウドDNSにゾーンを登録し、リソースIDを環境変数DNSIDに登録してきます。
  • ネームサーバはゾーンを登録した時に決定されるので、 変更しておいてください。

前提

require 'saklient/cloud/api'
require 'pp'

TOKEN = ENV['TOKEN']
SECRET = ENV['SECRET']
ZONE = ENV['ZONE']
DNSID = ENV['DNSID']

URLBase = "example.com"
URLPrefixGlobal = ""
URLPrefixLocal  = "lan"

# クラウドDNSに別枠で追加しておきたいレコード
AdditionalRecordA = {
  "db.mn": "192.168.1.1",
  "db.ln": "10.0.0.1",
  "www": "192.168.1.2",
  "@": "192.168.1.3"
}

api = Saklient::Cloud::API.authorize(TOKEN, SECRET, ZONE)

dns = api.common_service_item.get_by_id(DNSID)

new_record = []

# クラウドに登録されているレコード一覧(使っていない)
cloud_record = dns.raw_settings[:DNS][:ResourceRecordSets]

# クラウドのサーバ一覧からレコードを取り出す
cloud_servers = api.server.find
cloud_servers.each do |server|
  name=server.name.sub(URLBase,'').sub(/\.$/,'')
  server.ifaces.each do |iface|
    if iface.ip_address
      new_record << {Name: "#{name}.#{URLPrefixGlobal}".gsub(/\.\./, '.').sub(/\.$/, ''), RData: iface.ip_address, Type: "A"}
    elsif iface.user_ip_address
      new_record << {Name: "#{name}.#{URLPrefixLocal}".gsub(/\.\./, '.').sub(/\.$/, ''), RData: iface.user_ip_address, Type: "A"}
    end
  end
end

AdditionalRecordA.each do |key, val|
  if key==:'@'
    new_record << {Name: key, RData: val, Type: "A"}
  else
    new_record << {Name: "#{key}", RData: val, Type: "A"}
  end
end

pp new_record

dns.raw_settings[:DNS][:ResourceRecordSets] = new_record

dns.save # これをやらないと保存されない