てくなべ

インフラ、ネットワーク、自動化などの技術的なことを書いていきます。

Ansible の標準lookup pluginの「dig」で名前解決する

f:id:akira6592:20170525222437p:plain

はじめに

Ansible には標準で「dig」という名前解決ができる lookup plugin があることを知りました。

Lookups — Ansible Documentation

基本的な書式は lookup('dig', 'example.com.') です。 公式ドキュメントに実行例がなかったので試してみることにします。

準備

内部で dnspython というパッケージを利用するのであらかじめインストールしておきます。

pip install dnspython

なお、dnspython をインストールしていない状態で playbook を実行すると以下のエラーが表示されます。

fatal: [localhost]: FAILED! => {"failed": true, "msg": "An unhandled exception occurred while running the lookup plugin 'dig'. Error was a <class 'ansible.errors.AnsibleError'>, original message: Can't LOOKUP(dig): module dns.resolver is not installed"}

■ Aレコードを解決

playbook

特にタイプの指定をしない場合はAレコードとなります。

---
- hosts: localhost
  gather_facts: no

  tasks:
    - debug: msg="The IPv4 address for example.com. is {{ lookup('dig', 'example.com.')}}"

実行結果

TASK [debug] *******************************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "changed": false,
    "msg": "The IPv4 address for example.com. is 93.184.216.34"
}

■ TXTレコード

playbook(抜粋)

qtype でタイプを指定できます。

    - debug: msg="The TXT record for example.org. is {{ lookup('dig', 'example.org.', 'qtype=TXT') }}"

以下の書き方も同様の動作をします。

    - debug: msg="The TXT record for example.org. is {{ lookup('dig', 'example.org./TXT') }}"

実行結果(抜粋)

TASK [debug] *******************************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "changed": false,
    "msg": "The TXT record for example.org. is v=spf1 -all"
}

■ MXレコードを解決

playbook(抜粋)

以下のように with_itemswantlist=True の組み合わせで、複数の値を利用したループ処理が行えます。

    - debug: msg="One of the MX records for gmail.com. is {{ item }}"
      with_items: "{{ lookup('dig', 'gmail.com./MX', wantlist=True) }}"

実行結果(抜粋)

TASK [debug] *******************************************************************************************************************************************************************************************************************
ok: [localhost] => (item=10 alt1.gmail-smtp-in.l.google.com.) => {
    "item": "10 alt1.gmail-smtp-in.l.google.com.",
    "msg": "One of the MX records for gmail.com. is 10 alt1.gmail-smtp-in.l.google.com."
}
ok: [localhost] => (item=5 gmail-smtp-in.l.google.com.) => {
    "item": "5 gmail-smtp-in.l.google.com.",
    "msg": "One of the MX records for gmail.com. is 5 gmail-smtp-in.l.google.com."
}
ok: [localhost] => (item=40 alt4.gmail-smtp-in.l.google.com.) => {
    "item": "40 alt4.gmail-smtp-in.l.google.com.",
    "msg": "One of the MX records for gmail.com. is 40 alt4.gmail-smtp-in.l.google.com."
}
ok: [localhost] => (item=20 alt2.gmail-smtp-in.l.google.com.) => {
    "item": "20 alt2.gmail-smtp-in.l.google.com.",
    "msg": "One of the MX records for gmail.com. is 20 alt2.gmail-smtp-in.l.google.com."
}
ok: [localhost] => (item=30 alt3.gmail-smtp-in.l.google.com.) => {
    "item": "30 alt3.gmail-smtp-in.l.google.com.",
    "msg": "One of the MX records for gmail.com. is 30 alt3.gmail-smtp-in.l.google.com."
}

■ PTRレコード(逆引き)を解決

逆引きもできます。

    - debug: msg="Reverse DNS for 198.41.0.4 is {{ lookup('dig', '198.41.0.4/PTR') }}"

以下2つの書き方も同様の動作をします。

    - debug: msg="Reverse DNS for 198.41.0.4 is {{ lookup('dig', '4.0.41.198.in-addr.arpa./PTR') }}"
    - debug: msg="Reverse DNS for 198.41.0.4 is {{ lookup('dig', '4.0.41.198.in-addr.arpa.', 'qtype=PTR') }}"

実行結果(抜粋)

TASK [debug] *******************************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "changed": false,
    "msg": "Reverse DNS for 198.41.0.4 is a.root-servers.net."
}

■ ネームサーバー指定でAレコードを解決

playbook(抜粋)

デフォルトではシステムで指定されているネームサーバーを利用しますが、@8.8.8.8のようにすることで個別に指定することができます。

    - debug: msg="Querying 8.8.8.8 for IPv4 address for example.com. produces {{ lookup('dig', 'example.com', '@8.8.8.8') }}"

実行結果(抜粋)

TASK [debug] *******************************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "changed": false,
    "msg": "Querying 8.8.8.8 for IPv4 address for example.com. produces 93.184.216.34"
}

 

■ その他のレコード

今回試したタイプ以外にもAAAAやMX、SRVなど様々なタイプに対応しています。 詳細は公式ドキュメントを参照してください。 Lookups — Ansible Documentation

■ さいごに

正直あまり活用方法が思い浮かびませんでしたが、何かの時に思い出していただければ幸いです。