「初めてのAnsible」を読み進めながらのメモ
前掲
初めてのAnsible(1章:イントロダクション)
初めてのAnsible(2章:Playbook:始めてみよう)
初めてのAnsible(3章:インベントリ:サーバーの記述)
初めてのAnsible(4章:変数とファクト)
初めてのAnsible(7章:複雑なPlaybook)
初めてのAnsible(8章:ロール:プレイブックのスケールアップ)
SSHマルチプレキシング
- 同一ホストへの複数のSSHセッションで同じTCP接続を共有
- ホストへのSSH接続の度に行うTCP接続のネゴシエーションを一度だけに
- AnsibleはSSHプレキシングを デフォルトで有効化
マルチプレキシング有効化時のSSHの動作
- あるホストへの初回のSSH接続の際に、OpenSSHはマスターの接続を開始
- OpenSSHは接続先のリモートホストに関連づけられたUnixのドメインソケット(コントロールソケット)を生成
- ホストへの次回接続時に、OpenSSHはコントロールソケットを利用して通信
Ansibleでのマルチプレキシングオプション
オプション | デフォルト値 |
---|---|
ControlMaster | auto |
ControlPath | $HOME/.ansible/cp/ansible-ssh-%h-%p-%r |
ControlPersist | 60s |
- ControlMaster: auto で SSHプレキシングを有効化
- ControlPath: ファイルシステム上のコントロールUnixドメインソケットファイルの置き場所
-
%h
:ターゲットホスト名,%p
:ポート番号,%r
:リモートログインするユーザ名 - ControlPathが長すぎる場合、OSによってUnixドメインソケットのパス最大長が設定されていないためにマルチプレキシングが効かないことがある
-
- ControlPersist: マスター接続が維持される時間
パイプライン
- タスク実行時Ansibleによって生成されたPythonスクリプトをホストにコピーするのではなく、SSHのセッションにパイプして実行
- Ansibleによって使うセッションが2つではなく、1つになる
- デフォルトではパイプラインは無効
- 有効化の設定は
ansible.cfg
に以下のような記述をすればよい
ansible.cfg
[defaults]
pipelining = True
ホスト側の設定
- ホストの
/etc/sudoers
ファイルで requiretty が有効になっていないことを確認- requiretty が有効になっていると、playbookの実行時にエラーがはかれる
設定は下記などを参考に
ファクトのキャッシュ
- Ansibleのファクト収集を各ホストにつき一度だけに設定することで、キャッシュの有効期限内であれば以降のplaybookの実行ではキャッシュ中のファクトを見てくれる
ansible.cfg
に以下の設定を記述すればよい
[defaults]
gathering = smart
fact_caching_timeout = 3600
# 以下のいずれか
# JSONファイル
fact_caching = jsonfile
fact_caching_connection = /tmp/ansible_fact_cache
# Redis
fact_caching = redis
# Memcached
fact_caching = memcached
-
gathering = smart
: 収集対象のファクトがキャッシュされていない場合、キャッシュの有効期限が切れている場合にのみファクトを収集する -
fact_caching_timeout = 3600
: キャッシュのタイムアウトを3600秒(=1時間)に設定 -
fact_caching
: JSONファイル / Redis / Memcached のいずれかが利用可能- JSONファイル:
fact_caching_connection
でJSONファイルを書き込むディレクトリを指定 - Redis: コントロールマシン上にPythonのRedisパッケージが必要
- Memcached: コントロールマシン上にPythonのMemcachedパッケージが必要
- JSONファイル:
並列処理
- Ansibleはホスト群に並列にSSH接続しタスクを実行するが、デフォルトではその並列度は 5 にとどまる
ansible.cfg
に以下の設定を記述すればよい
[defaults]
forks = 10
-
forks
オプションで並列に接続するホスト数を指定する