LoginSignup
16
17

More than 1 year has passed since last update.

初めてのAnsible(9章:Ansibleの高速化)

Last updated at Posted at 2016-11-20

「初めてのAnsible」を読み進めながらのメモ

前掲
初めてのAnsible(1章:イントロダクション)
初めてのAnsible(2章:Playbook:始めてみよう)
初めてのAnsible(3章:インベントリ:サーバーの記述)
初めてのAnsible(4章:変数とファクト)
初めてのAnsible(7章:複雑なPlaybook)
初めてのAnsible(8章:ロール:プレイブックのスケールアップ)

SSHマルチプレキシング

  • 同一ホストへの複数のSSHセッションで同じTCP接続を共有
    • ホストへのSSH接続の度に行うTCP接続のネゴシエーションを一度だけに
  • AnsibleはSSHプレキシングを デフォルトで有効化

マルチプレキシング有効化時のSSHの動作

  1. あるホストへの初回のSSH接続の際に、OpenSSHはマスターの接続を開始
  2. OpenSSHは接続先のリモートホストに関連づけられたUnixのドメインソケット(コントロールソケット)を生成
  3. ホストへの次回接続時に、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の実行時にエラーがはかれる

設定は下記などを参考に

rootだけtty無しのsudoを許可

ファクトのキャッシュ

  • 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パッケージが必要

並列処理

  • Ansibleはホスト群に並列にSSH接続しタスクを実行するが、デフォルトではその並列度は 5 にとどまる

ansible.cfgに以下の設定を記述すればよい

[defaults]
forks = 10
  • forksオプションで並列に接続するホスト数を指定する
16
17
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
17