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動作遅延の解消
解消方法は単純で、以下のいずれかの対応をすれば良い。
まとめ - Ansibleの動作が遅いときに確認・修正する項目
Ansibleの動作が遅いときは、DNSのタイムアウトを疑うといい。tcpdumpで原因調査し、DNSの問題だと分かったら、DNSサーバに必要なレコードを登録するか、DNSサーバでNXDomainを返すようにすることで問題が解消する。