毎度、ググっても出てこない小ネタを取り扱っております。
本記事は個人的な見解であり、筆者の所属するいかなる団体にも関係ございません。
0. はじめに
PowerDNSをいろいろセットアップしたりしてきました。
理由は、Kubernetesクラスターから参照されるDNSサーバーを作りたい。
なぜなら、ExternalDNSで自動的にIngressからレコードを登録させたいから。
なのですが、何だか随分と遠くまで来た気がします(遠い目)。
さて、AnsibleでZoneとレコードを設定できて、バンザーイと思ったのですが意外な伏兵にやられてしまいました。Ansibleのkpfleming.powerdns_authは、Zone単位でしか冪等性を保てないということです。
どういうことか?というと、kpfleming.powerdns_auth
でレコードを登録します。この時に、playbook.ymlに必要なレコードを登録しておけば、問題ありません。
もしレコードが増えても、playbook.ymlに必要なレコードを追加して、Ansibleを実行するだけです。何の問題もありません。
しかし、ここでPowerDNSサーバーにKubernetesクラスターのExternalDNSで自動的に登録されたDNSレコードがあったとしたらどうでしょうか?
「え?別に問題ないでしょ?Playbookファイルに登録されたレコードだけ追加されるんだから」と思うかもしれません。
ここで出てくる問題が、「kpfleming.powerdns_authが、Zone単位でしか冪等性を保てない」という部分です。
上記の問題のために、PowerDNSのZoneとレコードをAnsibleで設定する #PowerDNS-Admin - Qiita では、Playbookファイルのゾーンを更新するために、以前のZoneファイルを削除しています。
雑に図示すると以下のような感じです。
Ansibleでレコードを追加しようとすると、そこで管理されていないレコード(ExternalDNSで自動的に登録されたレコード)が削除されるという鬼畜な状況になります。
じゃあ、どうすればいいかという話になるのですが、どうしようもないのでバックアップする方法をとります。
1. PowerDNSのレコードを取得して、yamlファイルに保存するスクリプト
Ruby言語で作りました。
Gistに保存したので、以下からダウンロードしてください。
実行すると
backup_{zone名}.yaml
ファイルが保存されます。
次工程のAnsibleのタスクに渡したいので必要な情報しか取得しないようになっています。
2. まとめ
こちらのRubyスクリプトは生成AIで作ったのですが、ここまで自然言語でスクリプトを組めるのなら、もうローコードツールとか不要じゃね?と思うレベルです。