さくらのクラウドに立ち上げたサーバをスクリプトでDNSに登録する
少し前にさくらのクラウドにDNSができました。 これは何がいいかというとAPIがあることです。 早速、さくらのクラウドからサーバとIPアドレスを引っ張ってきて、 クラウドDNSに登録するというスクリプトを組んでみました。
まず、準備
- 設定からAPIキー行ってAPIキーを登録しておきます。
- そのキーを環境変数TOKENとSECRETに登録しておきます。
- クラウドサーバあるゾーンを環境変数ZONEに登録しておきます。(石狩1だとis1aです)
- クラウドDNSにゾーンを登録し、リソースIDを環境変数DNSIDに登録してきます。
- ネームサーバはゾーンを登録した時に決定されるので、 変更しておいてください。
前提
- クラウドサーバはdb.example.comのような名前と、Ether0と1にそれぞれIPアドレスをクラウドコンソール上から設定します。
- グローバルIPはdb.example.comのように登録されます。
- ローカルIPはdb.lan.example.comのように登録されます。
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 # これをやらないと保存されない