Ansileシンプルで好きで使ってますが、たまにパフォーマンスが気になってました。
つい先日Ansibleの公式ブログにパフォーマンスチューニングのtipsが書かれてたので自分が知らなかったところを中心に紹介します。
常識的なものも多いかもですがご容赦ください。
パッケージインストールを効率化する
- yumとかでパッケージインストールとかするならローカルのMirrorレポジトリを使おう。
- reposyncとか使うと簡単にMirrorが作れて良い。
- 複数パッケージのインストールはwith_itemsを使って一つのトランザクションにしよう。
forksで並列度を設定する
- 同時にAnsibleのタスクが走るのはforksで決まる。
- デフォルトは5だけど保守的なので増やした方が良い。50とかでも良いし、500以上にしてるケースもある。
- Ansible1.3からはどんなに増やしても設定対象ノード数を超えることはない。
- local_actionとかがあると詰まるから別のplaybookにする等しよう。
- ちなみにforksの設定は以下のどこかに書く。
- ANSIBLE_CONFIG (環境変数)
- ansible.cfg (カレントディレクトリ)
- .ansible.cfg (ホームディレクトリ)
- /etc/ansible/ansible.cfg
- forksを絞るケースはローリングアップデートするときとかがある
sshを速くしよう
OpenSSH
- デフォルトだとネイティブなOpenSSHでControlPersistを使って接続する。
- ControlPersistはこの辺が参考になります。
- ControlPersistソケットはファイルシステム上にソケットファイルが書かれるけど、ホスト名とかが長いとLinuxのファイルパスの長さの制約(大体108文字)に引っ掛かるのでcontrol_path変数で変える。
- 設定可能なタイムアウト値でAnsibleのコネクションを開きっぱなしにできる。
- デフォルトは60秒だけど、増やした方が良い。30分くらいが適切。
- ただし1コネクションあたり1MBくらいメモリ使うから気をつけよう。
- pipeliningを有効にすると倍速くらいにはなるので有効にしょう。
- デフォルトで有効になってないのは、全ての設定対象ノード上で/etc/sudoerのrequirettyをオフにしないとsudo操作するときに問題になるから。
paramiko
- EL6以前のOSからAnsibleを実行するとOpenSSHじゃなくてpure-pythonのSSHクライアントであるparamiko使う。
- paramiko使うときはアクションのたびに各ホストに再接続してしまう。
- これを防ぐにはaccelerated modeを使うと良いって書いてあるけどリンク先見るとpipelining使った方がよさ気なことが書かれてる。
pull mode
- ここまでのことをやっておけばいらないと思うけど、ansible-pullを使うのも良い。
- ansbile-pullはgitレポジトリのファイルを各ノードが定期的に読みに行って処理を実行するモードで、通常のpush型からpull型のアーキテクチャになるのでいくらでもスケールできる。
- ただし、ログの集約ができなくなるので、そんなときはAnsibleTowerを使おう。
こんな感じです。間違ってたらご指摘いただければと思います。
実際に試して計測したらどれくらい変わったか数字載せるかもです。