designetwork

ネットワークを軸としたIT技術メモ

Ansibleの動作が遅いときに確認・修正する項目

Ansibleを使い始めたときに、設定量が多くなってくると動作が遅くなった。原因切り分けして解消したので確認ポイントをメモする。(CentOS7.3 ansible 2.2.1.0)

結果としてDNSタイムアウト待ちが発生していた。なお、FQDN以外のlocalhostでのAレコード(正引き)、IPアドレスでの指定でもPTRレコード(逆引き)の問い合わせをする。

tcpdumpによる切り分け

ansible-playbookを実行すると毎回決まった時間がかかっているように見える。固定的に遅い場合は大抵何かのタイムアウト待ちで、DNSが多い。tcpdumpで動作を確認する。

まず、インタフェース情報を確認する。

$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    ...
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
    ...

確認したインタフェースでDNS(53)のパケットのみをキャプチャする。-nnオプションを付けることで、Well-Knownポート番号の文字列変換を無効化する。ポート53の場合はdomainと表示されるが逆に分かりづらい。(キャプチャは正常時のシーケンス)

$ sudo tcpdump -i ens192 -nn port 53
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens192, link-type EN10MB (Ethernet), capture size 65535 bytes
07:30:16.609964 IP 192.168.1.75.40927 > 192.168.1.77.53: 19540+ A? h-cent-mng01.designet.local. (45)
07:30:16.610591 IP 192.168.1.77.53 > 192.168.1.75.40927: 19540* 1/0/0 A 192.168.1.75 (61)
07:30:16.610660 IP 192.168.1.75.40927 > 192.168.1.77.53: 1216+ AAAA? h-cent-mng01.designet.local. (45)
07:30:16.611196 IP 192.168.1.77.53 > 192.168.1.75.40927: 1216* 0/1/0 (106)
07:30:16.822439 IP 192.168.1.75.43660 > 192.168.1.77.53: 18414+ PTR? 75.1.168.192.in-addr.arpa. (43)
07:30:16.822750 IP 192.168.1.77.53 > 192.168.1.75.43660: 18414* 1/0/0 PTR h-cent-mng01.designet.local. (84)

このようにDNSでA, AAAA, PTRの各レコードを問い合わせていることが分かる。

Ansible hostsファイルでの指定による差異

DNSの問題と聞くと、FQDN指定の場合を想定するかと思う。しかし、Ansibleではlocalhost及びIPアドレスでの対象サーバ指定の場合でも各レコードの名前解決を試みる。そのため、「まだDNS登録していないから暫定でIPアドレス指定で...」としている場合に、動作遅延の問題が顕在化する。

Ansible動作遅延の解消

解消方法は単純で、以下のいずれかの対応をすれば良い。

  • A, AAAA, PTRレコードをDNSサーバに登録する
  • DNSサーバでNon-Exist(NXDomain)を返すようにする(タイムアウト待ち防止)

まとめ - Ansibleの動作が遅いときに確認・修正する項目

Ansibleの動作が遅いときは、DNSタイムアウトを疑うといい。tcpdumpで原因調査し、DNSの問題だと分かったら、DNSサーバに必要なレコードを登録するか、DNSサーバでNXDomainを返すようにすることで問題が解消する。

他にもyumのProxyなどの要因はあるが、tcpdumpで異常通信を確認する今回のプロセスは有効に機能する。