今年の夏ぐらいからChefあらAnsibleに乗り換えてまあまあ使ってきました。 Chefと比較した場合のAnsibleの利点として、エージェントレスで動作するということが挙げられます。
このエージェントレスでの動作ですが、簡単に言うと毎回SSH(他のプロトコルも利用可能)でアクセスして接続先のホストでコマンドを発行して任意の操作を実行しているわけです。
しかし、タスクごとに毎回SSHのセッションを張るのでタスクが多くなってくると意外と遅い。
そこで設定transport=smart
の出番です。というかこれデフォルトだとsmart
らしい。
まずSSHのControlPersistについて軽く説明。
ControlePersistはOpenSSHの5.6から搭載された機能で、SSHの多重化接続の永続化をしてくれる機能らしい。
つまり、ControlPersistで指定した場合、永続化されたセッションを使うのでアクセスが早くなるという仕組みになっている。
また、ControlPersistはタムアウト設定を指定することも可能なので1m
とすると1分間アクセスがない場合は自動的にセッションが切れる。
で、話をtransport=smart
に戻す。
transport=smart
はSSHのControlPersistが利用可能(OpenSSH 5.6以降)な場合はOpenSSHを利用し、ControlPersistが使えない場合はPythonのSSHライブラリであるparamiko
を使うという設定らしい。
まぁ、実を言うとOpenSSH 5.6以降がデフォルトで入ってるのはEnterprise Linux 6というかRHELの6とかCentOSの6なんでそれ以外だとControlPersistが有効になっているはず。 それでも遅いなと思う人や1分以上処理に時間が掛かる(パッケージインストール等)をする人は、設定ファイルのssh_argsで以下のように設定すると幸せになれるかも。
ssh_args = -o ControlMaster=auto -o ControlPersist=30m
公式的には30分がおすすめらしい。
結論
- 設定ファイルに
transport=smart
を明示しなくてもデフォルトでsmart
が適用されている - OpenSSH 5.6以上を使うとAnsibleのタスクが早くなる
- Enterprise Linux 6(RHEL6, CentOS6)はデフォルトだとOpenSSH 5.6以下なので自力で何とかする
- 処理に時間が掛かるタスクがある場合は
ssh_args
でControlPersist=30m
を設定しておく